Короткие и простые: поскольку элементы, которые вы ищете, не существуют в документе (пока).
В оставшуюся часть этого ответа я буду использовать getElementById
как пример, но то же самое относится к getElementsByTagName
, querySelector
и любому другому методу DOM, который выбирает элементы.
Возможные причины
Есть две причины, по которым элемент может не существовать:
getElementById
, действительно соответствует идентификатору существующего элемента в (сгенерированном) HTML и что у вас не было с ошибкой идентификатор (идентификаторы чувствительный !). Кстати, в большинстве современных браузеров , которые реализуют методы querySelector()
и querySelectorAll()
, нотация стиля CSS используется для извлечения элемента его id
, например: document.querySelector('#elementID')
, в отличие от способа, с помощью которого элемент извлекается его id
в [[16]; в первом символе #
необходимо, во втором это приведет к тому, что элемент не будет извлечен. getElementById
]. Последний случай довольно распространен. Браузеры анализируют и обрабатывают HTML сверху вниз. Это означает, что любой вызов элемента DOM, который встречается до появления этого элемента DOM в HTML, не будет выполнен.
Рассмотрим следующий пример:
Появляется div
после script
. В настоящий момент сценарий выполняется, элемент не существует , но и getElementById
вернут null
.
jQuery
То же самое относится к все селекторы с jQuery. jQuery не найдет элементов, если вы ошибочно написали ваш селектор, или вы пытаетесь выбрать их , прежде чем они на самом деле существуют .
Добавленный поворот - это когда jQuery не найден потому, что вы загрузили скрипт без протокола и запускаетесь из файловой системы:
этот синтаксис используется, чтобы позволить сценарию загружаться через HTTPS на странице с протоколом https: // и для загрузки HTTP-версии на странице с протоколом http: //
У этого есть неудачный побочный эффект попытки и невозможность загрузить file://somecdn.somewhere.com...
Решения
Прежде чем позвонить getElementById
(или любой метод DOM, если на то пошло), убедитесь, что элементы, к которым вы хотите получить доступ, существуют, т. е. загружается DOM.
Это может быть обеспечено просто добавив ваш JavaScript после к соответствующему элементу DOM
, и в этом случае вы также можете поместить код непосредственно перед тегом закрывающего тела (
) (все DOM элементы будут доступны в момент выполнения скрипта). [/ g3 6]
Другие решения включают прослушивание событий load
[MDN] или DOMContentLoaded
[MDN] . В этих случаях не имеет значения, где в документе вы помещаете код JavaScript, вам просто нужно запомнить, чтобы весь обработчик DOM обрабатывался в обработчиках событий.
Пример:
window.onload = function() {
// process DOM elements here
};
// or
// does not work IE 8 and below
document.addEventListener('DOMContentLoaded', function() {
// process DOM elements here
});
Более подробную информацию об обработке событий и различиях браузера см. в статьях на странице quirksmode.org .
jQuery
Сначала убедитесь, что jQuery загружен правильно , Используйте инструменты разработчика браузера , чтобы узнать, был ли найден файл jQuery и исправлен ли URL-адрес, если он не был (например, добавьте схему http:
или https:
в начале, отрегулируйте путь, и т. д.)
Прослушивание событий load
/ DOMContentLoaded
- это именно то, что делает jQuery с .ready()
[docs] . Весь ваш код jQuery, который влияет на элемент DOM, должен находиться внутри этого обработчика событий.
На самом деле в учебнике j8uery явно указано:
Как почти все, что мы делаем при использовании jQuery, читает или манипулирует объектной моделью документа (DOM), мы должны убедиться, что мы начинаем добавлять события и т. д., как только DOM готов.
Для этого мы регистрируем готовое событие для документа.
blockquote>$(document).ready(function() { // do stuff when DOM is ready });
В качестве альтернативы вы также можете использовать сокращенный синтаксис:
$(function() { // do stuff when DOM is ready });
Оба эквивалентны.
Для установки Apache ( не PHP) журнал самый легкий способ сделать, это должно было бы сделать:
<VirtualHost IP:Port>
# Stuff,
# More Stuff,
ErrorLog /path/where/you/want/the/error.log
</VirtualHost>
, Если нет никакого продвижения "/", это, как предполагается, относительно.
Журнала ошибок Apache Я обычно просто определяю это в .htaccess
файл или vhost.conf
на домене, я продолжаю работать. Добавьте это к одному из этих файлов:
php_admin_value error_log "/var/www/vhosts/example.com/error_log"
Поведение по умолчанию для error_log () для вывода к журналу ошибок Apache. Если этого не происходит, проверяют, что Ваши настройки php.ini для error_log директивы - оставляют его сбросом для использования файла журнала Apache для текущего vhost.
Вы попытались добавить php_value error_log '/path/to/php_error_log
к своей конфигурации VirtualHost?
Да, можно попробовать,
php_value error_log "/var/log/php_log"
в .htaccess
, или Вы можете сделать, чтобы пользователи использовали ini_set()
в начале их сценариев, если они хотят иметь вход.
Другая опция состояла бы в том, чтобы позволить сценариям принять значение по умолчанию к php.ini
в папке со сценарием, затем перейдите к корневой папке пользователя/хоста, затем к корню сервера или чему-то подобному. Это позволило бы хостам добавлять свое собственное php.ini
значения и их собственное error_log
местоположения.
Мой Apache имел что-то вроде этого в httpd.conf. Просто измените настройки ErrorLog и CustomLog
<VirtualHost myvhost:80>
ServerAdmin webmaster@dummy-host.example.com
DocumentRoot /opt/web
ServerName myvhost
ErrorLog logs/myvhost-error_log
CustomLog logs/myvhost-access_log common
</VirtualHost>
Вы могли попробовать:
<VirtualHost myvhost:80>
php_value error_log "/var/log/httpd/vhost_php_error_log"
</Virtual Host>
, Но я не уверен, собирается ли работать. Я примерил свои сайты без успеха.
Если вы хотите проверить условие в начале цикла, просто отмените условие в стандартном цикле while
:
while(!cond) { ... }
Если вам это нужно в конце, используйте do
...
Не устанавливать error_log
туда, куда помещается ваш системный журнал
, например, / var / log / apache2
, потому что их ошибки будут перехвачены ErrorLog
. Вместо этого создайте подкаталог
в своей папке проекта для журналов и выполните php_value
error_log «/ path / to / project / logs»
. Это касается как файлов .htaccess
, так и vhosts . Также убедитесь, что вы установили php_flag
log_errors
на
Если кто-то придет посмотреть, это должно выглядеть так:
<VirtualHost *:80>
ServerName example.com
DocumentRoot /var/www/domains/example.com/html
ErrorLog /var/www/domains/example.com/apache.error.log
CustomLog /var/www/domains/example.com/apache.access.log common
php_flag log_errors on
php_flag display_errors on
php_value error_reporting 2147483647
php_value error_log /var/www/domains/example.com/php.error.log
</VirtualHost>
Это только для разработки, так как display_error
включен. Вы заметите, что журнал ошибок Apache отделен от журнала ошибок PHP. Хорошая информация находится в php.error.log
.
Посмотрите здесь ключ error_reporting
http://www.php.net/manual/en/errorfunc.configuration.php#ini.error-reporting