2014-10-18 4 views
0

Pass «это» неявно через инлайн событие слушателем

var fn = (function() { 
 

 
    return { 
 
    'init': function(className) { 
 
     // Access <a> tag here and apply className 
 
    } 
 
    }; 
 

 
}());
<a href="#" onmouseover="fn.init('myClass')">Link</a>

В приведенном выше фрагменте кода, было бы можно неявно передать this в fn.init?

Я понимаю, что я могу изменить декларацию fn.init в function(className, el) и использовать onmouseover="fn.init('myClass', this)" для доступа к элементу, но я просто любопытен, если это было бы возможно без прохождения this в слушателе рядных событий.

+0

Возможно, вам следует пересмотреть использование встроенных обработчиков событий в первую очередь. Они были ... из моды на * годы * сейчас. Может быть, вы пытаетесь решить проблему, которую вы бы даже не сделали, если бы изменили свой подход. – Tomalak

ответ

1

Вы также можете использовать call (я понимаю, что вы сказали, что не хотите пропускать this во встроенном прослушивателе событий, но это, вероятно, единственный способ). Единственный другой способ - использовать addEventListener и не использовать встроенное событие.

var fn = (function() { 
 

 
    return { 
 
    'init': function(className) { 
 
     // Notice that I can use "this" in this function 
 
     // Which refers to the <a> element 
 
     this.className = className; 
 
    } 
 
    }; 
 

 
}());
.myClass { 
 
    color: red; 
 
}
<a href="#" onmouseover="fn.init.call(this, 'myClass')">Link</a>

Если вы хотите добавить событие к каждому <a> элемента, вы могли бы сделать это:

var elems = document.getElementsByTagName("a"); 
for (var i = 0; i < elems.length; ++i) { 
    elems[i].addEventListener("click", function() { 
    fn.init.call(this, 'myClass'); 
    }, false); 
} 

Или, если вы используете только современные браузеры (не IE)

var elems = document.getElementsByTagName("a"); 
for (var i = 0; i < elems.length; ++i) { 
    elems[i].addEventListener("click", fn.init.bind(elems[i], 'myClass'), false); 
} 
+1

То есть, однако, явный, не подразумеваемый, как задает вопрос. – Quentin

+0

@Quentin Просто указывая, что можно установить значение 'this', но неявно. – soktinpk

+0

Это интересная идея. Предположим, вы хотели добавить прослушиватель событий ко всем элементам 'a', будет ли' '' 'соответствовать каждому элементу с помощью этого метода? – esswilly

1

Нет. Вы получаете новое значение this каждый раз, когда вы вызываете функцию.

fn.init('myClass') - это другой вызов функции для theElement.onmouseover(event).

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

+0

Правильно, так что даже если 'fn.init' вызывается в области тега' ', функция не имеет способа узнать, где в DOM она была вызвана? – esswilly

+0

Исправить. Невозможно узнать значение переменной 'this' (или любой другой переменной), удерживаемой в функции, вызывающей текущую функцию. – Quentin