2012-07-12 62 views
4

我尝试在Android的WebView一个HTML页面的ajax post请求加载。差异与JavaScript

当我用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

假设你的意思是,android.webkit.WebView.loadDataWithBaseURL当你说loadData,并android.webkit.WebView.loadUrl当你说使用loadURL。

documentation,只是它们之间的区别是,使用loadURL呈现具有设置URL的WebKit的。另一方面,loadData渲染webkit,源代码来自参数,baseURL也是一个参数。

你的JavaScript错误信息,主要是相关的,当你尝试跨域Ajax请求。这似乎对你的情况更plausable因为你的方法之间的唯一差别似乎是他们中的一个是实际的URL另一种是动态创建的网页,没有坚实的URL。

而且还从documentation of loadDataWithBaseURL

“...的基本URL既用来解决相对URL和应用 JavaScript的同源策略的时候。”

而你没有设置baseURL参数可能会让我们知道这个问题。

尝试分配一些虚拟的域名,或者你基本URL自己的域名,并且还追加此域名您的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); 
    } 
});