jQuery: Включить кнопку отправки только в том случае, если пользователь вводит правильный формат строки [дубликат]

Элемент, который вы пытались найти, не был в 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

26
задан Smurfette 25 July 2013 в 16:58
поделиться

4 ответа

Вы создаете регулярное выражение, передавая строку конструктору RegExp.

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

27
ответ дан Quentin 18 August 2018 в 03:54
поделиться

Внутри кода, в котором вы создаете строку, обратная косая черта сначала является символом escape-кода javascript, что означает, что escape-последовательности, такие как \t, \n, \" и т. д., будут переведены в их javascript-аналог (вкладка, новая строка, цитата и т. д.), и это будет сделано частью строки. Double-backslash представляет собой одиночную обратную косую черту в самой собственно строке, поэтому, если вам нужна обратная косая черта в строке, вы сначала избегаете ее.

Итак, когда вы создаете строку, говоря var someString = '(\\s|^)' re действительно делает создание фактической строки со значением (\s|^).

12
ответ дан Joe Enos 18 August 2018 в 03:54
поделиться

\ используется в Strings для вызова специальных символов. Если вам нужна обратная косая черта в вашей строке (например, для \ in \ s), вам нужно избежать ее с помощью обратного слэша. Итак, \ становится \\.

EDIT: Даже нужно было сделать это здесь, потому что \\ в моем ответе обратился к \.

3
ответ дан schlicht 18 August 2018 в 03:54
поделиться

Regex нуждается в строчном представлении \s, которое в JavaScript может быть получено с использованием литерала "\\s".

Вот живой пример, чтобы проиллюстрировать, почему "\s" недостаточно:

alert("One backslash:          \s\nDouble backslashes: \\s");

Обратите внимание, как дополнительный \ перед \s изменяет выход.

3
ответ дан Wiktor Stribiżew 18 August 2018 в 03:54
поделиться
Другие вопросы по тегам:

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