【问题标题】:Android - how to intercept links inside iframe(webview) and check it is fully loaded or notAndroid - 如何拦截 iframe(webview) 中的链接并检查它是否已完全加载
【发布时间】:2015-07-21 16:29:10
【问题描述】:

我正在加载使用 ionic 在 android 的 webview 中创建的 www 文件夹。在 webview 内部我使用 iframe 加载一些 html。一切正常,但无法拦截 iframe 内的超链接,无法检查它是否是否已满载。

这是我的活动代码,

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    activity = MainActivity.this;
     webview=(WebView) findViewById(R.id.webView1);
     webViewConfiguration();
     setWebViewListner();
     webview.setBackgroundColor(0x00000000);
}

private void setWebViewListner() {
    webview.setWebViewClient(new WebViewClient(){   

        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {


            if(url.startsWith("tel://")) {
                Tel=url.replace("//", "");
                Log.d("*** url with removed // ***",Tel);
                Intent intent = new Intent(Intent.ACTION_DIAL);
                intent.setData(Uri.parse(Tel));
                startActivity(intent); 
                return true;
            }
            else
             return false;
        }

        public void onPageFinished(WebView view, String url) {
           webview.loadUrl("javascript:invokeController("+true+")");
           Log.d("*** on page finished ***",url);


        }
    });
}
private void webViewConfiguration() {
    WebSettings webSettings = webview.getSettings();
     webSettings.setJavaScriptEnabled(true);
     webSettings.setDomStorageEnabled(true);
     webSettings.setAllowFileAccess(true);
     webview.addJavascriptInterface(this, "javaScriptToJava");
     webSettings.setJavaScriptCanOpenWindowsAutomatically(true);
        if(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN) {
            webSettings.setAllowFileAccessFromFileURLs(true);
            webSettings.setAllowUniversalAccessFromFileURLs(true);
        }

        webview.loadUrl(Url);
}
@JavascriptInterface
public void nativeBackButton() {
    finish();
}
@JavascriptInterface
public void keyBoardClose(){
    if (imm!=null) {
        imm.hideSoftInputFromWindow(activity.getCurrentFocus().getWindowToken(), 0);
    }
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if(event.getAction() == KeyEvent.ACTION_DOWN){
        switch(keyCode)
        {
        case KeyEvent.KEYCODE_BACK:
            webview.loadUrl("javascript:callBackIonic()");
            return true;
        }
    }
    return super.onKeyDown(keyCode, event);
    }
}

如果 iframe 中的 href 链接是 tel://../../ 或 file:///android_asset/../../ 会触发shouldOverrideUrlLoading,但如果它是 http 则不会触发请求。

我想为 iframe 中按下的每个链接放置一个加载器。

谁能说是否有办法在 webview 的 iframe 中处理 http 超链接。

编辑: 我使用 ng-bind-html/ng-include 替换了我的 html 中的 iframe,我也能够拦截链接和 onPageFinished 函数。但是如果我使用 ng-bind-html/,则不应用样式和其他一些东西ng-包括。如何在 iFrame 的帮助下使其工作。为什么在 webview 中使用 iframe 不会调用 shouldoverrideurlloading。

【问题讨论】:

    标签: javascript android html iframe webview


    【解决方案1】:

    使用 WebViewClient 的 shouldInterceptRequest。您可以拦截 iframe 源。

    API level 11
    @Override
    public WebResourceResponse shouldInterceptRequest(WebView view, String url){
        return super.shouldInterceptRequest(view, url);
    }
    
    API level 21
    @Override
    public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) 
    {
        return super.shouldInterceptRequest(view, request);
    }
    

    【讨论】:

      猜你喜欢
      • 2014-11-29
      • 2012-01-07
      • 1970-01-01
      • 1970-01-01
      • 2012-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多