Android WebView.loadDataWithBaseURL() JavaScript 注入问题

我一直在寻找解决这个问题的方法,虽然我发现了一个问题,但我发现答案为零。我会列出整个情况,因为也许有一个我没有看到的解决方案......

我有一个 HTML 文件加载到用户的 SD 卡上。我正在使用 WebView.loadURL(...) 将该 HTML 文件加载到 WebView 中。这工作正常。该 HTML 导入外部 Javascript 文件,如下所示:

<script type='text/javascript' src='js/jquery-1.3.2.min.js' />
<script type='text/javascript' src='js/inPractice-utilities.js' />
<script type='text/javascript' src='js/inPractice.js' />
<script type='text/javascript' src='js/mobile/inpractice.ipad.js /'>

当然,这不起作用,因为在 SDK 1.0 之后,加载这个外部代码的能力被认为是一个安全问题(或者至少我是这么理解的)。我更改了每个 HTML 文件(有数百个)以使用内联 Javascript,并且一切正常。

每个 HTML 文件都有链接,这些链接使用它们的“onClick”事件调用 Javascript 方法。

<a href="/drug" onclick="return content('drug', {name:'Tamoxifen', pageId:'9475b30a-5a8b-04fa-f975-7fcaeaa0a2cf'});">Tamoxifen</a>

如您所见,当用户单击此链接时,将调用 javascript 方法“content”。这也很好用。

但是,有些文件有指向“支持资产”的链接,它们本身本质上是独立的 HTML 页面,除了没有实际页面。这是一个例子:

<a href="/supportingAsset" onclick="return content('supportingAsset', {'html':'<div class='supportingAsset'><p><a href='/drug' onclick='return content('drug', {name:'Tamoxifen', pageId:'9475b30a-5a8b-04fa-f975-7fcaeaa0a2cf'});'>Tamoxifen</a>'});">Supporting Asset</a>

*注意,我的游戏中可能存在一些语法问题,但我保证语法在实际代码中都是正确的。

因此,这里的问题是支持资产 HTML 作为参数包含在对 Javascript 方法“内容”的调用中。为了在用户单击支持资产时显示此内容,我使用...

webView.loadDataWithBaseURL("file://" + baseLocation, html, "text/html", "utf-8", null);

...其中“html”是传递给 Javascript 方法的 HTML,“内容”。这个新页面显示正常,但是...如果您在支持资产内容中注意到,还有另一个链接调用 Javascript 方法,“内容”。这就是问题所在……

我试过追加...

<script type='text/javascript' src='js/jquery-1.3.2.min.js' />

...在将原始 HTML 加载到 webview 之前。没有。

我已经尝试附加内联 Javascript 方法。没有。

我尝试在 pageLoad 之后添加 Javascript 方法...

    @Override
    public void onPageFinished(WebView view, String url) {
        if (loadingPageDialog != null) {
            loadingPageDialog.dismiss();
        }

        view.loadUrl("javascript:(function content(path, params) { " +  
                "document.getElementsByTagName('body')[0].style.color = 'red'; " +  
        "})()");  
    }

...没有。

实际问题

有谁知道我可以注入 Javascript 方法“内容”的方法,这样对“内容”的现有调用就可以工作?请注意,我无法更改对“内容”的调用,并且显示支持资产内容的 Web 视图位于与原始 Web 视图不同的活动中。

stack overflow Android WebView.loadDataWithBaseURL() JavaScript Injection Question
原文答案

答案:

作者头像

我相信你有一个错字。改变,

"file://"

"file:///"