触发jquery键事件只在表单元素之外

时间:2013-03-25 09:30:00

标签: javascript jquery

是否可以仅在表单元素之外触发键事件?

背景:我有一个代码,当按下右键时会加载下一页。但是如果有人在表单元素中使用该键,我不想触发该事件。

当前代码:

$(document).keydown(function(e){
    if (e.keyCode == 37) { 

        var url = $('a#left').attr("href");

        if (url != '') { // require a URL
                window.location = url; // redirect
        }

    return false;
    }

    if (e.keyCode == 39) { 

        var url = $('a#right').attr("href");

        if (url != '') { // require a URL
                window.location = url; // redirect
        }

    return false;
    }
});

2 个答案:

答案 0 :(得分:2)

这是概念的基本示例。您只需向文档添加一个事件处理程序,并检查其目标是否没有父表单。

<强> HTML

<form>
    Inside form
    <input/>
</form>
Outside form
<input />

<强>的Javascript

    $(document).keyup(function(event){
        if($(event.target).parents("form").length == 0){
           alert("here");
        }
    });

工作POC: http://jsfiddle.net/48NYE/

此概念可以轻松应用于您提供的脚本。

修改脚本

$(document).keydown(function(e){
    var outsideForm = $(e.target).parents("form").length == 0;
    if (e.keyCode == 37 && outsideForm) { 

        var url = $('a#left').attr("href");

        if (url != '') { // require a URL
                window.location = url; // redirect
        }

    return false;
    }

    if (e.keyCode == 39  && outsideForm){ 

        var url = $('a#right').attr("href");

        if (url != '') { // require a URL
                window.location = url; // redirect
        }

    return false;
    }
});

答案 1 :(得分:2)

如果您的表单外有其他字段,这可能非常有用,我希望

LIVE DEMO

document.onkeyup = function( ev ){

  var key = ev.which || ev.keyCode ,
      aID = { 37:"left", 39:"right" }; 

  if( ! (/INPUT|TEXTAREA/i.test(ev.target)) && aID[key]) {
     var url = document.getElementById( aID[key] ).getAttribute('href');
     window.location = url;
  }

};