Android Appcelerator从webview中的远程URL获取URL,并在设备默认浏览器或新的webview中打开它

时间:2016-03-05 01:03:08

标签: android url webview appcelerator appcelerator-titanium

我的问题与此问题完全相同,但对于Android而非iOS。

Get URL from remote URL in webview and open it in safari

任何人都有自己的想法。我正在创建一个跨平台的应用程序,我已经使用了克莱顿的答案,让它适用于iOS,并通过控制器打开一些调整。但是当在Android上尝试不同的方法时,它无法正常工作。这跟我一样接近(这是Aaron在同一页面上提供的)并且它不太正确,因为它在新的浏览器窗口中打开远程网页以及应用程序webview:

$.floorView.addEventListener('load', function(e) {
    if (e.url.indexOf("http") !== -1) {
         // stop the event
         e.bubble = false;

         // stop the url from loading
         $.floorView.stopLoading();

         // open 
        Ti.Platform.openURL(e.url);
    }
});

谢谢!

3 个答案:

答案 0 :(得分:0)

我会听beforeload事件,虽然我不能100%确定你是否真的可以阻止Webview继续加载。

另一种方法是通过JS加载或注入(evalJS())在网页中拦截这些链接。然后触发Ti.App事件并在Titanium中响应它。

答案 1 :(得分:0)

我想我可能已经弄明白了。感谢那些想法和建议导致这段代码的人。

它似乎在iOS和Android上正常运行。你们有任何建议或问题我会很感激反馈。谢谢!

if ("iOS") {    
$.webView.addEventListener('beforeload', function(e) {
    if (e.navigationType == Titanium.UI.iOS.WEBVIEW_NAVIGATIONTYPE_LINK_CLICKED) {
       // stop the event
        e.bubble = false;
       // stop the url from loading
       $.webView.stopLoading();
       //opens up the clicked URL for bill in new webView
        var link = e.url;
        var args = {url: link,};
        // open link in my default webView for iOS
        var newWebView=Alloy.createController('defaultWebView', args).getView();
        newWebView.open();
    }
});
}
else if ("Android") {
$.webView.addEventListener('beforeload', function(e) {
    if (e.url.indexOf("http") !== -1) {
        function Parser(text) {
            var html = text;
            var urlRegex = /((http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?)/gi;
            this.getHTML = function() {
                return html;
             };   
        } // end Parser
        var parser = new Parser(e.url);
        html = parser.getHTML();     
        if (html != "url of $.webView") {
            // stop it from loding in current webView
            $.webView.stopLoading();    
            // open link in browser
            Ti.Platform.openURL(html);
        }
    }
});
}       
else {
.....................
}

答案 2 :(得分:0)

Titanium.UI.Webview具有用于拦截链接的特定属性:onlink

这不是作为事件实现的,因为它是回调,并且需要返回一个布尔值以告知Webview是否加载链接的URL。

奇怪的是,立即设置onlink回调会使URL立即加载到Safari中,所以我这样做是这样的:

$.webview.addEventListener('load', function(e) {
    $.webview.onlink = function(e) {
        Ti.Platform.openURL(e.url);
        return false;
    };
});

您当然可以检查e.url字符串并决定是在内部还是在外部打开它。