【问题标题】:Android webview SKIPS javascript even with setJavascriptEnabled(true) and WebChromeClientAndroid webview SKIPS javascript 即使使用 setJavascriptEnabled(true) 和 WebChromeClient
【发布时间】:2011-10-20 11:15:16
【问题描述】:

(使用三星 Galaxy Tab 和 Android 3.0,这适用于每台 3.0+ 平板电脑,就像在他们的浏览器中一样,只是不是 webview)

我有一个带有 CSS 和 jQuery 的页面,可以在浏览器、android 浏览器和 iOS 设备中正常加载,但 android webview 拒绝始终加载它。

我已经将问题缩小到它只是在加载时跳过 javascript(通过使用一些 webview javascript 演示应用程序复制问题)。这是为什么呢?

这是完整的测试 HTML 代码 http://pastebin.com/GmE2vEYx

我是这样称呼它的:

  myWebview.loadUrl("file:///android_asset/myPage.html");
  myWebview.getSettings().setJavaScriptEnabled(true);
  myWebview.setWebChromeClient(new WebChromeClient());

这三个调用的顺序不会影响结果。

  myWebview.getSettings().setJavaScriptEnabled(true);
  myWebview.setWebChromeClient(new WebChromeClient());
  myWebview.loadUrl("file:///android_asset/myPage.html");

我注意到的一件事是,如果您给它时间(通过在调试器中使用断点暂停应用程序),那么 javascript 将更加一致地加载。这让我做了一些牵强附会的实验,试图让应用程序加载速度变慢,但这确实不是用户想要的体验。我真的希望 Android webview 真的不是移动开发的 IE6。

其他事实:

如果您删除包含所有 Jquery 的 <script> 标记,则页面会以所有 CSS 格式快速加载。一旦添加了 Jquery,就什么都没有加载。

我还发现了其他几个遇到完全相同问题的问题,许多问题没有得到解答,或者对 OP 所寻求的内容没有确凿的答案:(

见: Android: can't get javascript to work on WebView even with setJavaScriptEnabled(true)

Page reload (Webview.loadUrl) results in Javascript not being (fully) processed

http://groups.google.com/group/android-developers/browse_thread/thread/9962064ef217a5a7#

JavaScript sometimes doesn't work in android's webview

Android WebView not loading a JavaScript file, but Android Browser loads it fine

Android's Webview cannot handle javascript?

建议?让我们深入了解这一点! android 文档说 webview 有限制,但我不知道那个限制在哪里,因为人们一直在制作 HTML CSS JS 应用程序!

【问题讨论】:

  • 如果 JS 有错误应该显示在 adb logcat 中,带有标签“Web Console”或“WebCore”。您在页面上看到任何 JS 错误吗?

标签: javascript android function webview code-injection


【解决方案1】:

很久以前我遇到了同样的问题——我的最终解决方案是放弃 jquery 并只使用普通 JS。从普通的 Android 浏览器查看时,事情总是在正常工作时出现问题。

如果这些是破坏代码的唯一行,请尝试使用纯 JS 重现这些行的相同功能。 Android 的原生 webview 对所有最新的 JS 好东西都有很好的支持,

所以……

$('body').css({height : height+'px', width : Math.floor(width*0.98)+'px' });
$('.text').css({height : height+'px', width : Math.floor(width*0.98)+'px' }); 
$('#firstpage').css({height : height+'px', width : Math.floor(width*0.98)+'px' }); 
$('body').prepend('<style>.text{-moz-column-count:'+numCols+';-webkit-column-count:'+numCols+';}</style>'); 

会...

var doc = document,
    body = doc.getElementsByTagName('body')[0],
    bodyStyle = body.style,
    firstPage = doc.getElementById('firstpage'),
    firstPageStyle = firstPage.style,

    head = doc.getElementsByTagName('head')[0],
    style = doc.createElement('style'),
    rules = doc.createTextNode('.text{-webkit-column-count:'+numCols+';}');

bodyStyle.height = height + 'px';
bodyStyle.width = Math.floor(width * 0.98) + 'px';

firstPageStyle.height = height + 'px';
bodyStyle.width = Math.floor(width * 0.98) + 'px';

style.type = 'text/css';

if( style.styleSheet )
    style.styleSheet.cssText = rules.nodeValue;
else 
    style.appendChild( rules );

head.appendChild( style );

只要确保上面的代码在所有使用的元素都加载之后运行(在 DOM 就绪状态之后,或者在标签关闭之前)

ps。另外,既然您使用的是 Android 的 webkit - 为什么需要 -moz-column-count?

【讨论】:

  • 你能详细说明这个语法应该如何工作吗?在 jslint.com 上一切都失败了。我的原始代码有$(document).ready(function(){....});,我相信你的js版本在这个函数中,但如果我切换到完全js,那么我认为我的函数“声明”现在会有所不同
  • $(document).ready(function(){....});几乎可以确保包含在 ready 函数的匿名回调中的代码将在 DOM 加载后运行。通过在 body 标记关闭之前添加脚本可以达到相同的效果。只要设置了“宽度”变量,我共享的代码应该 100% 正确地包含在准备好的文档中,因为这些是唯一的“缺失”值。我刚刚将您发布的 jQuery 代码翻译成常规 JS。
  • 至于 jslint,“第 22 行字符 5 处的问题:在 'else' 和 'style' 之间需要一个空格。”和“第 21 行字符 1 处的问题:在第 5 列而不是第 1 列应为 'else'。”大多数情况下,简单的识别错误很容易纠正。唯一的“危险”是“宽度”变量,我相信它已经在您现有的代码中声明,所以那里应该没有问题:)
