请帮助我在javascript中理解这是如何工作的?
var myEvent = window.attachEvent || window.addEventListener;
var chkevent = window.attachEvent ? 'onbeforeunload' : 'beforeunload'; /// make IE7, IE8 compitable
myEvent(chkevent, function(e) { // For >=IE7, Chrome, Firefox
var confirmationMessage = 'Are you sure to leave the page?'; // a space
(e || window.event).returnValue = confirmationMessage;
return confirmationMessage;
});
我理解脚本的其他部分但不了解(e || window.event).returnValue
如何评估它?是否意味着如果e
为真,则其属性returnValue
将被设置,否则它将使用window.event
?
注意:请指导我这个问题的正确标题,因为我不知道如何调用这种javascript编码模式
答案 0 :(得分:2)
我将在这里变得真实。此代码如此奇怪的最大原因是Internet Explorer和跨浏览器兼容性问题。
您引用的特定行使用JavaScript OR 运算符||
,它基本上返回定义的第一个元素(或非假的)。因此,在这种情况下,如果浏览器将参数e
传递给事件处理程序,那么将使用它,否则使用window.event
。
注意(e || window.event)
中的括号。这告诉引擎在对结果做任何事情之前评估 OR 运算符。这是有道理的,因为如果定义了e.returnValue
,您想要访问e
,否则会window.event.returnValue
。
答案 1 :(得分:2)
这意味着:
e.returnValue = confirmationMessage;
如果不是e
window.event.returnValue.confirmationMessage;
考虑此代码段的输出:
var a = {};
var b = undefined;
var c = {};
(b || a).first = 'First!';
(c || a).second = 'Second!';
console.log(a);
console.log(b);
console.log(c);

Object { first: "First!" } // <-- a
undefined // <-- b
Object { second: "Second!" } // <-- c
在行(b || a).first = 'First!';
中,b评估falsy对a进行评估,是否真实,因此定义了a.first
。
在(c || a).second = 'Second!';
行中,c评估真实性,因此定义了c.second
。请注意,a.second
未定义,因为JavaScript&#39; s短路。
您发布的特定代码存在的原因是因为Internet Exploder&#s>资源管理器的旧版本。
答案 2 :(得分:2)
是的:)
如果e
为“true”(非空,有效对象),那么它将返回e.returnValue
,否则window.event.returnValue
答案 3 :(得分:0)
所有代码正在提供一个跨浏览器的解决方案来获取刚刚发生的事件。这是因为旧版本的IE不会将Event对象传递给事件处理程序,而是设置只能从事件处理程序访问的window.event
。更确切地说:
首先检查是否设置了e
。如果设置了,则括号中的代码返回e
的值,然后获取e.returnValue
的值。如果未设置e
,则括号返回window.event
,然后获取window.event.returnValue
的值。
如果您想了解有关window.event
对象的更多信息,可以在此处阅读。
Event Object IE