2016-03-09 2 views
0

У меня есть следующий код.Преобразование обработчика событий в функцию

$('.crossOutAnswer').on('click', function(){ 
    var crossStatus = $(this).hasClass('alreadyCrossOutAnswer'), 
     crossOutElement = $(this).attr('class').split(' ')[1].split('-')[1]; 
    if(crossStatus == 1){ 
    $(this).removeClass('alreadyCrossOutAnswer'); 
    $('.res' + crossOutElement).removeClass('CrossedOutQuestion'); 
    }else{ 
    $(this).addClass('alreadyCrossOutAnswer'); 
    $('.res' + crossOutElement).addClass('CrossedOutQuestion'); 
    } 
}) 

Это хорошо работает, но то, что я пытаюсь сделать, это преобразовать это в 2-х функций

  1. Первое сделать первое заявление
  2. Предпоследняя сделать заявление ELSE

Проблема в том, что когда я пытаюсь преобразовать их в 2 функции, функция $ (this) перестает работать (по причинам obvius больше нет триггера).

Кто-нибудь знает, как лучше всего использовать обработчики событий в функциях ?.

EDIT

Пожалуйста, обратите внимание, что я могу передать этот параметр без проблем, но переменные получить неопределенное то. Таким образом, решение должно решить эту проблему без повторного объявления в функции

+0

обработчики событий уже являются функциями. Обратите внимание на 'function() {' – zzzzBov

+0

, вы можете просто сохранить ссылку на это в переменной в начале обработчика кликов.var elem = $ (this); – user2079802

+0

Обратите внимание, что полагаться на порядок классов в атрибуте 'class' невероятно легко ломается. Я бы предложил хранить любые требуемые метаданные в атрибуте 'data- *'. –

ответ

0

Это ответ. Таким образом, вам не нужно переопределять переменные, и «это» работает нормально.

$('.crossOutAnswer').on('click', function(){ 
     var crossStatus = $(this).hasClass('alreadyCrossOutAnswer'), 
      crossOutElement = $(this).attr('class').split(' ')[1].split('-')[1]; 
     if(crossStatus == 1){ removeCrossOut(this, crossStatus, crossOutElement); } 
     else{ addCrossOut(this, crossStatus, crossOutElement); } 
    }) 

    function removeCrossOut(elem, crossStatus, crossOutElement){ 
     $(elem).removeClass('alreadyCrossOutAnswer'); 
     $('.res' + crossOutElement).removeClass('CrossedOutQuestion'); 
    } 

    function addCrossOut(elem, crossStatus, crossOutElement){ 
     $(elem).addClass('alreadyCrossOutAnswer'); 
     $('.res' + crossOutElement).addClass('CrossedOutQuestion'); 
    } 
2

Передача ссылки на this должны сделать трюк ... если я не хватает чего-то

$('.crossOutAnswer').on('click', function(){ 
    var crossStatus = $(this).hasClass('alreadyCrossOutAnswer'), 
    crossOutElement = $(this).attr('class').split(' ')[1].split('-')[1]; 
    if(crossStatus == 1){ 
    method1(this,crossOutElement); 
    }else{ 
    method2(this,crossOutElement); 
    } 
}) 

function method1(elem,crossOutElement){ 
    $(elem).removeClass('alreadyCrossOutAnswer'); 
    $('.res' + crossOutElement).removeClass('CrossedOutQuestion'); 
} 

function method2(elem,crossOutElement){ 
    $(elem).addClass('alreadyCrossOutAnswer'); 
    $('.res' + crossOutElement).addClass('CrossedOutQuestion'); 
} 
+0

Это выглядит великолепно ... но есть только небольшая проблема :(console thrwos me, что «crossOutElement не определен» - есть способ, который способ 1 и 2 мог распознавать переменные, инициализированные в eventHandler? Это могло бы ответить на вопрос (: –

+0

Вы можете передавать их так же, как вы передаете 'this' как param или объявляете их в пространстве имен, содержащем все эти функции (над этими функциями). – jdabrowski

+0

Извините @LesterVargas, я добавлю изменения для этого, хотя я уверен, что вы уже дошли до этого. – ElliotM

3

У вас есть два варианта:

Первое:

Вы можете передать this в качестве параметра функции, например:

if(crossStatus == 1){ 
    functionA(this); 
}else{ 
    functionB(this); 
} 

И использовать его:

functionA(remoteThis){ 
    $(remoteThis).doSomething(); 
} 

Второе:

Вы можете вызвать эти функции с помощью apply() и передачи this как контекст, так что эти функции будут иметь одинаковые this контекст, например:

if(crossStatus == 1){ 
    functionA.apply(this); 
}else{ 
    functionB.apply(this); 
} 

И использовать его:

functionA(){ 
    $(this).doSomething(); 
} 
1

Вы решить вашу проблему, передавая ссылку на этот в качестве параметра:

function f1(myThis) { 
    $(myThis).removeClass('alreadyCrossOutAnswer'); 
    $('.res' + crossOutElement).removeClass('CrossedOutQuestion'); 
} 

function f2(myThis) { 
    $(myThis).addClass('alreadyCrossOutAnswer'); 
    $('.res' + crossOutElement).addClass('CrossedOutQuestion'); 
} 

$('.crossOutAnswer').on('click', function(){ 
    var crossStatus = $(this).hasClass('alreadyCrossOutAnswer'), 
    crossOutElement = $(this).attr('class').split(' ')[1].split('-')[1]; 

    if(crossStatus == 1){ 
     f1(this); 
    } else { 
     f2(this); 
    } 
});