Итак, в JavaScript есть несколько основных концепций функций, которые должны помочь.Прежде всего: для работы с событиями DOM вам, вероятно, захочется использовать библиотеку, если вы не имеете буквально 0 ожиданий совместимости браузера.Я предлагаю изучить jQUery .
. Тем не менее, ненавязчивый JavaScript (согласно ответу @Raynos) является правильным способом связывания событий в JavaScript и дает вам большую гибкость.Возьмем следующий пример:
function setup_events(){
var my_form = document.form[0],
form_name = my_form.name;
my_form.addEventListener("submit", function(event) {
console.log( form_name ); // this is retained through the closure.
});
}
Вы видите, что можете связать данные в функции событий, используя концепцию замыкания или контекст внешней области видимости после того, как внешняя область видимости вернулась из внутренней области видимости.Теперь, когда вы выполните setup_events, вы свяжете событие submit
с функцией, которая внутренне имеет доступ к внешней переменной form_name.Это может привести к некоторым неприятным побочным эффектам, если вы не понимаете область действия функции, поэтому ищите код, подобный следующему:
// XXX : BAD CODE
function setup_events(){
var ul = document.getElementsByTagName('ul')[0], // assumes there is a <ul>
count = 0;
for ( var li in ul.childNodes ) {
li.addEventListener('click', function( event ){
alert( count ++ ); // this will always alert the count of list, not the list position
}
}
}
Вы можете использовать выражений немедленного вызова функций , чтобы создать необходимые замыкания длясохранить правильное состояние.Таким образом, чтобы «исправить» приведенный выше код, вы должны использовать что-то вроде:
// XXX : BETTER CODE
/**
* NOTE: NEVER CREATE FUNCTIONS INSIDE A LOOP
* this example only shows the immediate solution to the above problem
* with regard to function scope and closures.
*/
function setup_events(){
var ul = document.getElementsByTagName('ul')[0], // assumes there is a <ul>
count = 0;
for ( var li in ul.childNodes ) {
li.addEventListener('click', (function( count ){
return function ( event ){
alert( count ); // this will alert the position in the list
};
})(count ++))
}
}