为什么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元素。
希望有所帮助,就像我说我的问题只是类似,不知道这会怎样对你有用,但我希望它至少会引发某人的想法。