2010-11-28 71 views
3

我试图让一个简单的jQuery获得JSON调用工作。我的成功处理程序非错误处理程序似乎没有被调用。 Firebug也显示数据主体为空。jQuery获取JSON响应是空的

服务器是运行在web.py下的一个非常基本的代码。我已经通过与lynx连接来测试服务器,并下载了json数据。

这里是jQuery的:

 

$(document).ready(function() { 
    $.ajax({ 
     url: 'http://localhost:8080/settings.json', 
     cache: false, 
     success: function(json){ 
      alert('json success ' + json); 
     }, 
     error: function(xhr, textStatus, errorThrown) { 
      alert(xhr.statusText); 
     } 
    }); 
}); 

JSON data is: 
{"netmask": "255.255.0.0", "ipaddress": "192.168.1.153"} 
 

回答

7

您不能到另一个域的请求(该规则包括不同的端口)用的XmlHttpRequest,这是由same origin policy堵塞。

尝试这样做的结果是空的响应,因此您无法看到内容。这只是出于安全目的而制定的一项规则......如果您连接到相同的主机和端口,则这不是问题。

+0

可以不要确定OP正在进行跨域呼叫。而且跨域调用通常会引发异常。 – anirvan 2010-11-28 17:46:17

0

我已经找到了解决办法得到一个错误回调与跨域请求空的响应。

在这个例子中,我使用Zepto,一个轻量级的jQuery,但我认为这在jQuery中也能正常工作。

首先,您必须使用这些参数做一个跨域请求:

$.ajax({ 
    url: url, 
    type: 'GET', 
    dataType: 'jsonp', 
    contentType: 'application/x-javascript', 
    crossDomain: true, 
    success: function (data, status) { /* ... */ } 
    error: function() { /* ... */ } 
    // ... 

现在,国内的$就功能使用$ .ajaxJSONP的跨域请求。这是原来的Zepto $ .ajaxJSONP功能:

$.ajaxJSONP = function(options){ 
    var callbackName = 'jsonp' + (++jsonpID), 
     script = document.createElement('script'), 
     abort = function(){ 
     $(script).remove() 
     if (callbackName in window) window[callbackName] = empty 
     ajaxComplete('abort', xhr, options) 
     }, 
     xhr = { abort: abort }, abortTimeout 

    if (options.error) script.onerror = function() { 
     xhr.abort() 
     options.error() 
    } 

    window[callbackName] = function(data){ 
     clearTimeout(abortTimeout) 
     $(script).remove() 
     delete window[callbackName] 
     ajaxSuccess(data, xhr, options) 
    } 

    serializeData(options) 
    script.src = options.url.replace(/=\?/, '=' + callbackName) 
    $('head').append(script) 

    if (options.timeout > 0) abortTimeout = setTimeout(function(){ 
     xhr.abort() 
     ajaxComplete('timeout', xhr, options) 
     }, options.timeout) 

    return xhr 
    } 

我的解决方法是非常简单,包括在某个区间呼吁script.onload事件处理程序几次,以验证回调函数被调用。

这是我的版本的$ .ajaxJSONP功能:

$.ajaxJSONP = function(options){ 
    var called = false, // Flag to check that callback was called 
     callbackName = 'jsonp' + (++jsonpID), 
     script = document.createElement('script'), 
     abort = function(){ 
      $(script).remove() 
      if (callbackName in window) window[callbackName] = empty 
      ajaxComplete('abort', xhr, options) 
     }, 
     xhr = { abort: abort }, abortTimeout 

    if (options.error) { 
     script.onerror = function() { 
      xhr.abort() 
      options.error() 
     }; 

     // IMPORTANT!!! 
     script.onload = function() { 
      var times = 0; 

      var interval = setInterval(function() { 
       // After 5 intervals, if the callback wasn't called, returns an error 
       if (times++ == 5) { 
        clearInterval(interval); 

        if (!called) { 
         options.error(); 
        } 
       } else if (called) { 
        clearInterval(interval); 
       } 
      }, 100); 
     }; 
    } 

    window[callbackName] = function(data){ 
     // Setting the "called" flag to true 
     called = true; 
     clearTimeout(abortTimeout) 
     $(script).remove() 
     delete window[callbackName] 
     ajaxSuccess(data, xhr, options) 
    } 

    serializeData(options) 
    script.src = options.url.replace(/=\?/, '=' + callbackName) 
    $('head').append(script) 

    if (options.timeout > 0) abortTimeout = setTimeout(function(){ 
     xhr.abort() 
     ajaxComplete('timeout', xhr, options) 
    }, options.timeout) 

    return xhr 
} 

注意:如果你有兴趣在服务器端的行为,请参阅本教程的开头:http://phonegap.com/2011/07/20/making-jsonp-calls-with-zepto-on-android-device/