我在 jQuery ajax(jsonp)忽略超时并且不会触发错误事件

我试图通过以下方式获取最新的Twitter更新:

var jsonTwitterFeed = "http://twitter.com/statuses/user_timeline/softamo.json?count=3";

$.jsonp({
        url: jsonTwitterFeed,
        data: {},
        dataType: "jsonp",
        callbackParameter: "jsoncallback",
        timeout: 5000,
        success: function(data){
            $.each(data, function(){
                $("#sNews ul.tweets").append("<li>" + replaceURLWithHTMLLinks(data.text) + "</li>");                
            });            

        },
        error: function(XHR, textStatus, errorThrown){
            alert("ERREUR: " + textStatus);
            alert("ERREUR: " + errorThrown);
        }
    });

function replaceURLWithHTMLLinks(text) {
    var exp = /(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig;
    return text.replace(exp,"<a href='$1'>$1</a>");
}

错误警报调用执行:

  

ERREUR:错误
  ERREUR:未定义

但是,我可以在Firebug中看到JSON对象。

知道发生了什么事吗?

有帮助吗?

解决方案

我不知道这是否完全相关,但您可能错过了Feed网址中JSONP的回调,除非默认设置:

var jsonTwitterFeed = "http://twitter.com/statuses/user_timeline/softamo.json?count=3&callback=?";

此外,您的jquery AJAX调用可以简单地使用默认的AJAX而不是JSONP。试试这个并告诉我们:

$.ajax({
        url: jsonTwitterFeed,
        data: {},
        dataType: "jsonp",
        callbackParameter: "jsoncallback",
        timeout: 5000,
        success: function(data){
            var str = '';
            for(var i = 0; i < data.length; i++) { 
                str += '<li>' + replaceURLWithHTMLLinks(data[i].text) + '</li>';
            }
            $("#sNews ul.tweets").append(str);
        },
        error: function(XHR, textStatus, errorThrown){
            alert("ERREUR: " + textStatus);
            alert("ERREUR: " + errorThrown);
        }
    });

function replaceURLWithHTMLLinks(text) {
    var exp = /(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig;
    return text.replace(exp,"<a href='$1'>$1</a>");
}

其他提示

尝试更改

 $.each(data, function(){
    $("#sNews ul.tweets").append("<li>" + replaceURLWithHTMLLinks(data.text) + "</li>");                

$.each(data, function(post, val){
   $("#sNews ul.tweets").append("<li>" + replaceURLWithHTMLLinks(val.text) + "</li>");                

修改

我确实改变了另一件事,但忘记将其添加到答案中。

callbackParameter: "jsoncallback",

应该是

callbackParameter: "callback",

为了完整起见,这是我做的测试页面:

<html>
<head>
   <title>test</title>
   <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
   <script type="text/javascript" src="jquery.jsonp-1.1.0.min.js"></script>
   <script type="text/javascript">
      $(document).ready( function() {
         var jsonTwitterFeed = "http://twitter.com/statuses/user_timeline/dougw.json?count=3";

         $.jsonp({
            url: jsonTwitterFeed,
            data: {},
            dataType: "jsonp",
            callbackParameter: "callback",
            timeout: 5000,
            success: function(data){
               $.each(data, function(key, val){
                  $("#sNews ul.tweets").append("<li>" + replaceURLWithHTMLLinks(val.text) + "</li>");                
             });            
         },
         error: function(XHR, textStatus, errorThrown){
             alert("ERREUR: " + textStatus);
             alert("ERREUR: " + errorThrown);
         }
     });
         function replaceURLWithHTMLLinks(text) {
            var exp = /(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig;
            return text.replace(exp,"<a href='$1'>$1</a>");
         }
      });
   </script>
</head>
<body>
   <div id="sNews">
      <ul class="tweets">
      </ul>
   </div>
</body>

我尝试使用以下代码,并获得正确触发的成功函数。

$.getJSON(jsonTwitterFeed, {
    success: function(data){
        $.each(data, function(){
            $("#sNews ul.tweets").append("<li>" + replaceURLWithHTMLLinks(data.text) + "</li>");                
        });            

    },
    error: function(XHR, textStatus, errorThrown){
        alert("ERREUR: " + textStatus);
        alert("ERREUR: " + errorThrown);
    }
});
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top