2012-03-27 64 views
-1

所以,我是Javascript新手,让我们把它弄明白。JavaScript - 结果显示在IE中但不是Chrome或FF

无论如何,我有以下代码可以在IE中使用,但不能在Chrome或FF中使用。它应该从Reddit RSS获取数据,然后输出它,就是这样。它只在IE中工作。任何人都可以解释我在这里做错了吗?

<html>                 
<head>                 
<script type="text/javascript"   
src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>   
<script type="text/javascript"> 


var result = null; 
$.ajax({ 
    url: "http://www.reddit.com/.rss", 
    type: 'get', 
    dataType: 'html', 
    async: false, 
    success: function(data) { 
    result = data; 

    } 
}); 

document.write(result); 

</script> 
</head> 
</body> 
</html> 
+2

您的HTML格式不正确。你的关闭标签内有一个闭合头标签。 – 2012-03-27 17:40:22

回答

1

由于$.ajax是异步的,您有竞争条件。相反,在成功处理程序中显示结果,以确保请求已完成。

$.ajax({ 
    url: "http://www.reddit.com/.rss", 
    type: 'get', 
    dataType: 'html', 
    async: false, 
    success: function(data) { 
     document.write(data); 
    } 
}); 

更新

既然你异步设置为false,上述说法是不适用的。然而,我从未发现使用document.write()的好理由,这可能是您问题的一部分。尝试使用另一种方法将数据注入到您的页面中,例如.html(),.append(),alert()等。并且在document.ready之内执行此操作也无妨。

$(document).ready(function() { 
    var result = null; 
    $.ajax({ 
     url: "http://www.reddit.com/.rss", 
     type: 'get', 
     dataType: 'html', 
     async: false, 
     success: function(data) { 
     result = data; 
     } 
    }); 

    alert(result); 
    $("body").append(result); 
}); 
+1

我非常确定在页面加载后使用document.write会产生一些非常意想不到的后果......但是,你打败了我! :-) – Timmerz 2012-03-27 17:40:47

+1

这不完全正确,async false应该在调用'$ .ajax'之前调用成功回调来运行。成功处理程序中的“document.write”会清除整个页面 – 2012-03-27 17:41:20

+0

在这里,他确实将async标志设置为false。这里的问题实际上是三个JavaScript引擎如何执行“成功”回调的细微差别。 (这可能是由代码检查它是否在IE中运行引起的。)基本上,IE代码似乎全部在事件循环中的单个事件中运行,而Firefox和Chrome至少有两个事件 - - 但我不确定“split”是否在调用“success”回调函数或初始的''.ajax''函数。 – 2012-03-27 17:41:24

2

是的,这段代码看起来不正确。这是一个竞争条件。 document.write立即执行。阿贾克斯可能会或可能不会及时设定结果。您需要将结果添加到的成功事件的网页...是这样的:

$.ajax({ 
    url: "http://www.reddit.com/.rss", 
    type: 'get', dataType: 'html', 
    async: false, 
    success: function(data) { 
    $("#some-div").html(data); 

    } }); 
+0

是否有理由不推荐将异步保留为true?抓取RSS源需要多长时间无关紧要;一旦到达,将其推入隔间并在此期间继续卡车运输。 – 2012-03-27 17:45:27

+0

是的,我只是复制他的代码。他可能因为比赛而在内线,所以它会以内联或其他方式执行。我只关心成功功能。 – Timmerz 2012-03-27 17:46:43

+0

哦,我明白了。是的,我不知道为什么,但直到我的评论发布之后,我才看到原始代码,所以我正在自己查看ajax调用,并且并不认为首先存在竞争条件(甚至尽管你说过了!)。你肯定会做一些不同的事情,比如渲染空白页面,然后在文档准备异步的时候做Ajax调用是错误的。 – 2012-03-27 17:51:25

0

那以这种方式进行处理:

(function(url, callback) { 
    jQuery.ajax({ 
     url: document.location.protocol + '//ajax.googleapis.com/ajax/services/feed/load?v=1.0&num=10&callback=?&q=' + encodeURIComponent(url), 
     dataType: 'json', 
     success: function(data) { 
      callback(data.responseData.feed); 
     } 
    }); 
})('http://www.reddit.com/.rss', function(feed) { 
    var entries = feed.entries, 
     feedList = ''; 
    for (var i = 0; i < entries.length; i++) { 
     feedList += '<li><a href="' + entries[i].link + '">' + entries[i].title + '</a></li>'; 
    } 
    jQuery('.rssfeed > ul').append(feedList); 
}); 

HTML:

<div class="rssfeed"> 
    <h4>RSS News</h4> 
    <ul></ul> 
</div> 

样本:http://jsfiddle.net/QusQC/

+0

请注意,如果您更新了jQuery版本,则可以按原样更好地处理XML。 – 2012-03-27 18:50:59

相关问题