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
了。