11

Is there a way to have multiple events (e.g. oninput, onblur) trigger exactly the same function in the HTML?

This is the HTML that I'm trying to simplify:

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

I know this is possible in jQuery as explained here, but since I have a lot of different inputs (e.g. address, postcode, etc.) that need to call different functions (e.g. toggleSuccessIcon(this, isAddresss), toggleSuccessIcon(this, isPostCode), etc.) I wanted to avoid having a long and messy initialisation in the JavaScript. However, if I am being foolish by doing this in HTML rather than JQuery I'd appreciate an explanation as to the advantage of using JQuery.

Note that isEmail, isAddress, isPostCode, etc. is a function name.

3
  • 3
    i belive its a bigger mess to mix js with html Commented Apr 22, 2015 at 6:17
  • You can attach events through addEventListener in JavaScript or in much cleaner way using jQuery. Commented Apr 22, 2015 at 6:21
  • All the inputs actually use "toggleSuccessIcon", but the second and optional third parameter varies from input to input, e.g. <input id="Address" name="Address" type="text" oninput="toggleSuccessIcon(this, hasContent, 5)" onblur="toggleSuccessIcon(this, hasContent, 5)"> Commented Apr 22, 2015 at 6:45

4 Answers 4

3

You could use a helper function

// 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);
Sign up to request clarification or add additional context in comments.

Comments

2

You can use data as:

<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" />

in jQuery you can use something like:

$('.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());
}

Comments

2
$("input").on( "click blur", toggleSuccessIcon(this, isEmail));

2 Comments

This would be great if I wanted to add the same function to all inputs, however the second parameter of toggleSuccessIcon is a input field dependent parameter.
The answer only depends on what you asked.If you want to change it for this input field only, then make $("#isEmail") instead of $("input").I dont get what you actually mean by isEmail as the second parameter.You will always get the id from the selector by using $(this).attr('id').
2

I know this is so massively late, but I thought I'd throw my hat in the ring anyway. When I have numerous events that need to trigger the same thing, it feels so wasteful to do 3-5 eventListeners, so what I do is making a forEach-loop on an array that holds the event-names in vanilla JS. I wish though, that the eventListener could accept an array as a name directly, but here we are.

    const element = document.getElementById('Email');

    ['input', 'blur'].forEach(eventName =>{
        element.addEventListener(eventName, event=>{
            // Your eventcode goes here.
        });
    });

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.