Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/402.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为焦点创建事件观察者?_Javascript_Prototypejs - Fatal编程技术网

Javascript 为焦点创建事件观察者?

Javascript 为焦点创建事件观察者?,javascript,prototypejs,Javascript,Prototypejs,有可能在原型中有焦点事件气泡吗 我试图避免在每个输入元素上都分配一个观察者 <script language="javascript" type="text/javascript"> document.observe('dom:loaded', function() { // Doesn't work $('editForm').observe('focus', function(evnt){ console.log('FOCUS!'); }

有可能在原型中有焦点事件气泡吗

我试图避免在每个输入元素上都分配一个观察者

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

document.observe('dom:loaded',function()){
//不起作用
$('editForm')。观察('focus',函数(evnt){
console.log('FOCUS!');
});
//工作
$('editForm')。选择('INPUT')。每个(函数(元素){
观察要素(“聚焦”,功能(evnt){
console.log('FOCUS!');
});
});
}); 

聚焦和模糊事件不会出现气泡

您可以在捕获阶段启动事件处理程序。当使用标准DOM方法时,您可以编写

document.addEventListener('focus',function(e){/*some code */}, true);
“真实”值在这里是最重要的

问题是IE不支持捕获事件传播的阶段,但对于IE,可以使用focusin和focusout事件,这与聚焦和模糊事件不同,不会产生气泡。我推荐阅读彼得·保罗·科赫(Peter Paul Koch)写的一篇关于这个主题的文章。其他浏览器(Firefox、Opera、Safari)可能(我没有测试过)支持DOMFocusIn、DOMFocusOut等事件,它们与IE的focusin和focusout事件是等价的。

您可以使用:

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
});
我的JSFIDLE:

如果(_is_ie){//ie仅聚焦/模糊事件侦听器f.observe('focusin',this.onFocus.bind(this));f.observe('focusout',this.onBlur.bind(this));否则{//Firefox&Safari聚焦/模糊事件侦听器f.addEventListener('focus',this.onFocus.bind(this));f.addEventListener('blur',this.onBlur.bind(this),true)然后在onBlur和onFocus中,我得到元素(Event.element)并检查它的nodeName,看看我是否应该做些什么。