Any event triggered on autocomplete?

JavascriptJqueryHtmlAutocomplete

Javascript Problem Overview


I have a pretty simple form. When the user types in an input field, I want to update what they've typed somewhere else on the page. This all works fine. I've bound the update to the keyup, change and click events.

The only problem is if you select an input from the browser's autocomplete box, it does not update. Is there any event that triggers when you select from autocomplete (it's apparently neither change nor click). Note that if you select from the autocomplete box and the blur the input field, the update will be triggered. I would like for it to be triggered as soon as the autocomplete .

See: http://jsfiddle.net/pYKKp/ (hopefully you have filled out a lot of forms in the past with an input named "email").

HTML:
<input name="email" /> 
<div id="whatever">&lt;whatever></div> 
CSS:
div { 
    float: right; 
} 
Script:
$("input").on('keyup change click', function () { 
   var v = $(this).val(); 
    if (v) { 
     $("#whatever").text(v);   
    }  
    else { 
        $("#whatever").text('<whatever>'); 
    } 
}); 

Javascript Solutions


Solution 1 - Javascript

I recommending using monitorEvents. It's a function provide by the javascript console in both web inspector and firebug that prints out all events that are generated by an element. Here's an example of how you'd use it:

monitorEvents($("input")[0]);

In your case, both Firefox and Opera generate an input event when the user selects an item from the autocomplete drop down. In IE7-8 a change event is produced after the user changes focus. The latest Chrome does generate a similar event.

A detailed browser compatibility chart can be found here:
https://developer.mozilla.org/en-US/docs/Web/Events/input

Solution 2 - Javascript

Here is an awesome solution.

$('html').bind('input', function() {
    alert('test');
});

I tested with Chrome and Firefox and it will also work for other browsers.

I have tried a lot of events with many elements but only this is triggered when you select from autocomplete.

Hope it will save some one's time.

Solution 3 - Javascript

Add "blur". works in all browsers!

$("input").on('blur keyup change click', function () {

Solution 4 - Javascript

As Xavi explained, there's no a solution 100% cross-browser for that, so I created a trick on my own for that (5 steps to go on):
1. I need a couple of new arrays:

window.timeouts     = new Array();
window.memo_values  = new Array();


2. on focus on the input text I want to trigger (in your case "email", in my example "name") I set an Interval, for example using jQuery (not needed thought):

jQuery('#name').focus(function ()
{
    var id = jQuery(this).attr('id');
    window.timeouts[id] = setInterval('onChangeValue.call(document.getElementById("'+ id +'"), doSomething)', 500);
});


3. on blur I remove the interval: (always using jQuery not needed thought), and I verify if the value changed

jQuery('#name').blur(function ()
{
    var id = jQuery(this).attr('id');
    onChangeValue.call(document.getElementById(id), doSomething);
    clearInterval(window.timeouts[id]);
    delete window.timeouts[id];
});


4. Now, the main function which check changes is the following

function onChangeValue(callback)
{
    if (window.memo_values[this.id] != this.value)
    {
        window.memo_values[this.id] = this.value;

        if (callback instanceof Function)
        {
            callback.call(this);
        }
        else
        {
            eval( callback );
        }
    }
}

Important note: you can use "this" inside the above function, referring to your triggered input HTML element. An id must be specified in order to that function to work, and you can pass a function, or a function name or a string of command as a callback.


5. Finally you can do something when the input value is changed, even when a value is selected from a autocomplete dropdown list

function doSomething()
{
    alert('got you! '+this.value);
}

Important note: again you use "this" inside the above function referring to the your triggered input HTML element.

WORKING FIDDLE!!!
I know it sounds complicated, but it isn't.
I prepared a working fiddle for you, the input to change is named "name" so if you ever entered your name in an online form you might have an autocomplete dropdown list of your browser to test.

Solution 5 - Javascript

Detecting autocomplete on form input with jQuery OR JAVASCRIPT

Using: Event input. To select (input or textarea) value suggestions

FOR EXAMPLE FOR JQUERY:

$(input).on('input', function() { 
alert("Number selected ");

});

FOR EXAMPLE FOR JAVASCRIPT:

<input type="text"  onInput="affiche(document.getElementById('something').text)" name="Somthing" />

This start ajax query ...

Solution 6 - Javascript

The only sure way is to use an interval.

Luca's answer is too complicated for me, so I created my own short version which hopefully will help someone (maybe even me from the future):

    $input.on( 'focus', function(){
        var intervalDuration = 1000, // ms
            interval = setInterval( function(){
            
                // do your tests here
                // ..................

                // when element loses focus, we stop checking:
                if( ! $input.is( ':focus' ) ) clearInterval( interval );  

            }, intervalDuration );
    } );

Tested on Chrome, Mozilla and even IE.

Solution 7 - Javascript

I've realised via monitorEvents that at least in Chrome the keyup event is fired before the autocomplete input event. On a normal keyboard input the sequence is keydown input keyup, so after the input.

What i did is then:

let myFun = ()=>{ ..do Something };

input.addEventListener('change', myFun );

//fallback in case change is not fired on autocomplete
let _k = null;
input.addEventListener( 'keydown', (e)=>_k=e.type );
input.addEventListener( 'keyup', (e)=>_k=e.type );
input.addEventListener( 'input', (e)=>{ if(_k === 'keyup') myFun();})

Needs to be checked with other browser, but that might be a way without intervals.

Solution 8 - Javascript

I don't think you need an event for this: this happens only once, and there is no good browser-wide support for this, as shown by @xavi 's answer.

Just add a function after loading the body that checks the fields once for any changes in the default value, or if it's just a matter of copying a certain value to another place, just copy it to make sure it is initialized properly.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionExplosion PillsView Question on Stackoverflow
Solution 1 - JavascriptXaviView Answer on Stackoverflow
Solution 2 - JavascriptAnand SinghView Answer on Stackoverflow
Solution 3 - JavascriptKareemView Answer on Stackoverflow
Solution 4 - JavascriptLuca BorrioneView Answer on Stackoverflow
Solution 5 - JavascriptFranklin CIView Answer on Stackoverflow
Solution 6 - JavascriptSorin CView Answer on Stackoverflow
Solution 7 - JavascriptBjörn GrambowView Answer on Stackoverflow
Solution 8 - JavascriptNanneView Answer on Stackoverflow