event.preventDefault()函数在IE中不起作用

以下是我的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,所以当使用其JavaScriptdebugging器,我发现event对象没有一个preventDefault方法,这是导致错误,所以表单正在提交。 该方法是支持Firefox的情况下(我发现使用Firebug)。

任何帮助?

在IE中,你可以使用

 event.returnValue = false; 

达到同样的效果。

为了不出错,可以testingpreventDefault的存在性:

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

你可以将两者结合起来:

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

如果通过mootools的addEvent函数绑定事件,则事件处理程序将获取作为parameter passing的固定(增加)事件。 它将始终包含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 =“..”,并得到一个缺lesspreventDefault()的IE特定事件,只需使用这段代码就可以得到它。

 e = $.event.fix(e); 

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

我知道这是一个相当古老的职位,但我只是花了一些时间试图使这个工作在IE8。

看来,IE8版本有一些差异,因为在这里和其他线程发布的解决scheme不适合我。

假设我们有这样的代码:

 $('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自定义事件对象的属性。

唯一对我有效的解决scheme就是像这样设置全局variables event属性returnValue

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

只是为了让那些试图说服IE8工作的人更容易。 我希望IE8很快就会死于痛苦的死亡。

更新:

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

Mootools在Event对象中重新定义了preventDefault。 所以你的代码应该在每个浏览器上正常工作。 如果没有,那么在mootools中有一个ie8支持的问题。

你有没有在ie6和/或ie7上testing你的代码?

医生说

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

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

 new Event(event).preventDefault(); 
 if (e.preventDefault) { e.preventDefault(); } else { e.returnValue = false; } 

在IE 9和Chrome上testing

要在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; } }); 

参考: 如何禁用IE7 / IE8中的键盘快捷键

这是我用jQuery 1.3.2和09-18-2009的每晚构buildtesting的一个函数。 让我知道你的结果。 在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; }) 

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

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

FWIW,万一任何人稍后再次访问这个问题,你也可以检查你的onKeyPress处理函数。

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

只是别的要检查。

preventDefault是一个普遍的标准; 使用adhoc每次你想要符合旧的IE版本是麻烦的,更好地使用polyfill:

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

这将修改事件的原型,并添加此function,一般的JavaScript / DOM的一个伟大的function。 现在你可以使用e.preventDefault了。