【问题标题】:Firing a keyboard event, webkit keyboard event doesn't fire触发键盘事件,webkit 键盘事件不会触发
【发布时间】:2011-03-06 00:30:39
【问题描述】:

我有 JavaScript 代码来监听按下的“返回”键,
适用于除 webkit 浏览器之外的所有浏览器

我知道最近的 webkits changes to keyboard event handling.
我找不到合适的解决方案 in this detailed explanation

这里是code

function addEventHandler(node,type,fn){
   if(typeof window.event !== "undefined"){
            /* Internet Explorer way */
            node.attachEvent( "on" + type, fn );
   } else {
           /* FF & Other Browsers */
           node.addEventListener( type, fn,false );
   }
} 


function detectSubmit(){
    searchTextInput = document.getElementById("txtSearch")
    addEventHandler(searchTextInput,"keydown",triggerSearch);
}

function triggerSearch(e){
  //getting the character that was pressed cross browser. 
     var key = e.keycode ? e.keycode : e.which;
  //detect if the return key was pressed. 
    if(key==13){
      alert("return clicked");
    }
}

   addEventHandler(window,"load",detectSubmit);

【问题讨论】:

  • 为什么不使用 javascript 库(如 jquery)以最少的代码自动解决跨浏览器问题。
  • 谢谢,我一直用jQuery,但这是第三方网站的横幅广告。

标签: javascript keyboard webkit dom-events keypress


【解决方案1】:

最明显的是下面一行的简单错字:

var key = e.keycode ? e.keycode : e.which;

应该是keyCode 而不是keycode

除此之外,addEventHandler 函数存在问题。我建议如下:

function addEventHandler(node,type,fn){
    if (typeof node.addEventListener !== "undefined"){
        /* DOM-compliant method */
        node.addEventListener( type, fn,false );
    } else if (typeof node.attachEvent !== "undefined") {
        /* IE */
        node.attachEvent( "on" + type, fn );
    }
}

两件事:首先,最好直接检查attachEvent,而不是根据window.event 的存在来推断它的存在。事实上,window.event 存在于 Safari 和 Chrome 中,但不存在(我认为)attachEvent,因此狡猾的推断会阻止您的代码工作。

其次,最好先检查 DOM 标准 addEventListener 并在它存在的地方使用它,而不是 attachEvent。例如,Opera 两者都有,但只有 addEventListener 是标准化的。

【讨论】:

    猜你喜欢
    • 2013-09-22
    • 2015-08-21
    • 2016-08-30
    • 1970-01-01
    • 1970-01-01
    • 2013-03-12
    • 2012-10-26
    • 2010-12-26
    • 1970-01-01
    相关资源
    最近更新 更多