Присвоение в Perl троичные проблемы условного оператора

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

40
задан Florent Bayle 17 July 2014 в 10:57
поделиться

5 ответов

Это объяснено в документации Perl .

из-за приоритета оператора Perl оператор анализируется как

($condition ? $a= 2 : $a ) = 3 ;

поскольку?: оператор приводит к присваиваемому результату, 3 присвоен результату условия.

, Когда $condition верен, что это означает ($a=2) =3$a=3 предоставления

, Когда $condition является ложью, это означает ($a) =3$a=3 предоставления

корректный способ записать, что это

$a = ( $condition ? 2 : 3 );
print $a;

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

79
ответ дан Pat 27 November 2019 в 01:03
поделиться

Как только у Вас есть подозрение, что Вы могли бы страдать от проблем приоритета, прием для выяснения, какой Perl думал, что Вы имели в виду:

perl -MO=Deparse,-p -e '$condition ? $a= 2 : $a= 3 ; print $a;'

В Вашем случае, это покажет Вам:

(($condition ? ($a = 2) : $a) = 3);
print($a);
-e syntax OK

..., в которой точке необходимо говорить, "о, который объясняет его"!

40
ответ дан brian d foy 27 November 2019 в 01:03
поделиться

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

$condition ? ($a=2) : ($a=3);

Это было бы полезно, если Вы присваиваете различным переменным на основе условия.

$condition ? ($a=2) : ($b=3);

И если Вы выбираете переменную, но присваиваете то же самое, неважно, что, Вы могли даже сделать это:

($condition ? $a : $b) = 3;
21
ответ дан Tithonium 27 November 2019 в 01:03
поделиться

Из-за приоритета оператора Perl оператор анализируется как:

($condition ? $a = 2 : $a ) = 3 ;

, поскольку?: оператор приводит к присваиваемому результату, 3 присвоен результату условия.

, Когда $condition верен, что это означает $a=3 предоставления $a=2=3

, Когда $condition является ложью, это означает $a=3 предоставления $a=3

корректный способ записать, что это

$a = $condition ? 2 : 3;

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

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

$x < 3 ? foo($x) : bar($y);

Или как это?

if ($x < 3) {
  $foo($x);
} else {
  $bar($y);
}
4
ответ дан raldi 27 November 2019 в 01:03
поделиться

Одно предложение к ответу Tithonium выше:

, Если Вы, хотят присвоить различные значения той же переменной, это могло бы быть лучше (пропись путь):

$a = ($condition)? 2: 3;

0
ответ дан Jagmal 27 November 2019 в 01:03
поделиться
Другие вопросы по тегам:

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