我有一个网页,它使用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并等待一段时间,但是我不知道这是否有效,或者是否有一个不那么难看的解决方案。
如果我遗漏了一些显而易见的东西,或者其他方式都是愚蠢的,请告诉我。
答案 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 1319和ticket 4187。
经过一些实验并删除了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 {}")); })();