Я знаю, что это плохая практика. Не пишите такой код, если это вообще возможно.
Конечно, мы всегда оказываемся в ситуациях, когда умный фрагмент встроенного Javascript может быстро решить проблему.
Я преследую этот вопрос, чтобы полностью понять, что происходит (и потенциальные ловушки), когда написано что-то вроде этого:
<a href="#" onclick="alert('Hi')">Click Me</a>
Насколько я могу судить, функционально это то же самое, что и
<script type="text/javascript">
$(function(){ // I use jQuery in this example
document.getElementById('click_me').onclick =
function () { alert('Hi'); };
});
</script>
<a href="#" id="click_me">Click Me</a>
Исходя из этого, кажется, что строка, назначенная атрибуту onclick
, вставляется в анонимную функцию, которая назначается обработчику щелчка элемента. Так ли это на самом деле?
Потому что я начинаю делать такие вещи:
<a href="#" onclick="$(this).next().fadeIn(); return false;">Display my next sibling</a> <!-- Return false in handler so as not to scroll to top of page! -->
Что работает. Но я не знаю, насколько это взлом. Это выглядит подозрительно, потому что нет явной функции, из которой возвращается!
Вы можете спросить, почему ты это делаешь, Стив? Встроенный JS - плохая практика!
Честно говоря, я устал редактировать три разных раздела кода только для того, чтобы изменить один раздел страницы, особенно когда я просто создаю прототип, чтобы посмотреть, будет ли это вообще работать. Это намного проще, а иногда даже имеет смысл, чтобы код, специально связанный с этим элементом HTML, был определен прямо внутри элемента: когда через 2 минуты я решаю, что это была ужасная, ужасная идея, я могу уничтожить весь div (или что-то еще ), и у меня нет кучи таинственного мусора JS и CSS, висящего на остальной части страницы, хоть сколько-нибудь замедляющего рендеринг. Это похоже на концепцию локальности ссылки, но вместо промахов кеша мы смотрим на ошибки и раздувание кода.
источник
#click_me
привязать запрос к событию DOMready или разместить сценарий после узла.document.getElementById("click_me").onclick;
. Или предупредить об этом. Вы увидите, что это функция.Ответы:
У вас почти все правильно, но вы не учли
this
значение, указанное во встроенном коде.на самом деле ближе к:
Встроенные обработчики событий устанавливаются
this
равными цели события. Вы также можете использовать анонимную функцию во встроенном скриптеисточник
event
с помощью встроенногоonclick='myFunction(event)'
??Что делает браузер, когда у вас есть
заключается в том, чтобы установить фактическое значение «onclick» примерно таким:
То есть он создает функцию, которая ожидает параметр «событие». (В IE нет; это больше похоже на простую анонимную функцию.)
источник
event
для получения события (и исходного элемента от него черезevent.target
) из моего встроенного фрагмента JS! Прохладно.event
параметр, но если вы используетеevent
внутри этой анонимной функции, IE будет понимать ее как фактический объект события. Поскольку анонимная функция установлена как свойствоwindow
объекта в IE, она будет видеть это какwindow.event
.Кажется, существует много плохой практики , связанной с атрибутами обработчика событий. Плохая практика - это незнание и использование доступных функций там, где это наиболее целесообразно. Атрибуты событий полностью документированы W3C, и в них нет ничего плохого. Это ничем не отличается от размещения встроенных стилей, которые также документированы W3C и могут быть полезны в разы. Независимо от того, помещаете ли вы его в теги сценария или нет, он будет интерпретироваться одинаково.
https://www.w3.org/TR/html5/webappapis.html#event-handler-idl-attributes
источник
bad practice/spaghettification
у одних швов , естьgood practice/structure
у других.Лучший способ ответить на ваш вопрос - увидеть его в действии.
В js
Как вы видите
console
, если вы используете хром, он печатает анонимную функцию с переданным объектом события, хотя в IE это немного отличается.Я согласен с некоторыми из ваших замечаний о встроенных обработчиках событий. Да, их легко написать, но я не согласен с вашей точкой зрения о необходимости изменять код в нескольких местах, если вы хорошо структурируете свой код, вам не нужно этого делать.
источник
<button onclick="login()"> test login </button>
отлично подходит для прототипирования. Вы хотите протестировать что-то, что требует взаимодействия с пользователем прямо сейчас, и вы все равно собираетесь удалить это позже. Зачем писать лишний код повсюду?Это анонимная функция, которая была привязана к событию щелчка объекта.
Какого черта ты такой… Да ладно, как ты сказал, это действительно широко распространенная плохая практика :)
источник
Попробуйте это в консоли:
В Chrome это показывает:
... и нестандартное
name
свойствоdiv.onclick
IS"onclick"
.Итак, анонимно это или нет, зависит от вашего определения «анонимности». Сравните с чем-то вроде
var foo = new Function()
, гдеfoo.name
пустая строка, иfoo.toString()
выдаст что-то вродеисточник