Страницы

Поиск по вопросам

пятница, 20 декабря 2019 г.

Почему this в onclick необязателен?

#javascript #html #события


Почему в onclick работает innerHTML^=1, хотя по идее должно быть this.innerHTML^=1?



/* ignore css */ p { float: left; font-size: 4em; width: 2em; line-height: 2em; border:
1px solid; text-align: center; margin: 0; cursor: pointer; background: silver; -webkit-user-select:
none; -moz-user-select: none; -ms-user-select: none; user-select: none; } p + p { margin-left:
.125em; }

0

0


Ответы

Ответ 1



Внутренний сырой неоткомпилированный обработчик это тупль со следующей информацией: Неоткомпилированное тело скрипта Место происхождения тела скрипта, если необходимо сообщить об ошибке Когда пользовательский агент(ПА) получает текущее значение обработчика события H, он должен выполнить эти шаги: Если значение H – внутренний сырой неоткомпилированный обработчик, выполнить эти подшаги: Если H это обработчик события элемента, то пусть element это элемент, а document – Document элемента. Иначе, H это обработчик события объекта Window: пусть element будет null, и пусть document это Document, ассоциированный самым последним с этим Window-объектом. Если document – не в контексте браузинга, или если скриптинг включён для контекст браузинга document'а, тогда возвратить null и прервать алгоритм получения текущего значения обработчика события. Пусть body это неоткомпилированное тело скрипта во внутреннем сыром неоткомпилированном обработчике. Пусть location это место, из которого происходит тело скрипта, как задано внутренним сырым неоткомпилированным обработчиком. Если element – не null и element имеет владельца формы, пусть form owner это владелец формы. Иначе – пусть form owner будет null. Пусть script settings это объект настроек скрипта, созданный для объекта Window, с которым document в настоящее время ассоциирован. Получить окружение выполнения скрипта для JavaScript из script settings. Если body не разбирабельно как FunctionBody, или если при парсинге выявляется ошибка early error, тогда следовать этим подшагам: Установить H со значением null. Сообщить об ошибке для соответствующего script со соответствующей позицией (номер строки и номер столбца), заданной в location, используя глобальный объект, специфицированный в script settings, в качестве цели. Если ошибка по-прежнему не обработана после этого, тогда о ней можно сообщить пользователю. Перескочить ниже на шаг end. Примечание: FunctionBody определена в ECMAScript edition 5 section 13 Function Definition. Ошибка Early error определена в ECMAScript edition 5 section 16 Errors. [ECMA262] Если body начинается с Directive Prologue, содержащего Use Strict Directive, тогда пусть strict будет true, иначе – пусть strict будет false. Примечание: Термины "Directive Prologue" и "Use Strict Directive" определены в ECMAScript edition 5 section 14.1 Directive Prologues and the Use Strict Directive. [ECMA262] Используя окружение выполнения скрипта, полученное выше, создать объект функции (как определено в ECMAScript edition 5 section 13.2 Creating Function Objects), с: Списком параметров FormalParameterList Если H это обработчик события onerror объекта Window: Пусть функция имеет 5 аргументов: event, source, lineno, colno и error. Иначе: Пусть функция имеет один аргумент event. Тело функции FunctionBody: Результат парсинга body выше. Лексическое окружение Scope: Пусть Scope это результат NewObjectEnvironment(document, global environment). Если form owner не null, пусть Scope это результат NewObjectEnvironment(>form owner, Scope). Если element не null, пусть Scope это результат NewObjectEnvironment(element, Scope). Примечание: NewObjectEnvironment() определена в ECMAScript edition 5 section 10.2.2.3 NewObjectEnvironment (O, E). [ECMA262] Булев флаг Strict Значение strict. Пусть function это данная новая функция. Пусть script это новый скрипт. Пусть кодовой точкой входа script'а будет function. Пусть объектом настроек script'а будет script settings. Установить H в function. End: Возвратить значение H.

Ответ 2



Если коротко и на пальцах, то при использовании инлайн-обработчиков неявно генерируется примерно такой код: with(document) with(currentElement.form) with(currentElement) currentElement.addEventListener("click", function (event) { // Тут содержимое атрибута onclick }) Более формальный алгоритм можно будет увидеть по ссылке, которую привел Grundy: https://www.w3.org/TR/html5/webappapis.html#internal-raw-uncompiled-handler

Ответ 3



В поддержку своей версии о том, что атрибуты onxxxx выполняются примерно как with (this) eval(script) привожу сниппет: var el = document.createElement('P'); el.a='Ok'; el.setAttribute('onclick', 'console.info(a, this.a)'); el.click(); Как видим, это работает даже с только что созданным свойством. Почему и где найти спецификацию к этому не знаю. Также не исключаю, что это работает не во всех браузерах.

Комментариев нет:

Отправить комментарий