Safari中的JavaScript错误,有时只是

时间:2009-08-14 17:11:24

标签: javascript jquery safari

我有一个网页,它使用jQuery隐藏页面加载上的div,然后根据用户交互显示它们。

在我的$(document).ready()中,我执行了一堆代码来隐藏这些div,并将一个函数绑定到jQuery中的click()处理程序,以触发显示这些div的区域。它还会从HTML中获取一些值,以供稍后脚本使用。后者是造成问题的原因。

此代码在Firefox和Chrome / Chromium中运行良好(我们仍然在研究IE的CSS,但据我所知,JS工作正常)。在Safari中,它在大约70%的时间内完美无瑕地运行。然而,每加载几页,$(document).ready()中的一行就会给我一个错误并阻止JS执行,同时也停止为页面的其余部分绘制HTML。

该行是:

    var itemCount = document.getElementById('itemCount').innerHTML;

Safari中的调试控制台说“空值”。问题是,我在我的HTML中看到了以下内容(从页面的“视图源”开始,无法正确加载):

    <div id="itemCount" style="display:inline">0</div>

并且它是唯一具有此ID的项目(显然。)

我认为JS在文档实际准备好之前就已经运行了,并且我在考虑尝试测试document.getElementById('itemCount')是否返回null并等待一段时间,但是我不知道这是否有效,或者是否有一个不那么难看的解决方案。

如果我遗漏了一些显而易见的东西,或者其他方式都是愚蠢的,请告诉我。

2 个答案:

答案 0 :(得分:1)

从编写代码的方式来看,我认为页面上必然会出现其他错误。你的第一个代码块应该是:

var itemCount = $('#itemCount').html();

......第二个:

<span id="itemCount">0</span>

A&lt; div&gt;设置为内联显示为&lt; span&gt;。一个&lt; span&gt;设置为块级元素是&lt; div&gt;。这是两个标签的唯一原因。他们是完全相同的。使用正确的任务完成任务。

并非我希望这些更改中的任何一项都能改变您的症状。我只是怀疑你的页面上有其他......有问题的东西,而这才是真正导致问题的原因。狂野猜测:移动&lt; script&gt;包含ready()处理程序的块到文档的底部&lt; body&gt;。

如果您还没有使用Safari 4,请务必这样做。在高级首选项中打开“开发”菜单,然后说“开发”&gt;在加载页面之前显示Web Inspector。如果有错误,它会比Safari 3更好地向您展示原因。

答案 1 :(得分:0)

似乎是一个老bug。请参阅ticket 1319ticket 4187

请参阅this potential workaround

  

经过一些实验并删除了99%的帖子:) - 添加一个空的样式标签dinamically魔术修复问题:

(function(){
    if (!/WebKit/i.test(navigator.userAgent)) return;
    var el = document.createElement("style");
    el.type = "text/css";
    el.media = "screen, projection";
    document.getElementsByTagName("head")[0].appendChild(el);
    el.appendChild(document.createTextNode("_safari {}"));
})();