event.returnValue在IE7中给我一个错误

event.returnValue gives me an error in IE7

本文关键字:一个 错误 returnValue IE7 event      更新时间:2023-09-26

所以我从错误开始,因为e.preventDefault在IE7中不起作用。我在这里发现event.prventDefault()函数在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中的三元运算符行上得到一个Invalid参数错误。我知道它正在命中event.returnValue=false;因为我在那里放了一个警报进行调试。

有什么想法吗?

三元运算符不是这样工作的。此声明:

event.preventDefault ? event.preventDefault() :  event.returnValue = false;

无效。您应该使用:

if(event.preventDefault)
  event.preventDefault();
else
  event.returnValue = false;

三元运算符用作r值,而不是一般的if/else语句替换。

此外,对于IE<9您应该使用全局window.eventwindow.event.returnValue)。

更新

事实上,三元运算符在Javascript中似乎是这样工作的(所以它是而不是无效)。根据ECMA规范和IMHO,这仍然是一个"骗局",它损害了代码的可读性(至少对于能够区分左值和右值的程序员来说)。

您的代码看起来就像在使用jQuery。如果您正在处理使用jQ函数绑定的事件,如ondelegatebind,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
};

如果你觉得这很糟糕,谁能责怪你,你可以增加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();
}