为什么在Firefox中document.body == null,但不是Safari

问题描述:

我有一个页面出现问题,我试图让colorbox(jQuery的一种灯箱)工作。它显然不起作用,因为FireFox(3.5.3)中的document.bodynull。在Safari(4.0.3)中,colorbox的作用不是这种情况。为什么在Firefox中document.body == null,但不是Safari

跳到我身上的是(我正在使用Drupal 6)drupal附加了一个脚本标记,用于在页面底部设置一些JavaScript变量,位于关闭body和html标记下方。否则,我不会看到问题。不幸的是,我有很多麻烦让它不这样做。这是否会导致FF与身体有问题?

在Firefox中使用colorbox的示例文件确实有效(并且在那里定义了document.body)。

有没有什么办法可以使用jQuery来填充document.body属性$()或者我应该不断在drupal上敲一下脚本标签(不容易说完成)?

澄清document.bodynull即使在页面加载完成后。这里有一个Firebug的控制台捕获:

>>> document.body 
null 
>>> $().attr('body') 
null 
+1

是不是document.body与$('body')(模仿jQuery对象包装)相同? – 2009-10-27 13:59:08

通常的原因document.body是空的,因为你的<body>标签(*)已经遇到过执行脚本。没有看到代码我不能肯定地说,但这是通常的原因。移动放置脚本的位置。

(*:或浏览器知道的其他元素(如<p>)不能在正文以外发生,在这种情况下,它会自动添加<body>来修复缺少的标记。身体标签可能解释为什么Safari允许你逃避它。)

难道这是造成FF与身体有问题吗?

号这是破的标记和Drupal不应该这样做,但关闭</body>不会停止document.body引用正确的DOM节点。

有什么办法,我可以使用jQuery重新填充document.body的

没有,document.body只反映基本相同document.getElementsByTagName('body')[0],所以试图设置它是不理智的,如果你无法找到与document.body身体,jQuery将无法找到$('body')或者。

+0

我明白你的意思,一般都认同,除了在这种情况下,我得到null为document.body和正确的价值与'$('身体')'所以也许,某处document.body某人被分配为null ? – dlamblin 2009-10-27 21:08:58

+0

您不能分配给document.body;您将在每个浏览器中收到JavaScript错误。是否有可能你只是意外地定义了一个名为'document'的全局变量,它隐藏了对真实文档对象的访问? – bobince 2009-10-28 01:30:17

+0

或者,jQuery内置了允许它返回'$('body')'的非空值的检查。即。它确保(或等待)'

'被加载。 – 2010-09-28 03:42:29

嗯,这是奇怪,但刚刚添加该线在底部我$(document).ready(function(){});固定无论是破体:

if(null==document.body){document.body = $('body')[0];} 

但是我必须看到更多的为什么它在第一次拿到破地方,以及为什么它没有在Safari浏览器中破解。

Drupal的body标签下面不应该有任何输出。检查您的主题page.tpl.php文件。到底应该看起来非常像这样:

<!-- BEGIN closure: must always be last element in body --> 
    <?php print $closure; ?> 
<!-- END closure --> 

</body> 
</html> 

应该有$封闭的可变输出下方没有print语句,因为这需要在最后的内容输出(但仍身体)。

+0

谢谢,我与你所说的一致,并且我在我的主题的身体标记内有声明,并且位于谷歌分析标记之上。 – dlamblin 2009-10-27 21:07:01

+0

有趣的 - 通常谷歌分析标签将成为$封闭变量的内容的一部分,而不是下面的单独输出。您是使用google_analytics模块还是自己将标记放在那里? – 2009-10-27 23:28:38

+0

您可能需要暂时移除analytics标签,以查看这是否会影响您的问题 - 如果确实存在,请使用'scope ='footer''通过'drupal_add_js()'将其添加回来,然后它将成为$ closure的一部分变量。 – 2009-10-27 23:50:50

难道你不使用另一个JS框架与jQuery? 如果是这样,你有没有照顾如何加载这两个库,使它们保持兼容(订单,兼容性修复...)?

对不起,这个答案不是在jQuery中(我在过去的几个小时里与原型一直在类似的事情上摔角)。

基本上,从bobince的最佳答案是相当有帮助,但是你可以重新分配文档正文找到它的窍门。

这是原型,但你的想法,

body = $("content").ancestors().last().children[1]; 

哪里是你可以用通常的选择在网页上找到了一些定义的元素,任何可以使用的内容它并不真正的问题,从那里你遍历到顶部,然后沿着主体元素向下。

希望有帮助,就像我说的我的问题只是相似的,不知道这将如何适合你,但我希望它至少能触发某人的想法。