【解决方案2】:

答案是javascript需要在HTML页面&lt;script&gt;sections内的函数中,然后需要注入 webview.loadUrl("javascript:yourJavascriptFunction()") after webview.setWebviewClient(new WebviewClient(){ public void onPageFinishedLoading(){ ...//js injections here });

【讨论】:

    【解决方案3】:

    我也有三星 Galaxy Tab 和带有 jQ​​uery javascript 网页的 Android 3.0,它可以工作。确保您的页面在 Crome 浏览器中运行,并且您没有 javascript 错误。一些 CSS3 样式存在已知问题(例如图像消失),但 jQuery 应该可以工作。如果您尝试与 javascript 通信,请确保在页面加载后进行。确保所有文件都在正确的目录中:)。此外,有时内容会被缓存,因此请尝试将其删除(或删除应用程序)。

    请提供您网页的源代码,以便我们检查。

    示例网页视图:

    webView = (WebView) findViewById(R.id.webview);
    
    WebSettings webSettings = webView.getSettings();
    webSettings.setJavaScriptEnabled(true);
    webSettings.setPluginsEnabled(true);
    webSettings.setLoadsImagesAutomatically(true);
    webSettings.setSupportZoom(false);
    
    webView.setScrollBarStyle(WebView.SCROLLBARS_INSIDE_OVERLAY);
    webView.setWebViewClient(new WebViewClient()
    {
        @Override
        public void onPageFinished(WebView view, String url) 
        {
            // page loaded...
            super.onPageFinished(view, url);
        }
    });
    webView.setWebChromeClient(new WebChromeClient()
    {
        @Override
        public boolean onJsAlert(WebView view, String url, String message,JsResult result) 
        {
            Log.e("alert triggered", message);
            return false;         
        }
    });
    webView.loadUrl("http://mypage/mypage.html");
    

    希望对你有帮助。

    更新1: 我在三星 Galaxy 选项卡上测试了您的代码。我变了

    <script type="text/javascript" src="http://code.jquery.com/jquery-1.6.2.min.js"></script>
    

    线。页面加载完毕,我可以看到带有图片的内容。所以......代码按预期工作。 我注意到有时内容没有按应有的方式显示。似乎缩放是问题:

    <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, user-scalable=no" />
    

    $(document).ready() 里面的计算是假的!

    顺便说一句...您正在寻找的是带有 WebViews 的 ViewPager。

    更新2: 另请注意,在将网页加载为 file:/// 时,您必须将 JS 文件放在同一目录中(没有外部 URL)。

    【讨论】:

    • 好的,我已经把它缩小到只有几行 $('body').css({height : height+'px', width : Math.floor(width*0.98)+'px' }); $('.text').css({height : height+'px', width : Math.floor(width*0.98)+'px' }); $('#firstpage').css({height : height+'px', width : Math.floor(width*0.98)+'px' }); $('body').prepend('&lt;style&gt;.text{-moz-column-count:'+numCols+';-webkit-column-count:'+numCols+';}&lt;/style&gt;'); 没有这些,整个事情都很好,但这些行很重要,所以我会寻找更好的方法来做同样的事情(它将页面动态地放入列中)
    • 嘿...你能提供一个网址吗?你在克罗姆检查过吗?你有任何错误吗?你如何加载 jQuery(在哪里)?
    • 该 URL 在 pastebin 中提供,您必须在自己的机器上进行测试。 JQuery 是从 assets 文件夹本地加载的,我确认这是可行的,因为滑动功能确实有效。已在 Chrome 中检查,没有错误
    • 你是什么意思文档里面的计算是假的?哪一个?另外,元标记到底去哪里了?在脚本标签上方或下方(我没有得到不同的结果)。你能详细说明 ViewPager 和 webviews 吗???
    【解决方案4】:

    我不完全确定这是否是您的问题的原因,但您应该在设置 WebView

    之后致电 loadUrl

    编辑

    如果这不是问题,您可以考虑发布

    • 你发现最简单的SSCCE 不起作用,但你觉得应该这样做
    • 您设备的品牌/型号以及您使用的 Android 版本

    【讨论】:

    • @RD 没有您的实际代码,任何人都很难尝试回答。此外,发布您正在使用的设备的品牌/型号可能会得到以前遇到过设备特定问题的人的建议。
    • 三星 Galaxy 选项卡,但最好是所有 Honeycomb 3.0+ 设备
    猜你喜欢
    • 2011-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-08
    • 1970-01-01
    • 1970-01-01
    • 2018-07-26
    • 1970-01-01
    相关资源
    最近更新 更多