【问题标题】:event.preventDefault() function not working in IEevent.preventDefault() 函数在 IE 中不起作用
【发布时间】:2010-11-03 06:57:33
【问题描述】:

以下是我的 JavaScript (mootools) 代码:

$('orderNowForm').addEvent('submit', function (event) {
    event.preventDefault();
    allFilled = false;
    $$(".required").each(function (inp) {
        if (inp.getValue() != '') {
            allFilled = true;
        }
    });

    if (!allFilled) {
        $$(".errormsg").setStyle('display', '');
        return;
    } else {
        $$('.defaultText').each(function (input) {
            if (input.getValue() == input.getAttribute('title')) {
                input.setAttribute('value', '');
            }
        });
    }

    this.send({
        onSuccess: function () {
            $('page_1_table').setStyle('display', 'none');
            $('page_2_table').setStyle('display', 'none');
            $('page_3_table').setStyle('display', '');
        }
    });
});

在除 IE 之外的所有浏览器中,这都可以正常工作。但在 IE 中,这会导致错误。我有 IE8,所以在使用它的 JavaScript 调试器时,我发现 event 对象没有导致错误的 preventDefault 方法,因此表单正在提交。在 Firefox(我使用 Firebug 发现)的情况下支持该方法。

有什么帮助吗?

