Почему document.body == null в Firefox, но не в Safari - PullRequest
4 голосов
/ 27 октября 2009

У меня проблема со страницей, где я пытаюсь заставить работать colorbox (своего рода лайтбокс для 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

Ответы [ 5 ]

9 голосов
/ 27 октября 2009

Обычная причина, по которой document.body равен нулю, заключается в том, что вы выполняете скрипт до того, как встретится тег <body> (*). Не видя код, я не могу сказать наверняка, но это было бы обычной причиной. Переместитесь туда, куда вы положили сценарии.

(*: или другой элемент, такой как <p>, который, как известно браузеру, не может появиться вне тела, и в этом случае он молча добавляет <body>, чтобы исправить вашу отсутствующую разметку. Разница в разборе некоторых теги «обычно в теле» могут объяснить, почему Safari позволяет вам сойти с рук.)

Может ли это быть причиной того, что у FF возникли проблемы с телом?

Нет. Это сломанная разметка, и Drupal не должен этого делать, но закрытие </body> не останавливает document.body, ссылающуюся на соответствующий DOM Node.

Можно ли как-нибудь использовать jQuery для пополнения документа. Body

Нет, document.body отражает только в основном то же, что и document.getElementsByTagName('body')[0], поэтому пытаться установить его не имеет смысла, и если вы не можете найти тело с document.body, jQuery не сможет найти это с $('body') либо.

1 голос
/ 02 апреля 2010

Разве вы не используете другой JS-фреймворк вместе с jQuery? Если да, вы позаботились о том, чтобы загрузить обе библиотеки, чтобы они оставались совместимыми (порядок, исправление совместимости ...)?

1 голос
/ 27 октября 2009

Не должно быть никакого вывода из Drupal ниже тега body. Проверьте ваши темы page.tpl.php файл. Конец должен выглядеть примерно так:

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

</body>
</html>

Под выводом переменной $ closure не должно быть оператора print, поскольку это должен быть последний вывод содержимого (но все равно в теле).

0 голосов
/ 28 сентября 2010

извините, этот ответ не в jquery (за последние пару часов я боролся с чем-то похожим с прототипом).

В основном, верхний ответ от bobince весьма полезен, однако вы можете переназначить тело документа, трюк находит его.

Это прототип, но вы поняли,

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

Если контент - это некоторый определенный элемент на странице, который вы можете найти с помощью обычных селекторов, любой из них может быть использован, это не имеет большого значения, оттуда вы перемещаетесь к вершине, а затем вниз и вдоль элемента body.

Надеюсь, что это помогает, как я уже говорил, моя проблема была похожей, я не уверен, как это будет для вас, но я надеюсь, что это хотя бы вызовет идею у кого-то.

0 голосов
/ 27 октября 2009

Ну, это странно, но просто добавив эту строку в нижней части моего $(document).ready(function(){}); исправлено все, что сломало тело:

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

Но мне нужно больше взглянуть на то, почему он сломался, а также почему он не сломался в сафари.

...