为什么在Firefox中document.body == null,但不是Safari
我有一个页面出现问题,我试图让colorbox(jQuery的一种灯箱)工作。它显然不起作用,因为FireFox(3.5.3)中的document.body
是null
。在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.body
是null
即使在页面加载完成后。这里有一个Firebug的控制台捕获:
>>> document.body
null
>>> $().attr('body')
null
通常的原因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')
或者。
我明白你的意思,一般都认同,除了在这种情况下,我得到null为document.body和正确的价值与'$('身体')'所以也许,某处document.body某人被分配为null ? – dlamblin 2009-10-27 21:08:58
您不能分配给document.body;您将在每个浏览器中收到JavaScript错误。是否有可能你只是意外地定义了一个名为'document'的全局变量,它隐藏了对真实文档对象的访问? – bobince 2009-10-28 01:30:17
或者,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语句,因为这需要在最后的内容输出(但仍内身体)。
谢谢,我与你所说的一致,并且我在我的主题的身体标记内有声明,并且位于谷歌分析标记之上。 – dlamblin 2009-10-27 21:07:01
有趣的 - 通常谷歌分析标签将成为$封闭变量的内容的一部分,而不是下面的单独输出。您是使用google_analytics模块还是自己将标记放在那里? – 2009-10-27 23:28:38
您可能需要暂时移除analytics标签,以查看这是否会影响您的问题 - 如果确实存在,请使用'scope ='footer''通过'drupal_add_js()'将其添加回来,然后它将成为$ closure的一部分变量。 – 2009-10-27 23:50:50
难道你不使用另一个JS框架与jQuery? 如果是这样,你有没有照顾如何加载这两个库,使它们保持兼容(订单,兼容性修复...)?
对不起,这个答案不是在jQuery中(我在过去的几个小时里与原型一直在类似的事情上摔角)。
基本上,从bobince的最佳答案是相当有帮助,但是你可以重新分配文档正文找到它的窍门。
这是原型,但你的想法,
body = $("content").ancestors().last().children[1];
哪里是你可以用通常的选择在网页上找到了一些定义的元素,任何可以使用的内容它并不真正的问题,从那里你遍历到顶部,然后沿着主体元素向下。
希望有帮助,就像我说的我的问题只是相似的,不知道这将如何适合你,但我希望它至少能触发某人的想法。
是不是document.body与$('body')(模仿jQuery对象包装)相同? – 2009-10-27 13:59:08