当我将 html 数据从字符串加载到 webview 时,Jquery 功能不起作用
Posted
技术标签:
【中文标题】当我将 html 数据从字符串加载到 webview 时,Jquery 功能不起作用【英文标题】:Jquery functionalities are not working when i load the html data from a string into webview 【发布时间】:2015-08-09 02:00:07 【问题描述】:我正在开发一个应用程序,其中 webview 加载来自服务器的字符串形式的 html 数据。实际上显示 webview 中的 html 字符串工作正常,但如果该数据中有任何图像则需要很长时间。所以,在这种情况下,我认为惰性加载器会很好。
对于这个延迟加载,我们在 html 字符串中使用 jquery 函数。当我尝试运行它时,它给了我以下安全异常
I/chromium(4434): [INFO:CONSOLE(3)] "Uncaught SecurityError: Failed to execute 'replaceState' on 'History': URL 'about:/blank' 的历史状态对象不能在来源为 'null' 的文档。”,来源:https://ajax.googleapis.com/ajax/libs/jquerymobile/1.4.5/jquery.mobile.min.js (3)
但是当我尝试从本地资产运行时,一切正常。
下面的字符串是我试图加载到 webview 中的 html 数据。
<html lang=\ "hi\">\r\n
<head>\r\n
<meta http-equiv=\ "Content-Language\" content=\ "hi\">\r\n
<meta http-equiv=\ "Content-Type\" content=\ "text/html; charset=UTF-8\">\r\n
<meta name=\ "viewport\" content=\ "width=device-width, initial-scale=1\">\r\n
<script type=\ "text/javascript\" src=\ "https://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js\"></script>\r\n
<script type=\ "text/javascript\" src=\ "https://ajax.googleapis.com/ajax/libs/jquerymobile/1.4.5/jquery.mobile.min.js\"></script>\r\n
<script type=\ "text/javascript\" src=\ "https://cdnjs.cloudflare.com/ajax/libs/jquery.lazyload/1.9.1/jquery.lazyload.js\"></script>\r\n
<link href='http://fonts.googleapis.com/css?family=Open+Sans+Condensed:light&v1' rel='stylesheet' type='text/css'>\r\n</head>\r\n
<style>
\r\nhtml,
body,
div
\r\n\tmargin: 0;
\r\n\tpadding: 0;
\r\n
\r\nimg
\r\n width: 45.22%;
\r\n height: 89%;
\r\n vertical-align: top;
\r\n \tmargin-top: 3.1%;
\r\n \tmargin-bottom: 3.1%;
\r\n margin-left: 3.1%;
\r\n margin-right: 1%;
\r\n
\r\n.content
\r\n\theight: 100%;
\r\n\twidth: 100%;
\r\n\toverflow: auto;
\r\n\tposition: relative;
\r\n\tbackground-size: 100% 100%;
\r\n\tbackground-repeat: no-repeat;
\r\n
\r\nbutton
\r\n\t width: 35%;
\r\n\t padding: 1px;
\r\n\t vertical-align: middle;
\r\n\t float: middle;
\r\n\t border: none;
background: none;
\r\n
\r\n#div2
\r\n width: 88%;
\r\n height: 70%;
\r\n margin-top: 7%;
\r\n overflow: hidden;
\r\n text-overflow: ellipsis;
\r\n
\r\n#div3
\r\n width: 91%;
\r\n height: 52%;
\r\n margin-left: 4%;
\r\n overflow: hidden;
\r\n text-overflow: ellipsis;
\r\n
\r\n#btn
\r\n\twidth: 20%;
\r\n\theight: 6%;
\r\n\tvertical-align: middle;
\r\n
\r\n#btn1
\r\n\twidth: 30%;
\r\n\theight: 6%;
\r\n\tvertical-align: middle;
\r\n
\r\n#btn2
\r\n\twidth: 37%;
\r\n\theight: 6%;
\r\n\tvertical-align: middle;
\r\n
\r\n#botrigh
\r\n width: 50%;
\r\n\tposition: absolute;
\r\n bottom: 5%;
\r\n right: 1%;
\r\n
\r\n#botrighimg
\r\n width: 50%;
\r\n\tposition: absolute;
\r\n bottom: 7%;
\r\n right: 1%;
\r\n
\r\n.heading
\r\n font-family: \"Open Sans Condensed Light\" ;\r\n\r\n.cardcontent\r\n font-family:\"Open Sans Condensed Light\" ;\r\n\r\n
</style>\r\n
<body onload=\ "resize()\" style=\ "-webkit-transform: translate3d(0,0,0);\">
<!-- CARD ONE Image and Text-->\r\n
<div id=\ "deckid\" class=\ "content\" style=\ "background-image: url('file:///android_asset/feed_card_6.png');\">\r\n
<div id=\ "deckid\" class=\ "deckid\"></div>
<div id=\ "cardid\" class=\ "cardid\"></div>\r\n<img class=\ "lazy\" data-original=\ "file:///android_asset/polio.jpg\"/>\r\n
<div style=\ "display:inline-block;width:48%;margin-right:1%\">\r\n
<div class=\ "openFullcard\">\r\n
<div id=\ "div2\"><font size=\ "3%\" style=\ "color:#F993CD;\"><span class=\"heading\">Web Card Title</span></font>
</br><font size=\ "2%\"><span class=\"cardcontent\"> polio or infantile paralysis, is an infectious disease caused by the poliovirus. </span></font>
</br><font size=\ "1\" color=\ "grey\">See more..</font>\r\n</div>\r\n</div>\r\n</br>\r\n
<div id=\ "botrigh\">
<!--लाइक शेयर सेव-->\r\n
<button id=\ "likeone\" class=\ "likebtn\" align:\ "middle\" style=\ "width:35%; border-right:thin solid grey;\">\r\n<img id=\ "btn\" src=\ "file:///android_asset/like_icon.png\" alt=\ "Text\" />\r\n<font size=\ "1%\" color=\ "grey\">like 05</font>\r\n</button>\r\n
<button id=\ "shareone\" class=\ "sharebtn\" style=\ "width:30%; margin-left:-2%; border-right:thin solid grey;\">\r\n<img id=\ "btn1\" src=\ "file:///android_asset/share_icon.png\" alt=\ "Text\" />\r\n<font size=\ "1%\" color=\ "grey\">share</font>\r\n</button>\r\n
<button id=\ "saveone\" class=\ "savebtn\" style=\ "width:27%; margin-left:-2%;\">\r\n<img id=\ "btn2\" src=\ "file:///android_asset/save_icon.png\" alt=\ "Text\" />\r\n<font size=\ "1%\" color=\ "grey\">save</font>\r\n</button>
</div>\r\n</div>\r\n
<div align=\ "center\" style=\ " opacity: 0.75; padding-top:1%; width:31%; background-color:grey; position:absolute; bottom:6%; left:2%;\">\r\n<font size=\ "1%\" color=\ "white\" style=\ "margin-left:4%;\">About 5min ago</font>\r\n</div>\r\n</div>
<div id=\ "addcards\"></div>\r\n</body>\r\n\r\n
<script>
\
r\ n$.mobile.loading().hide();\
r\ n$(function() \
r\ n $(\"img.lazy\").lazyload(\r\n \tthreshold : 50\r\n );\r\n);\r\nfunction resize()\r\n\r\nvar w = Math.max(document.documentElement.clientWidth, window.innerWidth || 0);\r\nvar h = w/1.73;\r\nAndroid.showToast(w);\r\nvar divs = document.getElementsByClassName('content');\r\n for(var i = 0; i < divs.length; i++) \r\n divs[i].style.height= h+'px';\r\n divs[i].style.width= w+'px'; \r\n \r\n if (window.jQuery) \r\n // jQuery is loaded \r\n Android.showToast('Yeah!');\r\n else \r\n // jQuery is not loaded\r\n Android.showToast('Doesnt Work');\r\n \r\nAndroid.showToast1();\r\n\r\n\t\r\n$(function()\r\n $('.likebtn').click(function ()\r\n var p = $(this).closest('div[class^=\"content\"]').index();\r\n Android.likeCard(p); \r\n );\r\n);\r\n\r\n$(function()\r\n $('.sharebtn').click(function ()\r\n var p = $(this).closest('div[class^=\"content\"]').index();\r\n Android.shareCard(p); \r\n );\r\n);\r\n\r\n$(function()\r\n $('.savebtn').click(function ()\r\n var p = $(this).closest('div[class^=\"content\"]').index();\r\n Android.saveCard(p); \r\n );\r\n);\r\n\r\n$(function()\r\n $('.openFullcard').click(function ()\r\n var p = $(this).closest('div[class^=\"content\"]').index();\r\n Android.openFullcard(p); \r\n );\r\n);\r\n\r\n$(function()\r\n $('.lazy').click(function ()\r\n var p = $(this).closest('div[class^=\"content\"]').index();\r\n Android.openFullcard(p); \r\n );\r\n);\t\r\nfunction showAndroidToast(toastmsg)\r\n\t\r\n\tAndroid.showToast(toastmsg); \r\n\r\nfunction newpage(page)\r\n\tAndroid.nextDetail(page);\r\n\r\nfunction appendText(extraStr) \r\n //document.getElementById('addcards').innerHTML = document.getElementById('addcards').innerHTML + extraStr;\r\n $(document).ready(function()\r\n $(\"#addcards\").html(extraStr);\r\n\t);\r\n\r\n\r\n
</script>\r\n
</html>
这些是 webview 的设置
webView.getSettings().setBuiltInZoomControls(false);
webView.setLayerType(View.LAYER_TYPE_HARDWARE, null);
webView.getSettings().setJavaScriptEnabled(true);
webView.getSettings().setRenderPriority(RenderPriority.HIGH);
webView.getSettings().setPluginState(PluginState.ON);
webView.getSettings().setPluginsEnabled(true); webView.getSettings().setAllowFileAccess(true);
下面是我正在加载的 jquery 库
https://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js https://ajax.googleapis.com/ajax/libs/jquerymobile/1.4.5/jquery.mobile.min.js https://cdnjs.cloudflare.com/ajax/libs/jquery.lazyload/1.9.1/jquery.lazyload.js
对不起,我真的不知道如何格式化问题。
蚂蚁建议将不胜感激。
提前致谢。
【问题讨论】:
【参考方案1】:花了很多时间检查你的html代码,最后在检查你的完整格式时发现了问题。
脚本标签中的 cmets 导致了问题,cmets 注释掉了脚本和 html 代码的其余部分,因此这是一个格式问题,而您的代码中没有其他内容。 请去掉 HTML 代码中的 cmets
"// jQuery 已加载"
,
"// jQuery 没有加载
" 和
"//document.getElementById('addcards').innerHTML = document.getElementById('addcards').innerHTML + extraStr;"
,在脚本标签中。 希望这能解决您的问题。
【讨论】:
我不敢相信那些 cmets 竟然不读取 jquery 函数。以上是关于当我将 html 数据从字符串加载到 webview 时,Jquery 功能不起作用的主要内容,如果未能解决你的问题,请参考以下文章
如何在 WebView 中仅加载 .html 页面并在 iOS 的 Safari 中加载所有 www 页面?
当我将 .txt 文件加载到我的程序中时,如何删除这些随机整数(我根本没有输入)
从 HTML 将图像加载到 UITextview/WKWebView
当我将它添加到我的 html 文档时,向上/向下投票系统不起作用