IE में काम नहीं कर रहा है


202

निम्नलिखित मेरा जावास्क्रिप्ट (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 है, इसलिए मुझे पता चला कि eventऑब्जेक्ट में एक preventDefaultविधि नहीं है जो त्रुटि पैदा कर रहा है और इसलिए फॉर्म जमा हो रहा है। विधि फ़ायरफ़ॉक्स के मामले में समर्थित है (जो मुझे फायरबग का उपयोग करके पता चला)।

कोई मदद?


ऐसा होता है; डॉक्स ( mootools.net/docs/core/Native/Event#Event:preventDefault ) के अनुसार उसके पास क्या काम होना चाहिए: "इवेंट विधि: preventDefault - ईवेंट की डिफ़ॉल्ट कार्रवाई को रोकने के लिए क्रॉस ब्राउज़र विधि।"
पाओलो बरगीनो

मेरे बुरे, मैंने अपनी टिप्पणी को हटा दिया, जो "म्यूटूल में घटनाओं को रोकने का तरीका नहीं है?"। तो ie8 पर mootools के साथ एक समस्या है ...
Alsciende

2
इस समस्या को पुन: उत्पन्न नहीं कर सकता। यह फिडेल "मेरे लिए 8 पर काम करता है" क्या आप त्रुटि को दिखाने के लिए एक कम फ़िडल सेटअप कर सकते हैं? jsfiddle.net
eerne

जवाबों:


472

IE में, आप उपयोग कर सकते हैं

event.returnValue = false;

उसी परिणाम को प्राप्त करने के लिए।

और एक त्रुटि प्राप्त नहीं करने के लिए, आप निवारण के अस्तित्व के लिए परीक्षण कर सकते हैं:

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

आप दोनों को एक साथ जोड़ सकते हैं:

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

48
निम्नलिखित कोड ने मेरे लिए काम किया: अगर (event.preventDefault) {event.preventDefault (); } और {event.returnValue = false; }
sv_in

229
event.preventDefault ? event.preventDefault() : event.returnValue = false;
मोरी

31
यह ध्यान देने योग्य है कि IE8 में "इवेंट" वैश्विक इवेंट ऑब्जेक्ट होना चाहिए। आप ईवेंट हैंडलर में पारित ईवेंट का उपयोग नहीं कर सकते हैं, जैसे कि e.preventDefault, IE8 में काम करने के लिए यह ईवेंट ।preventDefault होना चाहिए।
jmort253

event.preventDefault();किसी कारण से फायरफॉक्स में मेरे लिए काम करना बंद कर दिया, नीले रंग से बाहर। नैतिकता के कोड का इस्तेमाल किया और यह महान काम किया। धन्यवाद ~
जेम्स

8
सिर्फ @ jmort253 की टिप्पणी में कुछ स्पष्टता जोड़ने के लिए:$('.something').click(function(e){ e.preventDefault ? e.preventDefault() : event.returnValue = false; });
ल्यूक

23

यदि आप म्यूटूल के ऐडवेंट फ़ंक्शन के माध्यम से ईवेंट को बांधते हैं, तो आपके ईवेंट हैंडलर को पैरामीटर के रूप में एक निश्चित (संवर्धित) ईवेंट मिलेगा। इसमें हमेशा निवारण () विधि शामिल होगी।

इवेंट बाइंडिंग में अंतर देखने के लिए इस फ़ील को आज़माएं। 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 = ".." का उपयोग किया है और एक IE विशिष्ट घटना प्राप्त करें, जिसमें preventDefault () का अभाव है, बस इसे प्राप्त करने के लिए इस कोड का उपयोग करें।

e = $.event.fix(e);

उसके बाद e.preventDefault (); ठीक काम करता है।


2
दुर्भाग्य से यह ट्रिक मेरे लिए काम नहीं कर रही है। मैं IE 10 का उपयोग कर रहा हूं और e.preventDefault () कॉल करने से पहले; मैं $ .event.fix (ई) बुला कैम; कोई सफलता के साथ :(
बीटल्स 1692

यह 2 jquery से हटा दिया गया हो सकता है? लेकिन IE10 को फिक्स की जरूरत नहीं है।
पुरानी छिपकली

क्या आपने ई चर को निश्चित घटना को फिर से असाइन किया है?
पुरानी छिपकली

11

मुझे पता है कि यह काफी पुरानी पोस्ट है लेकिन मैंने अभी कुछ समय 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 में इसका परीक्षण नहीं किया है।


1
आप मूल ब्राउज़र ईवेंट ऑब्जेक्ट से भी प्राप्त कर सकते हैं event.originalEvent। अधिक जानकारी: stackoverflow.com/a/16675056/22550
sv_in

6

Mootools इवेंट ऑब्जेक्ट्स में निवारण को फिर से परिभाषित करता है। इसलिए आपका कोड हर ब्राउज़र पर ठीक काम करना चाहिए। यदि ऐसा नहीं होता है, तो mootools में ie8 समर्थन के साथ एक समस्या है।

क्या आपने अपना कोड ie6 और / या ie7 पर परीक्षण किया था?

डॉक्टर कहते हैं

AddEvent के साथ जोड़े गए प्रत्येक ईवेंट को मैन्युअल रूप से आवृत्ति करने की आवश्यकता के बिना, स्वचालित रूप से म्यूटूल विधि प्राप्त होती है।

लेकिन अगर ऐसा नहीं होता है, तो आप कोशिश कर सकते हैं

new Event(event).preventDefault();

1
IE में भी इस तरह से लपेटने पर कुछ समस्या थी। हे भगवान! क्यों IE?
sv_in

हालांकि, वह इस घटना को रोकना नहीं चाहती, हालांकि, अपनी डिफ़ॉल्ट कार्रवाई को रोकती है।
Alsciende

5
if (e.preventDefault) {
    e.preventDefault();
} else {
    e.returnValue = false;
}

IE 9 और क्रोम पर परीक्षण किया गया।


2
IE 11 में काम नहीं करता है (e.preventDefault एक फ़ंक्शन है, हालाँकि यह कुछ भी करने के लिए प्रतीत नहीं होता है)
GreySage

4

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 में कीबोर्ड शॉर्टकट को अक्षम कैसे करें


सिर पर कील ठोकने वाले आप एकमात्र उत्तरदाता हैं। एकमात्र कारण है कि यहाँ कोई भी IE के बारे में बात कर रहा है, उन्हें क्रॉस प्लेटफ़ॉर्म कार्यक्षमता की आवश्यकता है। "e.keyCode = 0;" जल्दी IE में किसी भी डिफ़ॉल्ट कार्रवाई को मार देगा।
www-0av-Com

3

यहाँ एक समारोह है जो मैं jquery के साथ परीक्षण कर रहा हूँ 1.3.2 और 09-18-2009 की रात का निर्माण। मुझे इसके साथ अपने परिणाम बताएं। ओएसएक्स पर सफारी, एफएफ, ओपेरा में इस छोर पर सब कुछ ठीक चलता है। यह विशेष रूप से एक समस्याग्रस्त 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;
})

1
मैंने पहले कभी इस stopविधि को नहीं देखा है , और मैं इसे msdn में नहीं ढूंढ सका। यह क्या करता है?
ओरियल

1
.stop()एक अपवाद फेंकता है, क्योंकि यह मौजूद नहीं है। किसी भी अपवाद का वांछित प्रभाव होगा।
बजे जे बाजुज़ी

और आप एक अपवाद क्यों फेंकना चाहेंगे? मेरा मतलब है, अगर आप एक अपवाद फेंकना चाहते हैं, तो आप बस कॉल कर सकते हैं e.preventDefault()क्योंकि यह एक अपवाद को फेंक देगा ...
Matthias Burger

2

preventDefaultएक व्यापक मानक है; हर बार जब आप पुराने IE संस्करणों के अनुरूप होना चाहते हैं तो एक एडहॉक का उपयोग करना बोझिल होता है, एक पॉलीफिल का उपयोग करना बेहतर होता है:

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

यह ईवेंट के प्रोटोटाइप को संशोधित करेगा और इस फ़ंक्शन को जोड़ देगा, सामान्य रूप से जावास्क्रिप्ट / डोम की एक बड़ी विशेषता। अब आप e.preventDefaultबिना किसी समस्या के उपयोग कर सकते हैं ।


0

return false आपके श्रोता को सभी ब्राउज़रों में काम करना चाहिए।

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

0

एफडब्ल्यूआईडब्ल्यू, यदि कोई इस प्रश्न को बाद में बताता है, तो आप यह भी जांच सकते हैं कि आप अपने ऑनकेयर हैंडलर फ़ंक्शन को क्या सौंप रहे हैं।

जब मैं गलती से onKeyPress (इवेंट) के बजाय onKeyPress (यह) पास हो गया तो मैं इस त्रुटि में भाग गया।

बस जांच करने के लिए कुछ और।


0

मुझे फ़ंक्शन जाँच के साथ एक विधि द्वारा मदद की गई थी। यह विधि IE8 में काम करती है

if(typeof e.preventDefault == 'function'){
  e.preventDefault();
} else {
  e.returnValue = false;
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.