event.preventDefault () وظيفة لا تعمل في IE
-
05-07-2019 - |
سؤال
فيما يلي رمز 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 ، هذا يسبب خطأ. لديّ IE8 حتى أثناء استخدام مصحح أخطاء JavaScript ، اكتشفت أن event
الكائن ليس لديه ملف preventDefault
الطريقة التي تسبب الخطأ وبالتالي يتم تقديم النموذج. يتم دعم هذه الطريقة في حالة Firefox (التي اكتشفت باستخدام Firebug).
أي مساعدة؟
المحلول
في IE ، يمكنك استخدام
event.returnValue = false;
لتحقيق نفس النتيجة.
ولكي لا تحصل على خطأ ، يمكنك اختبار وجود PreventDefault:
if(event.preventDefault) event.preventDefault();
يمكنك الجمع بين الاثنين مع:
event.preventDefault ? event.preventDefault() : (event.returnValue = false);
نصائح أخرى
إذا قمت بربط الحدث من خلال وظيفة AddEvent Mootools ، فسيحصل معالج الحدث الخاص بك على حدث ثابت (معزز) تم تمريره كمعلمة. سوف تحتوي دائمًا على طريقة 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 () ، فقط استخدم هذا الرمز للحصول عليه.
e = $.event.fix(e);
بعد ذلك e.preventDefault () ؛ يعمل بشكل جيد.
أعلم أن هذا منشور قديم ، لكنني قضيت بعض الوقت في محاولة لجعل هذا العمل في IE8.
يبدو أن هناك بعض الاختلافات في إصدارات IE8 لأن الحلول المنشورة هنا وفي خيوط أخرى لم تنجح بالنسبة لي.
دعنا نقول أن لدينا هذا الرمز:
$('a').on('click', function(event) {
event.preventDefault ? event.preventDefault() : event.returnValue = false;
});
في IE8 preventDefault()
الطريقة موجودة بسبب jQuery ، ولكنها لا تعمل (ربما بسبب النقطة أدناه) ، لذلك سوف يفشل.
حتى لو قمت بتعيين returnValue
الخاصية مباشرة إلى خطأ:
$('a').on('click', function(event) {
event.returnValue = false;
event.preventDefault();
});
لن يعمل هذا أيضًا ، لأنني فقط قمت بتعيين بعض خاصية كائن حدث JQuery المخصص.
الحل الوحيد الذي يناسبني هو تعيين الممتلكات returnValue
من متغير عالمي event
مثله:
$('a').on('click', function(event) {
if (window.event) {
window.event.returnValue = false;
}
event.preventDefault();
});
فقط لتسهيل الأمر على شخص سيحاول إقناع IE8 بالعمل. آمل أن يموت IE8 بشكل فظيع في الموت المؤلم قريبًا.
تحديث:
كما sv_in تشير إلى أنه يمكنك استخدام event.originalEvent
للحصول على كائن الحدث الأصلي والتعيين returnValue
خاصية في واحد الأصلي. لكنني لم أختبرها في IE8 حتى الآن.
يعيد Mootools تعريف PrepantDefault في كائنات الأحداث. لذلك يجب أن يعمل الرمز الخاص بك بشكل جيد في كل متصفح. إذا لم يحدث ذلك ، فهناك مشكلة في دعم IE8 في Mootools.
هل اختبرت الكود الخاص بك على IE6 و/أو IE7؟
يقول المستند
يحصل كل حدث إضافي مع Addevent على طريقة Mootools تلقائيًا ، دون الحاجة إلى مثاله يدويًا.
ولكن في حال لم يكن الأمر كذلك ، فقد ترغب في المحاولة
new Event(event).preventDefault();
if (e.preventDefault) {
e.preventDefault();
} else {
e.returnValue = false;
}
تم اختباره على IE 9 و Chrome.
لتعطيل مفتاح لوحة المفاتيح بعد 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;
}
});
إليك وظيفة كنت أختبرها مع البناء الليلي من JQuery 1.3.2 و 09-18-2009. اسمحوا لي أن أعرف نتائجك معها. كل شيء ينفذ بشكل جيد في هذه الغاية في Safari ، FF ، Opera على OSX. إنه حصريًا لإصلاح حشرة 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;
})
preventDefault
هو معيار واسع النطاق. يعد استخدام adhoc في كل مرة تريد أن تكون متوافقًا مع إصدارات IE القديمة مرهقة ، ومن الأفضل استخدام polyfill:
if (typeof Event.prototype.preventDefault === 'undefined') {
Event.prototype.preventDefault = function (e, callback) {
this.returnValue = false;
};
}
سيؤدي ذلك إلى تعديل النموذج الأولي للحدث وإضافة هذه الوظيفة ، وهي ميزة رائعة من JavaScript/DOM بشكل عام. الآن يمكنك استخدام e.preventDefault
مع عدم وجود مشكلة.
return false
في المستمع يجب أن يعمل في جميع المتصفحات.
$('orderNowForm').addEvent('submit', function () {
// your code
return false;
}
FWIW ، في حالة قيام أي شخص بإعادة النظر في هذا السؤال لاحقًا ، يمكنك أيضًا التحقق من ما تقوم بتسليمه إلى وظيفة معالج OnKeypress.
واجهت هذا الخطأ عندما مررت عن طريق الخطأ onkeypress (هذا) بدلاً من Onkeypress (الحدث).
مجرد شيء آخر للتحقق.
لقد ساعدني بطريقة مع فحص الوظيفة. هذه الطريقة تعمل في IE8
if(typeof e.preventDefault == 'function'){
e.preventDefault();
} else {
e.returnValue = false;
}