سؤال

فيما يلي رمز 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;
    }
});

المرجعي : كيفية تعطيل اختصارات لوحة المفاتيح في IE7 / IE8

إليك وظيفة كنت أختبرها مع البناء الليلي من 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;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top