views:

17

answers:

2

I've bound some events to happen on left and right arrow key press like so:

$(document).keydown(function(e) {
    switch(e.which) {
        case 39: $("#next").trigger('click');
        break;

        case 37: $("#prev").trigger('click');
        break;              
    }
});

However, obviously if you are in a form and press left and right to move through text, these events fire.

How do I change this so that that doesn't happen?

+3  A: 

You could check the target of the event (more information here)

$(document).keydown(function(e) {
    //var target = (e.target) ? e.target : e.srcElement; // IE uses srcElement
    // jQuery seems to handle this, so e.target should be fine

    if(e.target.nodeName != 'INPUT') {
        switch(e.which) {
            case 39: $("#next").trigger('click');
            break;

            case 37: $("#prev").trigger('click');
            break;              
        }
    }
});

or you could prevent the event from bubbling up by attaching an event handler to the input elements:

$('input').keydown(function(e) {
    e.stopPropagation();
});

Update:

Likewise you might want to test the node name for TEXTAREA.

Here is an example: http://jsfiddle.net/86CKw/1/

Felix Kling
+1 excellent!..
Fosco
A: 
if (e.target.closest('form').length===0) {
    // keypress did not occur inside a form. handle it.
}
bobince