我尝试在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);
}
});
由于
答案 0 :(得分:0)
假设您的意思是,当您说loadData时为android.webkit.WebView.loadDataWithBaseURL
,而当您说loadUrl时为android.webkit.WebView.loadUrl
。
从documentation开始,只有它们之间存在差异,loadURL呈现的webkit具有您设置的网址。另一方面,loadData呈现webkit,源代码来自参数,baseURL也是参数。
您获得的javascript错误消息主要与您尝试跨域ajax请求时有关。这似乎更适合你的情况,因为你的方法之间的唯一区别似乎是其中一个是一个实际的URL,另一个是动态创建的网页,没有可靠的网址。
还来自documentation of 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);
}
});