日期:2014-05-16  浏览次数:20348 次

初学JS,提个问题
是关于浏览器兼容的,因为IE跟DOM标准不一样,有些代码写法不一样,所以会写这样的兼容语句
JScript code

d=e?e:event;


但是这个三目运算不是判断e的bool值然后确定是e还是event吗?
然后我就写了这样一段
JScript code

<script>
    document.onclick=function(e)
    {
        d=e?e:event;
        if(d==e)
        {alert("this is e!!");}
        if(d==event)
        {alert("this is event");}
        
        alert(d.clientX+":"+d.clientY);
    }
</script>


就是一个单击事件,然后看d到底是为e还是event,我在360极速浏览器和ie9下测试
360极速浏览器会一次弹出this is e!! 
this is event 跟坐标

而IE9则只弹出this is e!!跟坐标

我混乱了,为什么极速浏览器会把e跟event两个值都显示呢?
那这里的e到底是个什么类型的数据,e? 判断的又是什么...

------解决方案--------------------
我看楼主还是不明白这里面的原理

你虽然知道要这样写,但你不明白为什么要这样写,我给你简单解释下吧

event对象在IE以及webkit浏览器(chrome,safari,opera,遨游3)下都是存在的,都是全局对象,只有FireFox中不存在window.event,所以这样的写法是为了兼容FireFox的。

上面是IE、WebKit与FireFox之间的区别,下面给你说下IE和Webkit浏览器的区别

webkit浏览器会在事件发生现场传递一个参数,就是你上面写的e,但IE不会传递这样一个参数,所以IE中只会取window.event,你alert(e)下试试,一定会弹出undefined的


最后说一句,360极速说白了就是chrome浏览器加了一个壳而已


------解决方案--------------------
你错了,FireFox下是有这个参数的,而且是只有在这个时候才有

FireFox和webkit浏览器下都会传递这个事件参数,在webkit浏览器下你可以使用e或者window.event,但在FireFox中你只能使用e,在IE下只能使用window.event
------解决方案--------------------
可以的e=e?e:event和d=e?e:event这2种写法都是可以的,这个参数的名字你可以自定义

那个三目运算的意思是

先判断e,如果e为true或者不是undefined,那么就取e的值,反之,就取window.event的值

那么执行的结果就是

webkit浏览器下会取e,Firefox下也会取e,而IE则会取window.event


------解决方案--------------------
前面写的那么多,主要就是为了在获取event的时候能够兼容各个浏览器而已