Элемент, который вы пытались найти, не был в DOM , когда ваш скрипт работал.
Позиция вашего DOM-зависимого скрипта может оказать глубокое влияние на его поведение. Браузеры анализируют HTML-документы сверху донизу. Элементы добавляются в DOM, и сценарии выполняются (как правило), когда они встречаются. Это означает, что порядок имеет значение. Как правило, скрипты не могут найти элементы, которые появляются позже в разметке, потому что эти элементы еще не добавлены в DOM.
Рассмотрим следующую разметку; сценарий # 1 не находит Итак, что вы должны делать? У вас есть несколько вариантов: Переместите свой скрипт дальше по странице, перед закрывающим тегом тела. Организованный таким образом остальная часть документа анализируется до того, как будет выполнен ваш скрипт: Примечание: размещение скриптов внизу как правило, считается лучшей практикой . Отмените свой сценарий до тех пор, пока DOM не будет полностью проанализирован, используя Примечание. Вы можете просто привязать к Делегированные события имеют преимущество в том, что они могут обрабатывать события из элементов-потомков, которые будут добавлены в документ позже. Когда элемент вызывает событие (при условии, что это bubbling g6], и ничто не останавливает его распространение), каждый родитель в родословной этого элемента также получает событие. Это позволяет нам привязать обработчик к существующему элементу и примерным событиям, когда они пузырятся от его потомков ... даже те, которые добавлены после присоединения обработчика. Все, что нам нужно сделать, это проверить событие, чтобы узнать, был ли он поднят нужным элементом и, если да, запустите наш код. jQuery Примечание: Обычно этот шаблон зарезервированы для элементов, которые не существовали во время загрузки или , чтобы избежать прикрепления большого количества обработчиков. Также стоит отметить, что, пока я прикреплял обработчик к Используйте атрибут [ Для справки, вот код из этого внешнего скрипта : Примечание: атрибут
Вариант 1: Переместите свой скрипт
Вариант 2: jQuery's
ready()
ready()
:
DOMContentLoaded
или window.onload
, но у каждого есть свои оговорки. jQuery ready()
предоставляет гибридное решение. Вариант 3: Делегирование событий
on()
выполняет эту логику для нас. Мы просто предоставляем имя события, селектор для желаемого потомка и обработчик событий:
document
(для демонстрационных целей), вы должны выбрать ближайшего надежного предка. Вариант 4: Атрибут
defer
defer
в .
defer
, логический атрибут] установлен для указания на браузера, который должен выполняться после того, как документ был проанализирован.
document.getElementById("test").addEventListener("click", function(e){
console.log("clicked: %o", this);
});
defer
, безусловно, кажется , как волшебная пуля , но важно знать об оговорках ... 1. defer
может использоваться только для внешних скриптов, т. е. для тех, у кого есть атрибут src
. 2. знать о поддержке браузера , то есть: ошибка реализации в IE & lt; 10
Похож на Jeff, использует CruiseControl.NET на основе некоторых пролистывающих расшифровки стенограммы подкаста. Это, кажется, имеет возможности автоматизированного развертывания от управления исходным кодом до производства. Это могло бы быть то, где вставка происходит?
Если Вы используете ASP.Net MVC
(как StackOverflow делает), я записал легкий следовать руководству с 3 шагами по тому, как автоматически получить и отобразить последний пересмотр SVN . Руководство было вдохновлено путем размышления мне об этом самом вопросе!: o)
Мы делаем это с xUnit.net для наших автоматизированных сборок. Мы используем CruiseControl.net
(и испытывают TeamCity). Задача MSBuild, которую мы выполняем для непрерывной интеграции автоматически, изменяет номер сборки для нас, таким образом, получающийся zip-файл сборки содержит правильно имеющий версию набор DLLs и EXEs.
Наш файл MSBuild содержит ссылку UsingTask для DLL, который делает замены регулярного выражения: (Вы можете использовать этот DLL, поскольку он охвачен МН MS лицензией также)
<UsingTask AssemblyFile="3rdParty\CodePlex.MSBuildTasks.dll" TaskName="CodePlex.MSBuildTasks.RegexReplace"/>
Затем, мы извлекаем номер сборки, который обеспечивается автоматически системой CI. Вы могли также заставить своего поставщика управления исходным кодом обеспечивать исходное число пересмотра, если Вы хотите, но мы нашли, что сборка # в системе CI была более полезной, потому что не только видят результаты интеграции номером сборки CI, который также предоставляет ссылку назад на changeset (s), которые были включены в сборку.
<!-- Cascading attempts to find a build number --> <PropertyGroup Condition="'$(BuildNumber)' == ''"> <BuildNumber>$(BUILD_NUMBER)</BuildNumber> </PropertyGroup> <PropertyGroup Condition="'$(BuildNumber)' == ''"> <BuildNumber>$(ccnetlabel)</BuildNumber> </PropertyGroup> <PropertyGroup Condition="'$(BuildNumber)' == ''"> <BuildNumber>0</BuildNumber> </PropertyGroup>
(Мы пробуем BUILD_NUMBER, который является от TeamCity, тогда ccnetlabel, который является с CC.net, и если ни один не присутствует, мы принимаем значение по умолчанию к 0, так, чтобы мы могли протестировать автоматизированный сценарий сборки вручную.)
Затем, у нас есть задача, которая устанавливает номер сборки в файл GlobalAssemblyInfo.cs, который мы связываем во все наши проекты:
<Target Name="SetVersionNumber"> <RegexReplace Pattern='AssemblyVersion\("(\d+\.\d+\.\d+)\.\d+"\)' Replacement='AssemblyVersion("$1.$(BuildNumber)")' Files='GlobalAssemblyInfo.cs'/> <Exec Command="attrib -r xunit.installer\App.manifest"/> </Target>
Эта находка атрибут AssemblyVersion и замены a.b.c.d номер версии с a.b.c. BuildNumber. Мы будем обычно уезжать, источник зарегистрировался в дереве с первыми тремя частями числа разработчика, зафиксированного, и четвертое в нуле (f.e., сегодня это 1.0.2.0).
В Вашем процессе сборки, удостоверьтесь, что задача SetVersionNumber предшествует Вашей задаче сборки. В конце мы используем нашу задачу Zip для на молнии результаты сборки так, чтобы у нас была история двоичных файлов для каждой автоматизированной сборки.
@Balloon при использовании TortoiseSVN можно использовать упакованный программа SubWCRev . Это запрашивает рабочую копию и говорит Вам просто самое высокое количество пересмотра. По общему признанию это, кажется, клиентский подход к проблеме серверной стороны, но так как это - хорошая программа командной строки, необходимо быть в состоянии получить ее вывод для использования довольно легко.
$rev
и другие как он изменения для отдельных файлов, таким образом, они не изменятся, если файл не изменится. Число на веб-странице (скорее всего, я принимаю здесь), svn число пересмотра для целого проекта. Это отличается, чем версии файла, на которые указывали другие.
В этом случае я предполагаю, что CCNET вытягивает количество пересмотра проекта и переписывает часть веб-страницы с тем числом. Любое решение CI должно быть в состоянии сделать это, установить это самостоятельно с CCNET и Teamcity (хотя не веб-страницы, но автоматическое управление версиями версий развертывания/блока).
Для Вас, чтобы сделать это, используйте решение CI, которое поддерживает его, или используйте свой процесс сборки (MSbuild/Nant), чтобы сохранить ту версию и записать его в файлы прежде, чем "развернуть" его.
Добавить к ответу @BradWilson: "Вы могли также заставить своего поставщика управления исходным кодом обеспечивать исходное число пересмотра, если Вы хотите"
соединить Подрывную деятельность и MSBuild: Проект
Задач Сообщества MSBuildМожно сделать это путем добавления следующего где угодно в коде
$Id:$
Таким образом, например, @Jeff сделал:
<div id="svnrevision">svn revision: $Id:$</div>
и при проверке в замененном $Id сервера: $ с текущим числом пересмотра. Я также нашел эту ссылку.
Существует также $Date: $, $Rev: $, $Revision: $