起步软件技术论坛
搜索
 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 8728|回复: 17

[处理中3] 关于如何获取iframe跳转后的URL 其他社区已有了解决方案,...

  [复制链接]

2

主题

13

帖子

29

积分

新手上路

Rank: 1

积分
29
QQ
发表于 2016-12-24 11:57:20 | 显示全部楼层 |阅读模式
本帖最后由 elhoog 于 2016-12-26 09:21 编辑

今天在APICloud论坛发现一个获取框架跳转后URL的方案,wex5是否有类似函数,或者是否可以开发类似函数出来?
以下是他们的解决方案:
http://community.apicloud.com/bbs/forum.php?mod=viewthread&tid=14450
这个方法结合了 api.execScript、 api.sendEvent 以及 api.addEventListener。

步骤如下:
1. 在主页面中监听 getUrl 事件,并通过 api.openFrame 打开外部页面(此处是百度);
    apiready = function() {
        var header = $api.byId("header");
        $api.fixIos7Bar(header);
        var headerPos = $api.offset(header);

        api.addEventListener({
            name: 'getUrl'
        }, function(ret, err) {
            if(ret && ret.value){
                var value = ret.value;
                api.alert({msg: value.location});
            }            
        });

        api.openFrame({
            name: 'baidu',
            url: 'http://www.baidu.com',
            rect: {
                x: 0,
                y: headerPos.h,
                w: 'auto',
                h: 'auto'
            }
        });
    };
复制代码

2. 等页面加载完毕,点击主页面的 “获取 url” 的按钮,触发 getFrameUrl 方法
<button class="action" tapmode>获取url</button>
复制代码
function getFrameUrl() {
        var script = "api.sendEvent({name: 'getUrl', extra: {location: window.location}});";

        api.execScript({
            frameName: 'baidu',
            script: script
        });        
    }
复制代码
该方法使用 api.execScript 在打开的页面中执行
"api.sendEvent({name: 'getUrl', extra: {location: window.location}});"
复制代码
从而,将页面的 locaction 信息通过 getUrl 事件发送了出去。

3. 主页面监听到了getUrl 事件,于是我们就获得了外部页面的 location 信息(location.url 包含了 url 信息)。

需要注意的是:
在初次打开页面的时候,需要等待 APICloud 的 api 加载完毕。
如果在打开页面的时候,立即点击 “获取 url” 的话,由于此时 api 不存在,是得不到所需要的信息的。

最后,完整的示例代码如下:
<!DOCTYPE HTML>
<html>
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="maximum-scale=1.0,minimum-scale=1.0,user-scalable=0,width=device-width,initial-scale=1.0"/>
    <title>test</title>
    <link rel="stylesheet" type="text/css" href="../css/api.css">
    <style>
        #header {
            height: 44px;            
            line-height: 44px;         
            background-color: green;
            position: relative;
        }
        .back {
            background-color: white;
            display: inline-block;
            margin-left: 10px;         
            padding: 5px 10px;
        }
        .action {                     
            background-color: white;            
            margin: 10px 10px 0 0;
            padding: 5px 10px;
            float: right;
        }
    </style>
</head>
<body>
    <div id="header">
        <button class="back" tapmode>返回</button>
        <button class="action" tapmode>获取url</button>
    </div>
</body>
<script type="text/javascript" src="../script/api.js"></script>
<script type="text/javascript">
    apiready = function() {
        var header = $api.byId("header");
        $api.fixIos7Bar(header);
        var headerPos = $api.offset(header);

        api.addEventListener({
            name: 'getUrl'
        }, function(ret, err) {
            if(ret && ret.value){
                var value = ret.value;
                api.alert({msg: value.location});
            }            
        });

        api.openFrame({
            name: 'baidu',
            url: 'http://www.baidu.com',
            rect: {
                x: 0,
                y: headerPos.h,
                w: 'auto',
                h: 'auto'
            }
        });
    };

    function getFrameUrl() {
        var script = "api.sendEvent({name: 'getUrl', extra: {location: window.location}});";

        api.execScript({
            frameName: 'baidu',
            script: script
        });        
    }
</script>
</html>
复制代码

1

主题

6163

帖子

2095

积分

金牌会员

