Почему document.body == null в Firefox, но не в Safari
-
06-07-2019 - |
Вопрос
У меня проблема со страницей, на которой я пытаюсь получить цветная коробка (своего рода лайтбокс для jQuery) работает.Это не работает, по-видимому, из-за document.body
быть null
в FireFox (3.5.3).Это не тот случай в Safari (4.0.3), где работает colorbox.
Что-то, что бросается мне в глаза, так это то, что (я использую Drupal 6) drupal добавил тег script для установки некоторых переменных JavaScript в самом низу страницы, под закрывающим телом и html-тегами.В остальном я не вижу проблемы.К сожалению, у меня возникают большие проблемы с тем, чтобы заставить его этого не делать.Может быть, именно из-за этого у FF возникают проблемы с телом?
Использование файлов примеров colorbox в Firefox действительно работает (и document.body
определяется там).
Есть ли какой-нибудь способ, которым я мог бы использовать jQuery для пополнения document.body
свойство с чем-то из $()
возможно, или мне следует продолжать работать с drupal, чтобы не помещать тег script вне html-тегов (легче сказать, чем сделать)?
Чтобы прояснить document.body
является null
даже после завершения загрузки страницы.Вот снимок консоли Firebug:
>>> document.body
null
>>> $().attr('body')
null
Решение
Обычная причина 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')
либо.
Другие советы
Не должно быть никакого вывода из Drupal ниже тега body. Проверьте файл тем page.tpl.php
. Конец должен выглядеть примерно так:
<!-- BEGIN closure: must always be last element in body -->
<?php print $closure; ?>
<!-- END closure -->
</body>
</html>
Под выводом переменной $ closure не должно быть оператора print, поскольку это должен быть последний вывод содержимого (но все же в теле).
Разве вы не используете другой JS-фреймворк вместе с jQuery? Если да, вы позаботились о том, чтобы загрузить обе библиотеки, чтобы они оставались совместимыми (порядок, исправление совместимости ...)?
Ну, это странно, но просто добавив эту строку в конец моего $(document).ready(function(){});
исправленного, что бы не сломало тело:
if(null==document.body){document.body = $('body')[0];}
Но мне нужно больше взглянуть на то, почему он сломался, а также почему он не сломался в сафари.
извините, этот ответ не в jquery (в последние пару часов я боролся с чем-то похожим с прототипом).
В основном, верхний ответ от bobince весьма полезен, однако вы можете переназначить тело документа, чтобы найти его.
Это прототип, но вы поняли,
body = $("content").ancestors().last().children[1];
Если контент - это некоторый определенный элемент на странице, который вы можете найти с помощью обычных селекторов, то любой из них может быть использован, это не имеет большого значения, оттуда вы перемещаетесь к вершине, а затем вниз и вдоль элемента body.
Надеюсь, что это поможет, как я уже говорил, моя проблема была похожей, я не уверен, как это будет для вас, но я надеюсь, что это хотя бы вызовет идею у кого-то.