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

时间:2013-07-05 10:50:10

标签: javascript internet-explorer internet-explorer-7

所以我从错误开始,因为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;因为我在那里发出警报进行调试。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

三元运营商不会那样工作。这句话:

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规范和恕我直言,它仍然是一个“作弊”,它会损害代码的可读性(至少可以区分左值和左值的程序员)。

答案 1 :(得分:1)

您的代码看起来好像在使用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
};

如果你发现这是一个绳索,谁可以责怪你,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();
}