jquery在IE / Internet Explorer中$ .getJSON之后没有更新DOM

时间:2009-12-15 06:20:29

标签: jquery json dom cross-browser

我有一个页面,其中包含一个元素<displayedimage>,在IE 6和IE 8中使用jquery的document.ready / $。getJSON函数进行更新(即使我没有,也可能是IE 7)测试)。同样的功能在XP Safari和OS X Safari,OS X Chrome,OS X Opera等上运行良好。所以,这是发生的事情:

我有一个元素,在第一次加载时是空的,但是由document.ready执行的javascript方法填充:

<div id="imagecontrol">
   <displayedimage></displayedimage>
</div>

更新:

function loadFirstImage() {
        $.getJSON("/servlet/access/image/" + id,
            function(json) {
                $("displayedimage").html("<a href=\"/servlet/images/" + json.images[0].filename + "\"><img src=\"/servlet/images/s_" + json.images[0].filename + "\"></img></a>");
                $("imagelabel").html(json.images[0].label);
            });
}

如前所述,此系统在OS X Safari,OS X Chrome,OS X Opera,XP Safari中运行良好,但在XP IE中似乎没有任何作用。我在loadFirstImage方法中执行了简单的调试(alert(“loadFirstImage called”),它给了我一个警告,所以看起来它可能是一些.getJSON问题?有关从哪里开始这样的建议吗?谢谢。

4 个答案:

答案 0 :(得分:2)

使用任意DOM元素名称可以解决这类问题和不一致。

为什么不简单地使用标准元素,例如divspan?:

<div id="imagecontrol">
   <div id="displayedimage"></div>
</div>

$.getJSON回调中,您可以设置内容:

$("#displayedimage").html(/*...*/);

浏览器将接受任何标记,即使它不是合法的HTML。这样,这意味着浏览器将尝试猜测关于可能的含义。这可能会导致出现与您现在相同的浏览器兼容性问题,因为我建议您validate添加标记。

答案 1 :(得分:0)

尝试使用sematics

<div id="imagecontrol">
   <div id="displayedimage"></div>
</div>

JS

$.getJSON("/servlet/access/image/" + id,
  function(json) {
    $("#displayedimage").html("<a href=\"/servlet/images/" + json.images[0].filename + "\"><img src=\"/servlet/images/s_" + json.images[0].filename + "\"></img></a>");
 });

答案 2 :(得分:0)

由于您使用的是自定义标记,您是否根据IE的需要明确创建了这些标记?将其放在您网页的head中:

<!--[if IE]>
<script type="text/javascript" charset="utf-8">
  document.createElement('displayedimage');
  document.createElement('imagelabel');
</script>
<![endif]-->

对于记录:我同意您应该坚持使用有效标记的其他答案,否则您可能会在以后遇到名称冲突。

答案 3 :(得分:0)

另请注意如果在同一页面上多次调用$.getJSON (可能是因为按钮点击或类似情况),则IE 7/8中的 您的数据将不会更新,因为默认情况下IE会缓存ajax请求(例如Chrome和FF不会这样做)。

解决方案是使用 $.ajax 方法( $.getJSON $.ajax ):

    $.ajax({
      url: 'JSON_SOURCE_URL',
      dataType: 'json', 
      cache: false, // 'cache: false' must be present for IE 7 & 8
      success: function(data) {
        // do your thing with 'data'
      }
    });