4

我尝试在 Android webview 中加载一个带有 ajax 发布请求的 html 页面。

当我用 loadUrl 加载 webview 时,javascript 工作正常,但是当我尝试用 loadData 加载(我需要它)时,我得到一个错误:“ NETWORK_ERR: XMLHttpRequest Exception 101”。此错误听起来像是访问控制起源问题。

parseJsoup 函数将 html 页面中的某些字符串替换为好的字符串。我检查了传递给 loadData 的数据,并且脚本部分没有更改。

我的 oncreate 功能:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);        
    String html = parseJsoup("index.html");

    setContentView(R.layout.main);
    myBrowser = (WebView)findViewById(R.id.mybrowser);
    myBrowser.getSettings().setJavaScriptEnabled(true); 
    myBrowser.setWebViewClient(new MyWebViewClient());
    //myBrowser.loadUrl("file:///android_asset/index.html");            
    myBrowser.loadDataWithBaseURL("", html, "text/html", "utf-8", null);
}

还有我的 javascript 代码:

$.ajaxSetup({
  contentType: "application/json; charset=utf-8",
  datatype: "json",
  async: false,
});


$.ajax({
    type: "POST",
    url: "my url",
    data: 'my data',        
    success: function(data){
    // Do some action here with the data variable that contains the resulting message
      document.write("OK "+JSON.stringify(data));
      console.log(data);
    },
    error: function(data){
      document.write("KO "+JSON.stringify(data));
      console.log(data);
    }
});

谢谢

4

1 回答 1

0

假设你的意思是,android.webkit.WebView.loadDataWithBaseURL当你说 loadData 时,android.webkit.WebView.loadUrl当你说 loadUrl 时。

文档来看,它们之间的唯一区别是,loadURL 呈现一个具有您设置的 url 的 webkit。另一方面,loadData渲染webkit,那个源码来自一个参数,baseURL也是一个参数。

您收到的 javascript 错误消息主要与您尝试跨域 ajax 请求时有关。对于您的情况,这似乎更合理,因为您的方法之间的唯一区别似乎是其中一个是实际 URL,另一个是动态创建的网页,没有可靠的 url。

并且还来自loadDataWithBaseURL 的文档

“...基本 URL 用于解析相对 URL 和应用 JavaScript 的同源策略时。”

你没有设置 baseURL 参数可能会给我们关于这个问题的线索。

尝试将一些虚拟域名或您拥有的域分配给 baseURL,并将此域附加到您的 javascript ajax 资源端点。如:

myBrowser.loadDataWithBaseURL("http://mydomain/", html, "text/html", "utf-8", null);

在 Javascript 上:

$.ajax({
    type: "POST",
    url: "http://mydomain/my url",
    data: 'my data',        
    success: function(data){
    // Do some action here with the data variable that contains the resulting message
      document.write("OK "+JSON.stringify(data));
      console.log(data);
    },
    error: function(data){
      document.write("KO "+JSON.stringify(data));
      console.log(data);
    }
});
于 2013-09-11T08:48:26.863 回答