За последние 24 часа нас посетили 18608 программистов и 1614 роботов. Сейчас ищут 1824 программиста ...

Динамическое назначение обработчика + this

Тема в разделе "JavaScript и AJAX", создана пользователем Riateche, 16 ноя 2008.

  1. Riateche

    Riateche Активный пользователь

    С нами с:
    19 окт 2008
    Сообщения:
    9
    Симпатии:
    0
    Можно писать
    HTML:
    1. <a href='...' onClick='custom_function(this)'>...</a>
    Тогда из аргумента можно узнать href ссылки.
    Но мне нужно сделать динамическое назначение:
    [js]ar = document.getElementsByTagName('a');
    for (i = 0; i < ar.length; i++) {
    ar.onclick = custom_function;
    }[/js]
    Тут уже нельзя передать функции аргумент this. Или можно? Как это сделать?
     
  2. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    Попробуйте так:
    [js]
    ar = document.getElementsByTagName('a');
    for (i = 0; i < ar.length; i++) {
    ar.onclick = 'custom_function(this)';
    }
    [/js]
    Или так:
    [js]
    ar = document.getElementsByTagName('a');
    for (i = 0; i < ar.length; i++) {
    ar.onclick = function () { custom_function(ar) };
    }
    [/js]
     
  3. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    Вышепредложенные варианты не работают.
    Работают следующие:

    Самое простое -- назначение через onclick с использованием лямбда-функции с передачей this
    [js]
    for (i = 0; i < links.length; i++) {
    links.onclick = function () {
    check(this);
    }
    }
    [/js]

    Назначение через onclick с использованием функции для привязки событий с передачей this
    [js]
    if (links[0].addEventListener){
    for (i = 0; i < links.length; i++)
    links.addEventListener('click', function () {check(this) }, false);
    }
    else if (links[0].attachEvent){ //IE

    for (i = 0; i < links.length; i++)
    links.attachEvent('onclick', function () {check(this) });

    }

    [/js]

    Теперь более заковыристые, с использованием замыканий и передачей ссылки объекта непосредственно в функцию
    С использованием onlick
    [js]
    for (i = 0; i < links.length; i++) {
    links.onclick = (function (link) {
    return function () {
    check(link);
    }
    })(links);
    }
    [/js]
    Через функцию привязки событий:
    [js]
    if (links[0].addEventListener){

    for (i = 0; i < links.length; i++)
    links.addEventListener('click', (function (link) { return function () {check(link) }})(links), false);

    }
    else if (links[0].attachEvent){

    for (i = 0; i < links.length; i++)
    links.attachEvent('onclick', (function (link) { return function () {check(link) }})(links));

    }
    [/js]


    Сам код функции:
    [js]
    var links = document.getElementsByTagName("a");
    function check(obj) {
    alert(obj.innerHTML);
    }
    [/js]

    Ссылки (должны быть вставлены до всех привязок):
    HTML:
    1.  
    2. <a href="#">link</a>
    3. <a href="#">link2</a>
    4. <a href="#">link3</a>
    5.  
     
  4. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    Да, кстати, еще можно передавать ссылку на объект через событийный объект:
    [js]
    addEventListener("mouseout", (function () { return function (ev) {tobj(ev.target) }})(), false);

    attachEvent("onmouseout", (function () { return function (ev) {tobj(ev.srcElement) }})());
    [/js]
     
  5. armadillo

    armadillo Активный пользователь

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow