2

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

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

当前代码:

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

2 回答 2

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;
  }

};
于 2013-03-25T09:50:02.347 回答
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;
    }
});
于 2013-03-25T09:35:20.437 回答