2015-04-22 5 views
2

Есть ли способ иметь несколько событий (например, oninput, onblur) запускает точно такую ​​же функцию в HTML?HTML несколько событий для запуска одной и той же функции

Это HTML, что я пытаюсь упростить:

<input id="Email" name="Email" type="text" oninput="toggleSuccessIcon(this, isEmail)" onblur="toggleSuccessIcon(this, isEmail)"> 

Я знаю, что это возможно в JQuery, как объяснено here, но так как у меня есть много различных входов (например, адрес, почтовый индекс, и т. д.), которые должны вызывать разные функции (например, toggleSuccessIcon (this, isAddresss), toggleSuccessIcon (это, isPostCode) и т. д.) Я хотел избежать многократной и грязной инициализации в JavaScript. Однако, если я ошибаюсь, делая это в HTML, а не в JQuery, я был бы признателен за разъяснение в пользу использования JQuery.

Обратите внимание, что isEmail, isAddress, isPostCode и т.д. это имя функции.

+2

я верю его больше беспорядок для смешивания js с html – madalinivascu

+0

Вы можете присоединить события через 'addEventListener' в JavaScript или намного более чистым способом с помощью jQuery. –

+0

Все входы на самом деле используют «toggleSuccessIcon», но второй и дополнительный третий параметр варьируется от входа к входу, например. Tarostar

ответ

2

Вы можете использовать вспомогательную функцию

// events and args should be of type Array 
function addMultipleListeners(element,events,handler,useCapture,args){ 
    if (!(events instanceof Array)){ 
    throw 'addMultipleListeners: '+ 
      'please supply an array of eventstrings '+ 
      '(like ["onblur","oninput"])'; 
    } 
    //create a wrapper for to be able to use additional arguments 
    var handlerFn = function(e){ 
    handler.apply(this, args && args instanceof Array ? args : []); 
    } 
    for (var i=0;i<events.length;i+=1){ 
    element.addEventListener(events[i],handlerFn,useCapture); 
    } 
} 

function handler(e) { 
    // do things 
}; 

// usage 
addMultipleListeners(document.getElementById('Email'), 
        ['oninput','onblur'],handler,false); 
1

Вы можете использовать data как:

<input class="configurable-events" type="text" data-events="blur focus click" data-function="myFunction" /> 
<input class="configurable-events" type="password" data-events="blur focus" data-function="myPasswordFunction" /> 

в JQuery вы можете использовать что-то вроде:

$('.configurable-events').each(function(){ 
    $(this).on($(this).data('events'), function(){ 
     $(this).data('function')($(this)); 
    }); 
}); 

function myFunction(myInput) { 
    console.log(myInput.value()); 
} 

function myPasswordFunction(myPasswordInput) { 
    console.log(myPasswordInput.size()); 
} 
0
$("input").on("click blur", toggleSuccessIcon(this, isEmail)); 
+0

Было бы здорово, если бы я хотел для добавления одинаковой функции ко всем входам, однако второй параметр toggleSuccessIcon является параметром, зависящим от поля ввода. – Tarostar

+0

Ответ зависит только от того, что вы просили. Если вы хотите изменить его только для этого поля ввода, тогда вместо $ («input») вместо $ («input») следует сделать $ («# isEmail»). Я не получаю то, что вы на самом деле подразумеваете под isEmail как второй параметр. Вы всегда будете получать идентификатор из селектора, используя $ (this) .attr ('id'). –

Смежные вопросы