2010-11-13 180 views
1

我正在使用開關按下某個鍵時觸發某些代碼。這是不準確的代碼,但它基本上是我使用(這只是爲了保持它簡短就在這裏的緣故。)當輸入焦點時防止按鍵事件觸發

$(document).keydown(function(e) { 
switch(e.keyCode) { 

case 39: 
e.preventDefault(); 
    alert("Arrow Key"); 

break; 

case 37: 
    e.preventDefault(); 
    alert("Arrow Key"); 
} 
}); 

我怎樣才能防止射擊時輸入的事件盒子是重點?

+1

這個什麼行不通?你是否還需要調用'e.stopPropagation()'? – 2010-11-13 08:56:49

回答

4

我認爲你的意思是你想要做e.preventDefault()只有當目標元素不是input標籤。你可以這樣做是這樣的:

$(document).keydown(function(e) { 
    if (e.target.nodeName.toLowerCase() !== 'input') { 
     switch(e.keyCode) { 
      case 39: 
       e.preventDefault(); 
       alert("Arrow Key"); 

       break; 

      case 37: 
       e.preventDefault(); 
       alert("Arrow Key"); 
     } 
    } 
}); 

e.target是產生事件的元素。另外,您也可以使用jQuery的事件代表團API:

$(document).delegate(':not(input)', 'keydown', function(e) { 
    switch(e.keyCode) { 
     case 39: 
      e.preventDefault(); 
      alert("Arrow Key"); 

      break; 

     case 37: 
      e.preventDefault(); 
      alert("Arrow Key"); 
    } 
}); 

編輯更新我的回答做「不是輸入」,而不是「是輸入」檢查。

+0

完美!非常感謝。奇蹟般有效。我很感激。 – mcbeav 2010-11-14 03:26:35

1

有可能是一個更優雅的方式,但我會做這樣的事情:

var inputHasFocus = false; 
$("#some_input_id").focusin(function() { 
    inputHasFocus = true; 
}).focusout(function() { 
    inputHasFocus = false; 
}); 

,然後用它在你的case語句。

+0

這將是我最初的想法是設置某種變量計數並只記錄它,但原始答案很有用。感謝這一點,雖然。我很感激。 – mcbeav 2010-11-14 03:27:14

1

您可以使用document.activeElement返回當前焦點元素。從MDN

簡要DOC:

返回當前焦點元素,也就是說,將獲得按鍵事件如果用戶鍵入的任何元素。該屬性是隻讀的。

也就是說,爲了防止射擊時輸入焦點按鍵事件,你可以忽略的按鍵事件處理時聚焦元素是input

if (!$(document.activeElement).is("input"){ /* handle keystroke events here */ } 
相關問題