无论如何让iphone / iPad访问XMLHTTPRequests,即来自UIWebView内网页的ajax响应。我已经尝试了几个解决方案,其中响应URL被更改,以便应用程序可以识别它确实是一个ajax响应。
我是ajax的新手,但我很想学习。如果有人能告诉我ajax和接收浏览器的响应之间的相关性,我只是徘徊。
通过iOS的uiwebview实现它将是一个额外的好处。
到目前为止,我正在尝试
ajax_handler.js
var s_ajaxListener = new Object();
s_ajaxListener.tempOpen = XMLHttpRequest.prototype.open;
s_ajaxListener.tempSend = XMLHttpRequest.prototype.send;
s_ajaxListener.callback = function () {
window.location='mpAjaxHandler://' + this.url;
};
XMLHttpRequest.prototype.open = function(a,b) {
if (!a) var a='';
if (!b) var b='';
s_ajaxListener.tempOpen.apply(this, arguments);
s_ajaxListener.method = a;
s_ajaxListener.url = b;
if (a.toLowerCase() == 'get') {
s_ajaxListener.data = b.split('?');
s_ajaxListener.data = s_ajaxListener.data[1];
}
}
XMLHttpRequest.prototype.send = function(a,b) {
if (!a) var a='';
if (!b) var b='';
s_ajaxListener.tempSend.apply(this, arguments);
if(s_ajaxListener.method.toLowerCase() == 'post')s_ajaxListener.data = a;
s_ajaxListener.callback();
}
Objective C
JSHandler = [[NSString stringWithContentsOfURL:[[NSBundle mainBundle] URLForResource:@"ajax_handler" withExtension:@"js"] encoding:NSUTF8StringEncoding error:nil] retain];
- (void)webViewDidStartLoad:(UIWebView *)webView {
[webView stringByEvaluatingJavaScriptFromString:JSHandler];
}
我从here得到的,我不明白这个javascript如何允许我以后访问从服务器上的ajax脚本返回的ajax响应
答案 0 :(得分:0)
我会尝试为您提供一个简单的演示 - 您可以查看本教程中的ajax - http://www.w3schools.com/ajax/default.asp
function ajax (url, onsuccess)
{
var xhr = new XMLHttpRequest();
xhr.open ("GET", url);
xhr.send ();
xhr.onreadystatechange = function (event)
{
//alert (xhr.responseText);
try {
switch (xhr.readyState) {
case 0:
break;
case 1:
break;
case 2:
break;
case 3:
break;
case 4:
//alert (xhr.statusText);
//alert (onsuccess);
onsuccess (xhr.responseText, xhr.statusText, xhr.status);
break;
default:
break;
}
}
catch (e)
{
}
}
}
// call back when ajax is done
function onSuccessCallback (data, statusText, status)
{
//alert (data);
}
function fetchPage ()
{
ajax ("http://your domain is here", onSuccessCallback);
}
然后你可以在你的代码上使用它来调用这个函数,这将触发ajax调用,但是ajax工作在“异步”模型中(如果你没有指定它同步),所以你只需触发它,但不会得到这种方法的反应 -
[self.webview stringByEvaluatingJavaScriptFromString:@"fetchPage();"
所以这里有一个javascript回调通知你的webview的技巧 -
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
// check the request, if it's ajax callback, just return NO; other wise YES;
NSURLRequest *request = [self.webview request];
NSURL *url = [request URL];
NSString *file = [url lastPathComponent];
if ([file isEqualToString:@"ajaxcallback.htm"] == YES) {
// that means the ajax call is done, so you can call this
NSString *result = [self.webview stringByEvaluatingJavaScriptFromString:@"getResponse ();"];
// don't forget to stop loading this fake page
return NO;
}
}
修改ajax的回调函数 -
var response;
function onSuccessCallback (data, statusText, status)
{
// store the data to global variable
response = data;
// trigger webview to load a new page, but actually stop loading in delegate
window.location = "http://www.domain.com/ajaxcallback.htm";
}
// call this in your objective C code
function getResponse ()
{
return response;
}