0

我的代码是:

<!DOCTYPE html>
<html>
<head>
    <title>Demo</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <style type="text/css">
        p{
            border:1px solid #CCC;
            margin:5px;
            padding:5px;
        }
    </style>
    <script type="text/javascript">
        window.onload = changeColor;
        function changeColor() {
            for(var i =0; i < document.getElementById("main").getElementsByTagName("p").length; i++) {
                var obj = document.getElementById("main").getElementsByTagName("p")[i];
                if (window.addEventListener) {
                    obj.addEventListener('mousemove', function () {
                        this.style.backgroundColor ="#EEE";
                    }, false);
                    obj.addEventListener('mouseout', function () {
                        this.style.backgroundColor ="#FFF";
                    }, false);
                } else if (window.attachEvent) {
                    //for ie
                    obj.attachEvent('onmousemove', function () {
                        this.style.backgroundColor ="#EEE";
                    });
                    obj.attachEvent('onmouseout', function () {
                        this.style.backgroundColor ="#FFF";
                    });
                }
            }
        }
    </script>
</head>
<body>
    <div>
        <p>1</p>
        <div id="main">
            <p>2.1</p>
            <p>2.2</p>
            <p>2.3</p>
        </div>
    </div>
</body>
</html>

在 Chrome、FireFox 和 ie9 下运行良好,但在 IE7/8 下无法运行

错误信息是:无法设置“背景颜色”的属性值:对象为空或未定义

我怎么了?

4

2 回答 2

1

attachEvent在 IE 中使用时,this设置为window对象,而不是事件发生的对象。

在 IE 中,全局变量window.event.srcElement将包含事件的目标对象。

您可以编写这样的解决方法,以使所有事件处理程序工作相同:

function hookEvent(event, obj, fn) {
    if (obj.addEventListener) {
        obj.addEventListener(event, fn, false);
    } else {
        obj.attachEvent("on" + event, function() {return(fn.call(obj, window.event));});
    }
}

这将使它this设置为事件的源对象,并且事件处理程序的参数是事件对象。

于 2012-02-20T03:29:20.930 回答
0

this不绑定到 IE 中的源元素attachEvent

改为使用event.srcElement

另请注意,event全局对象属性及其srcElement属性也是特定于 IE 的。

于 2012-02-20T03:32:41.743 回答