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

我有一个页面的问题,我正在尝试使用colorbox (一种jQuery的灯箱)工作。 由于document.body在FireFox(3.5.3)中为null ,因此它显然不起作用。 在颜色框工作的Safari(4.0.3)中不是这种情况。

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

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

有没有什么方法可以使用jQuery来重新填充来自$()document.body属性,或者我应该继续敲打drupal以不在html标签之外放置脚本标签(说起来容易做起来难)?

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

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

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

(*:或浏览器知道的其他元素,例如

不能在体外发生,在这种情况下,它会默默地添加来修复你丢失的标记。解析某些通常在-body-tags可以解释为什么Safari允许你逃脱它。)

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

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

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

不, document.body只反映与document.getElementsByTagName('body')[0]基本相同,所以尝试设置它是不明智的,如果你找不到带有document.body的主体,jQuery赢了’能够用$('body')找到它。

Dribal在body标签下面不应该有任何输出。 检查你的主题page.tpl.php文件。 结尾看起来应该是这样的:

      

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

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

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

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

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

对不起,这个答案不在jquery中(我在过去几个小时里用原型摔跤了类似的东西)。

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

这是原型,但你明白了,

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

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

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