При вызове функции Javascript, как установить пользовательское значение «this»? - PullRequest
5 голосов
/ 27 мая 2009

Я использую jQuery, и у меня есть функция, которая выполняет функцию обратного вызова события, и поэтому в этой функции «this» представляет объект, который захватил событие. Однако есть случай, когда я хочу явно вызвать функцию из другой функции - как мне установить, что «this» будет равно в функции в этом случае?

Например:

function handleEvent(event) {
    $(this).removeClass("sad").addClass("happy");
}

$("a.sad").click(handleEvent); // in this case, "this" is the anchor clicked

function differentEvent(event) {
    $("input.sad").keydown(e) {
        doSomeOtherProcessing();
        handleEvent(e); // in this case, "this" will be the window object
                        // but I'd like to set it to be, say, the input in question
    }
}

Ответы [ 5 ]

12 голосов
/ 27 мая 2009

Использовать применять звонить .

handleEvent.call(this, e);
4 голосов
/ 27 мая 2009

Просто параметризовать интересующую вас функцию:

function doStuff(el) {
    $(el).removeClass("sad").addClass("happy");
}

function handleEvent(event) {
    doStuff(this);
}

$("a.sad").click(handleEvent); // in this case, "this" is the anchor clicked

function differentEvent(event) {
    $("input.sad").keydown(e) {
        doSomeOtherProcessing();
        doStuff(this);
    }
}
1 голос
/ 27 мая 2009

Я бы посоветовал вам пересмотреть вашу функцию как плагин jQuery.

Но вот быстрое исправление:

handleEvent.apply(this,e) //transfers this from one scope, to another
1 голос
/ 27 мая 2009

Используйте

e.target
0 голосов
/ 27 мая 2009

Если вы просто хотите вызвать один обработчик события, как если бы он запускался нормально, apply / call будет работать нормально. Однако, в зависимости от ваших потребностей, может быть более надежно использовать версию функции jQuery click () с нулевым аргументом, которая вызовет все обработчики нажатия для этого элемента:

function differentEvent(event) {
    $("input.sad").keydown(e) {
        doSomeOtherProcessing();
        $(this).click(); // simulate a click
    }
}
...