【问题讨论】:

  • 确实如此;根据文档(mootools.net/docs/core/Native/Event#Event:preventDefault),他应该工作:“事件方法:preventDefault - 跨浏览器方法以防止事件的默认操作。”
  • 糟糕,我删除了我的评论,即“mootools 没有停止事件的方法吗?”。所以ie8上的mootools有问题...
  • 无法重现此问题。 This fiddle“在 ie 8 上为我工作”你能设置一个简化的小提琴来显示错误吗? jsfiddle.net

标签: javascript internet-explorer events mootools preventdefault


【解决方案1】:

在IE中,可以使用

event.returnValue = false;

达到同样的效果。

并且为了不报错,可以测试一下preventDefault的存在:

if(event.preventDefault) event.preventDefault();

您可以将两者结合起来:

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

【讨论】:

  • 以下代码对我有用: if (event.preventDefault) { event.preventDefault(); } 其他 { event.returnValue = false; }
  • event.preventDefault ? event.preventDefault() : event.returnValue = false;
  • 值得注意的是,“event”必须是IE8中的全局事件对象。您不能使用传递给事件处理程序的事件,例如 e.preventDefault,它必须是 event.preventDefault 才能在 IE8 中工作。
  • event.preventDefault(); 出于某种原因突然停止在 FireFox 中为我工作。使用 mority 的代码,效果很好。谢谢~
  • 只是为了让@jmort253 的评论更加清晰:$('.something').click(function(e){ e.preventDefault ? e.preventDefault() : event.returnValue = false; });
【解决方案2】:

Mootools 重新定义了 Event 对象中的 preventDefault。所以你的代码应该在每个浏览器上都能正常工作。如果不支持,则说明 mootools 中的 ie8 支持存在问题。

您是否在 ie6 和/或 ie7 上测试过您的代码?

医生说

使用 addEvent 添加的每个事件都会自动获取 mootools 方法,无需手动实例化。

但如果没有,您可能想尝试

new Event(event).preventDefault();

【讨论】:

  • 在 IE 中也有这样的包装问题。我的天啊!为什么选择 IE?
  • 她不想停止这个事件,只是阻止它的默认动作。
【解决方案3】:

这是我一直在使用 jquery 1.3.2 和 09-18-2009 的夜间版本测试的一个功能。让我知道你的结果。在 OSX 上的 Safari、FF、Opera 中,一切都运行良好。它专门用于修复有问题的 IE8 错误,可能会产生意想不到的结果:

function ie8SafePreventEvent(e) {
    if (e.preventDefault) {
        e.preventDefault()
    } else {
        e.stop()
    };

    e.returnValue = false;
    e.stopPropagation();
}

用法:

$('a').click(function (e) {
    // Execute code here
    ie8SafePreventEvent(e);
    return false;
})

【讨论】:

  • 之前没见过stop这个方法,在msdn也找不到。它有什么作用?
  • .stop() 抛出异常,因为它不存在。任何异常都会产生预期的效果。
  • 为什么要抛出异常?我的意思是,如果你想抛出一个异常,你可以简单地调用e.preventDefault() 因为它无论如何都会抛出一个异常......
【解决方案4】:

如果您通过 mootools 的 addEvent 函数绑定事件,您的事件处理程序将获得一个作为参数传递的固定(增强)事件。它将始终包含 preventDefault() 方法。

试试这个小提琴看看事件绑定的区别。 http://jsfiddle.net/pFqrY/8/

// preventDefault always works
$("mootoolsbutton").addEvent('click', function(event) {
 alert(typeof(event.preventDefault));
});

// preventDefault missing in IE
<button
  id="htmlbutton"
  onclick="alert(typeof(event.preventDefault));">
  button</button>

对于所有 jQuery 用户,您可以在需要时修复事件。假设您使用 HTML onclick=".." 并获取缺少 preventDefault() 的 IE 特定事件,只需使用此代码即可获取它。

e = $.event.fix(e);

之后 e.preventDefault();工作正常。

【讨论】:

  • 不幸的是,这个技巧对我不起作用。我正在使用 IE 10 并且在调用 e.preventDefault(); 之前我打电话给 $.event.fix(e);没有成功:(
  • 它可能已从 jquery 2 中删除?但 IE10 不需要修复。
  • 你是不是又把固定事件赋给e变量了?
【解决方案5】:
if (e.preventDefault) {
    e.preventDefault();
} else {
    e.returnValue = false;
}

在 IE 9 和 Chrome 上测试。

【讨论】:

  • 在 IE 11 中不起作用(e.preventDefault 是一个函数,虽然它似乎没有做任何事情)
【解决方案6】:

要在 IE9 之后禁用键盘按键,请使用:e.preventDefault();

要在 IE7/8 下禁用常规键盘键,请使用:e.returnValue = false;return false;

如果您尝试禁用 键盘快捷键(使用 Ctrl,例如 Ctrl+F),您需要添加这些行:

try {
    e.keyCode = 0;
}catch (e) {}

这是一个仅适用于 IE7/8 的完整示例:

document.attachEvent("onkeydown", function () {
    var e = window.event;

    //Ctrl+F or F3
    if (e.keyCode === 114 || (e.ctrlKey && e.keyCode === 70)) {
        //Prevent for Ctrl+...
        try {
            e.keyCode = 0;
        }catch (e) {}

        //prevent default (could also use e.returnValue = false;)
        return false;
    }
});

参考:How to disable keyboard shortcuts in IE7 / IE8

【讨论】:

  • 你是唯一能一针见血的回答者。这里有人谈论早期 IE 的唯一原因是他们需要跨平台功能。 “e.keyCode = 0;”将杀死早期 IE 中的任何默认操作。
【解决方案7】:

我知道这是一篇相当老的帖子,但我只是花了一些时间尝试在 IE8 中完成这项工作。

IE8 版本似乎存在一些差异,因为此处和其他线程中发布的解决方案对我不起作用。

假设我们有这段代码:

$('a').on('click', function(event) {
    event.preventDefault ? event.preventDefault() : event.returnValue = false;
});

在我的 IE8 中 preventDefault() 方法因为 jQuery 而存在,但是不起作用(可能是因为下面的一点),所以这会失败。

即使我将returnValue属性直接设置为false:

$('a').on('click', function(event) {
    event.returnValue = false;
    event.preventDefault();
});

这也行不通,因为我只是设置了 jQuery 自定义事件对象的一些属性。

唯一适合我的解决方案是设置 全局变量 event 的属性 returnValue 如下:

$('a').on('click', function(event) {
    if (window.event) {
        window.event.returnValue = false;
    }
    event.preventDefault();
});

只是为了让那些试图说服 IE8 工作的人更容易。希望IE8早日惨死。

更新:

正如sv_in 指出的那样,您可以使用event.originalEvent 获取原始事件对象并在原始事件对象中设置returnValue 属性。但我还没有在我的 IE8 中测试过。

【讨论】:

【解决方案8】:

你的监听器中的return false 应该在所有浏览器中都可以工作。

$('orderNowForm').addEvent('submit', function () {
    // your code
    return false;
}

【讨论】:

    【解决方案9】:

    FWIW,如果以后有人重新讨论这个问题,你也可以检查你正在传递给你的 onKeyPress 处理函数的内容。

    当我错误地传递 onKeyPress(this) 而不是 onKeyPress(event) 时遇到了这个错误。

    只是需要检查其他内容。

    【讨论】:

      【解决方案10】:

      preventDefault 是一个广泛使用的标准;每次想要兼容旧版 IE 时都使用 adhoc 很麻烦,最好使用 polyfill:

      if (typeof Event.prototype.preventDefault === 'undefined') {
          Event.prototype.preventDefault = function (e, callback) {
              this.returnValue = false;
          };
      }
      

      这将修改 Event 的原型并添加此功能,这是一般 javascript/DOM 的一个很棒的功能。现在您可以毫无问题地使用e.preventDefault

      【讨论】:

        【解决方案11】:

        我得到了一种功能检查方法的帮助。此方法适用于 IE8

        if(typeof e.preventDefault == 'function'){
          e.preventDefault();
        } else {
          e.returnValue = false;
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-04-04
          • 1970-01-01
          • 2022-01-02
          • 2016-06-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多