Rank: 6Rank: 6

积分
2095
QQ
发表于 2016-12-24 17:11:46 | 显示全部楼层
楼主  你是个好人   加油
回复 支持 反对

使用道具 举报

2

主题

13

帖子

29

积分

新手上路

Rank: 1

积分
29
QQ
 楼主| 发表于 2016-12-26 09:11:35 | 显示全部楼层
半导体 发表于 2016-12-24 17:11
楼主  你是个好人   加油

官方不能开发这样一个函数吗
回复 支持 反对

使用道具 举报

发表于 2016-12-26 11:33:49 | 显示全部楼层
请问你想实现什么能力呢??
在WeX5 中建议使用KO绑定实现!
绑定一个data字段或者KO对象!
iframe 中使用bind-attr-src属性绑定 KO对象的值!
如果想让iframe自动变化!只需要修改KO对象的值即可!

其他任何想显示这个url的地方也是一样的,只需要绑定KO对象的值就可以了!
qq:1912779713
WeX5教程--WeX5下载
回复 支持 反对

使用道具 举报

2

主题

13

帖子

29

积分

新手上路

Rank: 1

积分
29
QQ
 楼主| 发表于 2016-12-26 17:05:48 | 显示全部楼层
liangyongfei 发表于 2016-12-26 11:33
请问你想实现什么能力呢??
在WeX5 中建议使用KO绑定实现!
绑定一个data字段或者KO对象!

获取外部网页的URL

然后就可以分享,复制等等用途

对于外网链接,由于没有确定性,根本不知道用户要点哪个链接,所以根本没办法指定打开的链接
回复 支持 反对

使用道具 举报

发表于 2016-12-26 17:14:53 | 显示全部楼层
elhoog 发表于 2016-12-26 17:05
获取外部网页的URL

然后就可以分享,复制等等用途

wex5 页面 是单页应用!如果想在页面中显示外部网页,单页可以使用iframe ,多页建议使用浏览器打开!
http://docs.wex5.com/wex5-app-question-list-2012/

不建议在app中直接打开外部网站
qq:1912779713
WeX5教程--WeX5下载
回复 支持 反对

使用道具 举报

2

主题

13

帖子

29

积分

新手上路

Rank: 1

积分
29
QQ
 楼主| 发表于 2016-12-27 08:48:11 | 显示全部楼层
本帖最后由 elhoog 于 2016-12-27 08:53 编辑
liangyongfei 发表于 2016-12-26 17:14
wex5 页面 是单页应用!如果想在页面中显示外部网页,单页可以使用iframe ,多页建议使用浏览器打开!
ht ...

iframe 由于跨域问题获取不到网页信息
window.open打开的网页已不属于APP控制范

还是无法实现我的需求
回复 支持 反对

使用道具 举报

发表于 2016-12-27 10:59:52 | 显示全部楼层
elhoog 发表于 2016-12-27 08:48
iframe 由于跨域问题获取不到网页信息
window.open打开的网页已不属于APP控制范

iframe  可以访问w代码!
http://docs.wex5.com/wex5-ui-question-list-2012/
qq:1912779713
WeX5教程--WeX5下载
回复 支持 反对

使用道具 举报

2

主题

13

帖子

29

积分

新手上路

Rank: 1

积分
29
QQ
 楼主| 发表于 2016-12-27 15:53:10 | 显示全部楼层
liangyongfei 发表于 2016-12-27 10:59
iframe  可以访问w代码!
http://docs.wex5.com/wex5-ui-question-list-2012/

。。。。。。
无奈了,啥也不说了。。。
回复 支持 反对

使用道具 举报

发表于 2016-12-27 16:00:28 | 显示全部楼层
elhoog 发表于 2016-12-27 15:53
。。。。。。
无奈了,啥也不说了。。。

可能我理解错了!
你的意思是在APP中打开一个外边的网站,并且有事件处理获取网站的信息是吧!
应该没提供过这样的机制!但是既然打开它,代码中肯定能获取到的!只是没提供事件而已
qq:1912779713
WeX5教程--WeX5下载
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|X3技术论坛|Justep Inc.    

GMT+8, 2025-4-5 09:08 , Processed in 0.056444 second(s), 23 queries .

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表