Когда должен я использовать абстракцию типа во встроенных системах

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

20
задан gmuraleekrishna 22 December 2017 в 10:23
поделиться

7 ответов

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

  1. Локальные переменные отличаются от участников структуры и массивов в том смысле, что Вы хотите, чтобы они поместились в регистр. На цели 32b/64b локальное int16_t может сделать код медленнее по сравнению с локальным интервалом, так как компилятор должен будет добавить операции к переполнению/force/согласно семантике int16_t. В то время как C99 определяет intfast_t определение типа, AFAIK, простой интервал поместится в регистр точно также, и это уверенный является более короткое имя.

  2. Организации, которые как эти определения типов почти неизменно заканчивают с несколькими из них (INT32, int32_t, INT32_T, до бесконечности). Организации с помощью встроенных типов таким образом более обеспечены, в некотором смысле, имея всего один набор имен. Мне жаль, что люди не использовали определения типов от stdint.h или windows.h или чего-либо существующего; и когда цель не имеет этого.h файлом, как трудно это должно добавить тот?

  3. определения типов могут теоретически помочь мобильности, но я, со своей стороны, никогда не получал вещь от них. Существует ли полезная система, которую можно портировать от 32b цель к 16b один? Существует ли 16b система, которая не тривиальна к порту к 32b цель? Кроме того, если большая часть Вара будет ints, то Вы на самом деле получите что-то от 32 битов на новой цели, но если они будут int16_t, то Вы не будете. И места, которые тверды к порту, имеют тенденцию требовать ручного контроля так или иначе; перед попыткой порта Вы не знаете, где они. Теперь, если кто-то думает, что настолько легко портировать вещи, если у Вас есть определения типов повсеместно - когда время настает к порту, который происходит с немногими системами, запишите сценарий, преобразовывающий все имена в кодовой базе. Это не должно работать согласно "никакому ручному контролю, требуемому" логика, и это откладывает усилие до момента времени, где это на самом деле приносит пользу.

  4. Теперь, если мобильность может быть теоретическим преимуществом определений типов, удобочитаемость верные движения коту под хвост. Только посмотрите на stdint.h: {int,uint}{max,fast,least}{8,16,32,64}_t. Много типов. Программа имеет много переменных; действительно настолько легко понимать, какой потребностью быть int_fast16_t и который должен быть uint_least32_t? Сколько раз мы тихо преобразовываем между ними, делая их совершенно бессмысленными? (Я особенно как BOOL/Bool/eBool/boolean/bool/int преобразования. Каждая программа, записанная организованной организацией, передающей под мандат определения типов, замусорена этим).

  5. , Конечно, в C++ мы могли сделать систему типов более строгой путем обертывания чисел в инстанцирования шаблонного класса с перегруженными операторами и материалом. Это означает, что Вы теперь получите сообщения об ошибках формы "класс Number< интервал, Наименьшее, 32> не имеет никакого оператора + перегрузка для аргумента класса типа Number< неподписанный длинный длинный, Быстро, 64> кандидаты..." Я не называю эту "удобочитаемость", также. Ваши возможности реализации этих классов обертки правильно являются микроскопическими, и большую часть времени Вы будете ожидать неисчислимых шаблонных инстанцирований для компиляции.

17
ответ дан 30 November 2019 в 00:01
поделиться

Стандарт C99 имеет много целых типов стандартного размера. Если можно использовать компилятор, который поддерживает C99 (gcc, делает), Вы найдете их в <stdint.h>, и можно просто использовать их в проектах.

кроме того, это может быть особенно важно во встроенных проектах использовать типы в качестве своего рода "системы поддержки" для вещей как преобразования единицы. Если можно использовать C++, я понимаю, что существуют некоторые библиотеки "единицы" там, которые позволяют Вам работать в физических единицах измерения, которые определяются системой типов C++ (через шаблоны), которые компилируются как операции на базовых скалярных типах. Например, эти библиотеки не позволят Вам добавить distance_t к mass_t, потому что единицы приводят в порядок не строку; Вы на самом деле получите ошибку компилятора.

, Даже если Вы не можете работать в C++ или другом языке, который позволяет Вам написать код тот путь, можно, по крайней мере, использовать систему типов C, чтобы помочь Вам зафиксировать ошибки как этот глазом. (Который был на самом деле исходным намерением Венгерской записи Simonyi.) Просто, потому что компилятор не будет вопить на Вас для добавления meter_t к gram_t, не означает, что Вы не должны использовать типы как этот. Обзоры кода будут намного более продуктивными при обнаружении ошибок единицы затем.

7
ответ дан 30 November 2019 в 00:01
поделиться

Мое мнение - то, если Вы в зависимости от минимального/максимального/конкретного размера , не делают , просто предполагают, что (говорят) unsigned int, 32 байта - использование uint32_t вместо этого (предполагающий, что Ваш компилятор поддерживает C99).

4
ответ дан 30 November 2019 в 00:01
поделиться

Я полагаю, что стандарты MISRA предлагают (потребуйте?) использование определений типов.

С персональной точки зрения, с помощью определений типов не оставляет беспорядка относительно размера (в битах / байты) определенных типов. Я видел, что ведущие разработчики делают попытку обоих способов разработать при помощи стандартных типов, например, интервала и использовать пользовательские типы, например, UINT32.

, Если код не является портативным, существует мало реально преимущество в использовании определений типов, однако , если как я затем Вы работаете над обоими типами программного обеспечения (портативная и фиксированная среда) затем, может быть полезно сохранить стандарт и использовать типы cutomised. По крайней мере как Вы говорят, программист затем очень знает, сколько памяти они используют. Другой фактор для рассмотрения - насколько 'уверенный' Вы, что код не будет портирован к другой среде? Я видел процессор, определенный код должен быть переведен, поскольку аппаратные средства engieer должны были внезапно изменить плату, это не хорошая ситуация, чтобы быть в, но из-за пользовательских определений типов, это, возможно, было намного хуже!

3
ответ дан 30 November 2019 в 00:01
поделиться

Мне нравится использовать типы stdint.h для определения системных API конкретно, потому что они явно говорят, как большие объекты. Назад в былые времена Palm OS, системные API были определены с помощью набора слабых типов как "Word" и "Меч", которые были наследованы от очень классического Mac OS. Они сделали очистку, чтобы вместо этого сказать Int16, и он сделал API легче для вновь прибывших понять, особенно со странными 16-разрядными проблемами указателя о той системе. Когда они разрабатывали Palm OS Cobalt, они изменили те имена снова для соответствия именам stdint.h, делая его еще более ясным и уменьшающим объем определений типов, которыми они должны были справиться.

4
ответ дан 30 November 2019 в 00:01
поделиться

Непротиворечивость, удобство и удобочитаемость. "UINT32" является намного более читаемым и записываемым, чем "неподписанный длинный длинный", который является эквивалентом для некоторых систем.

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

1
ответ дан 30 November 2019 в 00:01
поделиться

Может я и странный, но я использую ub, ui, ul, sb, si и sl для своих целочисленных типов. Возможно, «i» для 16 бит кажется немного устаревшим, но мне нравится внешний вид ui / si больше, чем uw / sw.

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

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