2009-05-21 248 views
11

是否有可能在原型中有焦點事件泡泡?創建焦點的事件觀察者?

我想阻止必須在每個輸入元素上分配觀察者。

<script language="javascript" type="text/javascript"> 
document.observe('dom:loaded', function() { 

    // Doesn't work 
    $('editForm').observe('focus', function(evnt){ 
     console.log('FOCUS!'); 
    }); 

    // Works 
    $('editForm').select('INPUT').each(function(elem) { 
     elem.observe('focus', function(evnt){ 
      console.log('FOCUS!'); 
     }); 
    }); 

}); 
</script> 

<form method="post" name="editForm" id="editForm" action=""> 
<input type="text" name="foobar" /> 
</form> 

回答

24

焦點和模糊事件不泡。

您可以在捕獲階段觸發事件處理程序。當使用標準的DOM方法時,你會寫

document.addEventListener('focus',function(e){/*some code */}, true); 

'真'值在這裏是最重要的。

問題是,IE不支持事件傳播的捕獲階段,但對於IE,您可以使用focusin和focusout事件,這與focus和blur事件不同 - 確實會冒泡。我建議您閱讀Peter Paul Koch編寫的關於此主題的article。其他瀏覽器(Firefox,Opera,Safari)很可能(我沒有測試它)支持像DOMFocusIn,DOMFocusOut等IE對焦和聚焦事件的等效事件。

+0

如果(_is_ie){ \t // IE只有着眼/模糊的事件監聽器 \t f.observe( '的focusIn',這.onFocus.bind(本)); \t f.observe('focusout',this.onBlur.bind(this)); }否則{ \t // Firefox和Safari的焦點/模糊事件偵聽器\t \t \t \t f.addEventListener( '焦點',this.onFocus.bind(本),TRUE); \t f.addEventListener('blur',this.onBlur.bind(this),true); } 然後在onBlur和onFocus中,我得到元素(Event.element)並檢查它的nodeName,看看我是否應該做任何事情。 – 2009-05-21 16:42:39

4

您可以使用此:

function focusInHandler(event){ 
    Event.element(event).fire("focus:in"); 
} 
function focusOutHandler(event){ 
    Event.element(event).fire("focus:out"); 
} 

if (document.addEventListener){ 
    document.addEventListener("focus", focusInHandler, true); 
    document.addEventListener("blur", focusOutHandler, true); 
} else { 
    document.observe("focusin", focusInHandler); 
    document.observe("focusout", focusOutHandler); 
} 

document.observe('focus:in', function(event) { 
    // Your code 
}); 

我的jsfiddle:http://jsfiddle.net/EpokK/k7RPE/3/