为什么Firefox中的document.body == null而不是Safari

时间:2009-10-27 13:55:11

标签: jquery firefox drupal-6 colorbox document-body

我的页面有问题,我试图让colorbox(一种jQuery的灯箱)工作。由于FireFox(3.5.3)中document.bodynull,它显然不起作用。在颜色框工作的Safari(4.0.3)中不是这种情况。

向我跳出的一点是(我正在使用Drupal 6)drupal附加了一个脚本标记,用于在页面的最底部设置一些JavaScript变量,位于结束体和html标记之下。否则我没有看到问题。不幸的是,我很难做到这一点。可能是因为这导致FF与身体有问题吗?

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

有没有什么方法可以使用jQuery用document.body中的某些内容重新填充$()属性,或者我应该继续敲打drupal以不在html标记之外放置脚本标记(更容易说比做完了??

即使在页面加载完成后,也要澄清document.bodynull。这是一个Firebug控制台捕获:

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

5 个答案:

答案 0 :(得分:9)

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

(*:或浏览器知道的其他元素,如<p>不能在正文外发生,在这种情况下,它会默默地添加<body>来修复丢失的标记。在解析某些通常在体内的标签时,可以解释为什么Safari允许你逃脱它。)

  

这可能导致FF与身体有问题吗?

没有。它是破坏的标记,Drupal不应该这样做,但关闭</body>并不会阻止document.body引用正确的DOM节点。

  

有什么方法可以使用jQuery来重新填充document.body

不,document.body仅与document.getElementsByTagName('body')[0]基本相同,因此尝试设置它是不明智的,如果找不到document.body的主体,则jQuery赢了无法使用$('body')找到它。

答案 1 :(得分:1)

Body标签下方的Drupal不应该有任何输出。检查您的主题page.tpl.php文件。结局看起来应该是这样的:

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

</body>
</html>

$ closure变量的输出下面不应该有print语句,因为这需要是最后一个内容输出(但主体内)。

答案 2 :(得分:1)

你不使用另一个JS框架和jQuery吗? 如果是这样,你是否负责如何加载两个库以使它们保持兼容(订单,兼容性修复......)?

答案 3 :(得分:0)

这很奇怪,但只是在我的$(document).ready(function(){});底部添加这一行修复了破坏身体的任何内容:

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

但是我必须更多地考虑它为什么在第一时间被打破,以及为什么它没有在野生动物园中破坏。

答案 4 :(得分:0)

抱歉,这个答案不在jquery中(我在过去几个小时里用原型进行了类似的练习)。

基本上,bobince的最佳答案非常有用,但是可以重新分配文档正文,然后才能找到它。

这是原型,但你明白了,

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

如果内容是页面上的某些已定义元素,您可以使用常规选择器找到它们,任何可以使用它并不重要,从那里您遍历到顶部然后向下并沿着body元素。

希望有所帮助,就像我说我的问题只是类似的,不知道这对你有什么影响,但我希望它至少会引发某人的想法。