2010-08-20 20 views
26

मुझे अभी पहले किसी भी आईई उपयोगकर्ताओं को इंगित करें (यह क्रोम, सफारी या फ़ायरफ़ॉक्स में कोई समस्या नहीं है) संकेत संकेत;)सदस्य आईई त्रुटि नहीं मिला (आईई 6, 7, 8, 9)

तो ... मुझे आईई में अपने टूलटिप्स के साथ कोई समस्या है, मेरे पास उन सभी तत्वों के लिए ऑनमूसओवर श्रोता है जो होवर करने योग्य हैं और फिर मेरे माउसओवर फ़ंक्शन में मेरे पास एक बहुत ही बुनियादी क्रॉस ब्राउज़र घोषणा है ...

var event = e || window.event, 
    el = event.target || event.srcElement; 

मुझे आईई या कुछ में मौजूद विंडो ऑब्जेक्ट के साथ समस्याएं नहीं आ रही हैं, यह टूलटिप के रास्ते पर माउस तत्व के एक तत्व माउसओवर से माउसओवर को अनदेखा करने के लिए एक झंडा जोड़ा गया है समय चक्र अनुमति, 300 एमएमएस)। दूसरे शब्दों में ध्वज मूल माउसओवर से टूलटिप के मार्ग पर माउसओवर को अनदेखा करना है।

ताकि तर्क इस तरह दिखता है ...

loadtip.refMouseOver = function (e) { 

    var event = e || window.event, el = event.target || event.srcElement; 
    //console.log(window); // <-- throws error in IE (Member not found) 
    // Reset the lastHoveredRef data. 
    tipManager.lastHoveredRef = null; 
    tipManager.lastHoveredRef = [el, event]; 

    // true means there is a tip open still, so if no tip is open. 
    if (tipManager.tipState !== true) { 
     tipManager.processTip(el, event); 
    } else {   
     return; // do nothing 
    } 

} 

"सदस्य नहीं मिला" त्रुटि हो जाएगा जब मैं टूलटिप अभी भी खुला साथ IE में अगले करने के लिए जल्दी से एक तत्व से होवर करें।

मैंने खिड़की के बारे में पढ़ा है और कोशिश करने के साथ करीबी चीजें पढ़ी हैं, लेकिन मुझे नहीं पता कि यह कैसे था। कोई भी मदद बहुत ही सराहनीय होगी।

धन्यवाद

उत्तर

42

ठीक है मुझे समस्या मिली है।

इसे समेटने के लिए, मूल रूप से आईई किसी अन्य फ़ंक्शन में कोई ईवेंट नहीं पारित करेगा यदि वह फ़ंक्शन कॉल सेटटाइमआउट के भीतर है।

तो तुम घटना की एक प्रति बनाने और गुजर कि, यहाँ इस बात का एक उदाहरण है द्वारा आईई चाल कर सकते हैं ...

var eventCopy = {}; 
for (var i in event) { 
    eventCopy[i] = event[i];  
} 

तो बस अपने कार्य eventCopy भेजने के लिए, भले ही यह है एक ' कुल 'हैक।

setTimeout(function() { yourFunction(eventCopy), yourDelayTime); 

और वॉयला यह काम करेगा।

मुझे जोड़ना चाहिए, कि इंटरनेट एक्सप्लोरर केवल वैश्विक विंडो ईवेंट का संदर्भ देगा, यही कारण है कि हमें घटना की प्रति की आवश्यकता है। ऐसा इसलिए है क्योंकि सेट टाइमटाइम फ़ंक्शन को कॉल करता है, windows.event पहले से ही पारित हो चुका है,

नीचे पंक्ति ... एक सेटटाइमआउट के अंदर कोई ईवेंट भेजने की कोशिश न करें क्योंकि IE इसे स्वीकार नहीं करेगा। यह मेरे परीक्षण से आईई 6, 7 & 8 के लिए सच है।

0

मुझे एहसास है कि यह प्रश्न/उत्तर बहुत पुराना है और इसे हल किया जा रहा है। ऐसा कहा जा रहा है कि, मेरे पास एक और विकल्प है जिसका उपयोग मैंने एमएसआईई 9 से पहले आईई संस्करणों में 'सदस्य नहीं मिला' के साथ एक समान - अभी तक थोड़ा अलग करने के लिए किया है। मुझे आशा है कि इससे किसी को मदद मिलेगी! ... इसका उपयोग फ़ायरफ़ॉक्स के साथ window.event के साथ समस्याओं के आसपास काम करने के लिए भी किया जा सकता है।

सबसे पहले मैंने jQuery बढ़ाया और एमएसआईई संस्करण या -1 प्राप्त करने के लिए एक फ़ंक्शन जोड़ा, यदि ब्राउज़र गैर MSIE है। आप इसे पूरा करने के लिए वही कर सकते हैं या सिर्फ एक शुद्ध जेएस फ़ंक्शन बना सकते हैं। फिर एक ईवेंट ओवरराइड फ़ंक्शन बनाएं (कुछ मामलों में वैश्विक 'ईवेंट' चर जोड़ने के लिए आवश्यक हो सकता है), यह प्रति व्यक्ति स्थिति के आधार पर अधिक है। फिर आवश्यकतानुसार अपने ईवेंट हैंडलर में ईवेंट को ओवरराइड करें।

jQuery

// So this will give you the version of IE (or for non IE browser -1) 
$.fn.msieVersion = function() 
{ 
    if (navigator.userAgent.toLowerCase().indexOf('msie') !== -1) { 
     return document.documentMode; 
    } 
    return -1; 
}; 

अवहेलना वैश्विक घटना का विस्तार

var setEvent = function(evt) { 
    // Set the event if MSIE version is >= 9 or is -1 which means it's not IE 
    if ($.fn.msieVersion() >= 9 || $.fn.msieVersion === -1) { 
     // NOTE: I have a global 'event' variable I'm using that comes from another previously loaded JS file 
     // Why? I didn't do it. I'm updating some SUPER old code the best I can. (old enough it has references to Netscape....) 
     event = evt || window.event; 
    } 
    return true; 
}; 

प्रयोग उदाहरण

$('img.myImageID').bind('mouseover mouseout', function (evt) { 
    setEvent(evt); // Override the event 
    // DO WORK! ...continue all other awesomeness here! 
    // Maybe setTimeout(...) 
};