2011-10-31 56 views
0

一個監聽器是一個輸入,另一個是文檔。輸入監聽器是keydown,即文檔的按鍵。輸入事件首先被調用並使事件靜音,但文檔監聽器仍然被調用!爲什麼?爲什麼沉默這個keyevent不會停止傳播?

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> 
    <head> 
     <title>Test Silence</title> 
    </head> 
    <body> 
     <input type="text" id="test" name="test" /> 

     <script> 
      var docListener = function(event) 
      { 
       var d = document.createElement("div"); 
       d.textContent = "documentListener"; 
       document.body.appendChild(d); 
      } 

      //Add key listener to document 
      document.addEventListener("keypress", docListener, true); 

      var inputListener = function(event) 
      { 
       var d = document.createElement("div"); 
       d.textContent = "inputListener"; 
       document.body.appendChild(d); 

       //Silence event 
       event.preventDefault(); 
       event.stopPropagation(); 
      } 

      //Add key listener to document 
      document.getElementById("test").addEventListener("keydown", inputListener, true); 
     </script> 
    </body> 
</html> 
+0

看看event.srcElement和event.target。通過在兩個不同的元素上尋找相同的事物,您可能觸發了兩個不同的事件。 –

+0

你在測試什麼瀏覽器?我只看到第一個輸入事件觸發,我認爲是你想要的。在這裏:http://jsfiddle.net/namuol/pLJtt/ – namuol

+0

在Firefox 7.0.1中測試。 –

回答

0

這些是兩個不同的事件。一個不會干擾另一個。如果你想停止keypress冒泡,你必須明確地這樣說:

document.getElementById("test").addEventListener("keypress", inputListener, true); 
+0

如果你看我的代碼,它**完全**與你的相同!我明確停止冒泡,但問題仍然存在。 –

+0

不,這是不一樣的,你聽__keydown__和我設置一個偵聽器__keypress__ – topek