所以我从错误开始,因为e.preventDefault在IE7中不起作用。我在这里找到event.preventDefault() function not working in IE并实现了答案 - 问题在于
event.returnValue = false;
似乎适用于那里的所有人,它不适合我!我也放了
if (event.returnValue) {
alert();
}
没有警觉。这是我的代码
$('#share a').click(function(e){
if (event.preventDefault) {
event.preventDefault();
} else {
window.event.returnValue = false;
}
if ($(this).parent('li').hasClass('email')) {
window.open(this.href,'share-this','height=750,width=500,status=no,toolbar=no');
} else {
window.open(this.href,'share-this','height=400,width=500,status=no,toolbar=no');
}
}
当我点击链接时,我在三元运算符行的IE7中得到一个无效参数错误。我知道它正在击中event.returnValue = false;因为我在那里发出警报进行调试。
有什么想法吗?
答案 0 :(得分:1)
三元运营商不会那样工作。这句话:
event.preventDefault ? event.preventDefault() : event.returnValue = false;
无效。你应该使用:
if(event.preventDefault)
event.preventDefault();
else
event.returnValue = false;
三元运算符作为r值工作,而不是一般的if / else语句替换。
此外,对于IE< 9您应该使用全局window.event
(window.event.returnValue
)。
实际上,三元运算符似乎在Javascript中工作(因此 无效)。根据ECMA规范和恕我直言,它仍然是一个“作弊”,它会损害代码的可读性(至少可以区分左值和左值的程序员)。
答案 1 :(得分:1)
您的代码看起来好像在使用jQuery。如果您正在处理使用jQ函数绑定的事件,例如on
,delegate
或bind
,则jQ将为您包装事件对象。您应该可以访问jQ的preventDefault()
,stopPropagation()
和stopImmediatePropagation()
方法,从而使您的三元无关。
如果您自己绑定事件,请确保event
变量未定义:
elem.onclick = function(e)
{//e should contain the event object, except for IE<9
e = e || window.event;//old IE's set the event as a property on the global object
};
如果你发现这是一个绳索,谁可以责怪你,you could augment the Event.prototype
。我为需要支持旧版本IE的代码执行此操作,但它还没让我失望......
三元运算符无法确定如何评估语句event.preventDefault ? event.preventDefault() : event.returnValue = false
。您可能意味着JS引擎将代码解释为(event.preventDefault ? event.preventDefault() : event.returnValue) = false
(将false
分配给三元组的结果)或 (event.preventDefault ? event.preventDefault() : event.returnValue = false)
(将整个语句视为三元表达。)
为了避免这种歧义,请对赋值表达式进行分组,让JS知道赋值是三元组的or
部分:
event.preventDefault ? event.preventDefault() : (event.returnValue = false);
话虽如此,使用三元作为陈述通常被认为是不好的做法。编写代码的更常见方式是:
e.returnValue = false;//returnValue is set on Chrome and, I believe FF, anyway
//if some browser Event objects don't have this, there's no harm in adding a property
//if the event object is read-only, the assignment will fail, silently
if (e.preventDefault)
{
e.preventDefault();
}