Как я синхронизирую число пересмотра SVN со своим веб-сайтом ASP.NET?

Элемент, который вы пытались найти, не был в DOM , когда ваш скрипт работал.

Позиция вашего DOM-зависимого скрипта может оказать глубокое влияние на его поведение. Браузеры анализируют HTML-документы сверху донизу. Элементы добавляются в DOM, и сценарии выполняются (как правило), когда они встречаются. Это означает, что порядок имеет значение. Как правило, скрипты не могут найти элементы, которые появляются позже в разметке, потому что эти элементы еще не добавлены в DOM.

Рассмотрим следующую разметку; сценарий # 1 не находит

, а сценарий # 2 преуспевает:


test div

Итак, что вы должны делать? У вас есть несколько вариантов:


Вариант 1: Переместите свой скрипт

Переместите свой скрипт дальше по странице, перед закрывающим тегом тела. Организованный таким образом остальная часть документа анализируется до того, как будет выполнен ваш скрипт:


  
  

Примечание: размещение скриптов внизу как правило, считается лучшей практикой .


Вариант 2: jQuery's ready()

Отмените свой сценарий до тех пор, пока DOM не будет полностью проанализирован, используя ready() :



Примечание. Вы можете просто привязать к DOMContentLoaded или window.onload, но у каждого есть свои оговорки. jQuery ready() предоставляет гибридное решение.


Вариант 3: Делегирование событий

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

blockquote>

Когда элемент вызывает событие (при условии, что это bubbling g6], и ничто не останавливает его распространение), каждый родитель в родословной этого элемента также получает событие. Это позволяет нам привязать обработчик к существующему элементу и примерным событиям, когда они пузырятся от его потомков ... даже те, которые добавлены после присоединения обработчика. Все, что нам нужно сделать, это проверить событие, чтобы узнать, был ли он поднят нужным элементом и, если да, запустите наш код.

jQuery on() выполняет эту логику для нас. Мы просто предоставляем имя события, селектор для желаемого потомка и обработчик событий:



Примечание: Обычно этот шаблон зарезервированы для элементов, которые не существовали во время загрузки или , чтобы избежать прикрепления большого количества обработчиков. Также стоит отметить, что, пока я прикреплял обработчик к document (для демонстрационных целей), вы должны выбрать ближайшего надежного предка.


Вариант 4: Атрибут defer

Используйте атрибут defer в

Для справки, вот код из этого внешнего скрипта :

document.getElementById("test").addEventListener("click", function(e){
   console.log("clicked: %o", this); 
});

Примечание: атрибут defer, безусловно, кажется , как волшебная пуля , но важно знать об оговорках ... 1. defer может использоваться только для внешних скриптов, т. е. для тех, у кого есть атрибут src. 2. знать о поддержке браузера , то есть: ошибка реализации в IE & lt; 10

91
задан Insane Skull 29 December 2015 в 06:27
поделиться

7 ответов

Похож на Jeff, использует CruiseControl.NET на основе некоторых пролистывающих расшифровки стенограммы подкаста. Это, кажется, имеет возможности автоматизированного развертывания от управления исходным кодом до производства. Это могло бы быть то, где вставка происходит?

30
ответ дан Insane Skull 24 November 2019 в 06:51
поделиться

Если Вы используете ASP.Net MVC (как StackOverflow делает), я записал легкий следовать руководству с 3 шагами по тому, как автоматически получить и отобразить последний пересмотр SVN . Руководство было вдохновлено путем размышления мне об этом самом вопросе!: o)

17
ответ дан Insane Skull 24 November 2019 в 06:51
поделиться

Мы делаем это с 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 для на молнии результаты сборки так, чтобы у нас была история двоичных файлов для каждой автоматизированной сборки.

26
ответ дан Insane Skull 24 November 2019 в 06:51
поделиться

@Balloon при использовании TortoiseSVN можно использовать упакованный программа SubWCRev . Это запрашивает рабочую копию и говорит Вам просто самое высокое количество пересмотра. По общему признанию это, кажется, клиентский подход к проблеме серверной стороны, но так как это - хорошая программа командной строки, необходимо быть в состоянии получить ее вывод для использования довольно легко.

10
ответ дан nickf 24 November 2019 в 06:51
поделиться

$rev и другие как он изменения для отдельных файлов, таким образом, они не изменятся, если файл не изменится. Число на веб-странице (скорее всего, я принимаю здесь), svn число пересмотра для целого проекта. Это отличается, чем версии файла, на которые указывали другие.

В этом случае я предполагаю, что CCNET вытягивает количество пересмотра проекта и переписывает часть веб-страницы с тем числом. Любое решение CI должно быть в состоянии сделать это, установить это самостоятельно с CCNET и Teamcity (хотя не веб-страницы, но автоматическое управление версиями версий развертывания/блока).

Для Вас, чтобы сделать это, используйте решение CI, которое поддерживает его, или используйте свой процесс сборки (MSbuild/Nant), чтобы сохранить ту версию и записать его в файлы прежде, чем "развернуть" его.

9
ответ дан Insane Skull 24 November 2019 в 06:51
поделиться

Добавить к ответу @BradWilson: "Вы могли также заставить своего поставщика управления исходным кодом обеспечивать исходное число пересмотра, если Вы хотите"

соединить Подрывную деятельность и MSBuild: Проект

Задач Сообщества MSBuild
5
ответ дан Insane Skull 24 November 2019 в 06:51
поделиться

Можно сделать это путем добавления следующего где угодно в коде

$Id:$

Таким образом, например, @Jeff сделал:

<div id="svnrevision">svn revision: $Id:$</div>

и при проверке в замененном $Id сервера: $ с текущим числом пересмотра. Я также нашел эту ссылку.

Существует также $Date: $, $Rev: $, $Revision: $

24
ответ дан Insane Skull 24 November 2019 в 06:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: