繁体   English   中英

Javascript事件处理中的问题

[英]Trouble in Javascript event handling

直到今天,我才弄清楚事件传播是如何工作的,并开始在我现有的代码库上进行测试,但是arghhhhhhh该死的你是javascript ......对你来说似乎没有那么简单:X

这是我的问题,我在锚点上定义了一组事件:

theLink.setAttribute('onMouseOver','doSomething(this)');    **// works**

theLink.addEventListener("mouseout", function(event){doSomethingElse(event)}, false);  **// does not work**

theLink.onmouseout = function(event){doSomethingElse(event)};     **// does not work**

仅当我像第一个示例中那样定义事件时,它才似乎在第二个或第三个定义中也起作用。 但是我不能使用该定义,因为我必须传递事件对象。

有什么提示吗? 我正在使用Firefox。

所有这三个都使用以下代码(在firefox中)为我工作:

HTML:

<a id="link1">Link 1</a>
<a id="link2">Link 2</a>
<a id="link3">Link 3</a>

JS:

var link1 = document.getElementById("link1");
var link2 = document.getElementById("link2");
var link3 = document.getElementById("link3");

window.doSomething = function(event) {
    console.log(event);
}

link1.setAttribute('onMouseOver', 'doSomething(this)');

link2.addEventListener("mouseout", function(event) {
    doSomething(event)
}, false);

link3.onmouseout = function(event) {
    doSomething(event)
};

这是一个工作的jsfiddle: http : //jsfiddle.net/magicaj/qk6wU/

您可能还会考虑使用类似jQuery的库来处理跨浏览器与某些版本IE不支持的addEventListener方法不兼容的问题,JS看起来像这样:

$("#link1").mouseover(doSomething);
$("#link2").mouseover(doSomething);
$("#link3").mouseover(doSomething);

包含跨浏览器的答案

function doSomething( event ) {
    if( console && console.log ) {
        console.log( this );
        console.log( event );
    }
    else {
        alert( this === window ? 'WINDOW' : this.tagName );
        alert( event );
    }
}


var link1 = document.getElementById("link1");
var link2 = document.getElementById("link2");
var link3 = document.getElementById("link3");

// `this` within your handler will be `window` and not the link
link1.setAttribute( 'onMouseOver', 'doSomething( event )' ); 

// to attach event listeners you have to do a bit more work
// ( best to make a function rather than doing this each time
if( document.addEventListener ) {
    // compliant browsers
    link2.addEventListener('mouseover', doSomething, false);
} else {
    // internet explorer
    link2.attachEvent( 'onmouseover', function() {
        // grab the event object from the window
        var e = window.event;
        // normalise it a bit i.e. make it a bit more like a compliant browsers event object
        e.target = e.srcElement;
        e.preventDefault = function(){ e.returnValue = false };
        e.stopPropagation = function(){ e.cancelBubble = true };
        // and forward to your handler making sure that `this` is properly set
        doSomething.call( this, e );
    });
}

link3.onclick = doSomething;

注意避免将处理程序包装在不必要的匿名函数中,这很浪费,并且在处理程序中丢失了this
所以代替

link3.onclick = function( event ) { doSomething( event ) };

只需直接分配处理程序

link3.onclick = doSomething;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM