2011-08-31 11 views
23

यहां कुछ ऐसे नमूना परीक्षण एचटीएमएल है timjeanes.com/ie9_onbeforeunload.htmonbeforeunload घटना IE9 में भी उत्साही

फायरफॉक्स, क्रोम और सफारी में, मैं व्यवहार मैं चाहते । यही है, पहले दो लिंक में से किसी एक पर क्लिक करना एक चेतावनी संवाद दिखाता है; तीसरे लिंक पर क्लिक करके (या अन्यथा नेविगेट करना) दिखाता है "क्या आप वाकई इस पृष्ठ को छोड़ना चाहते हैं?" संदेश।

हालांकि, आईई 9 में, "क्या आप वाकई इस पृष्ठ को छोड़ना चाहते हैं?" संदेश तब भी दिखाता है जब आप पहले दो लिंक में से किसी एक पर क्लिक करते हैं, भले ही कोई नेविगेशन नहीं हो रहा हो - हम बस कुछ जावास्क्रिप्ट चला रहे हैं।

क्या कुछ ऐसा है जो मैं गलत कर रहा हूं? या आईई के लिए एक अच्छा कामकाज है?

एक विकल्प href = "#" का उपयोग करना होगा और मेरी जावास्क्रिप्ट को ऑनक्लिक में रखना होगा। मैं उस पर उत्सुक नहीं हूं क्योंकि यह उपयोगकर्ता को पृष्ठ के शीर्ष पर ले जाता है, और मेरा वास्तविक जीवन पृष्ठ काफी लंबा है।

मैंने IE के अन्य संस्करणों में परीक्षण नहीं किया है।

+4

वैसे भी अपनी जावास्क्रिप्ट को "href" में रखना मुश्किल है। इसे ईवेंट हैंडलर विशेषता में रखें या, बेहतर अभी तक, इसे अलग-अलग अप्रचलित जावास्क्रिप्ट कोड के साथ गतिशील रूप से संलग्न करें। यदि आपका ईवेंट हैंडलर क्लिक की डिफ़ॉल्ट कार्रवाई रद्द कर देता है, तो ब्राउज़र पृष्ठ को स्क्रॉल नहीं करेगा। – Pointy

+1

हाँ, मैं वास्तविक जीवन में अविभाज्य जावास्क्रिप्ट का उपयोग कर रहा हूँ; मैं सिर्फ नमूना कोड में चीजों को संक्षिप्त रखना चाहता था। इसे href में डालकर यह प्रदर्शित करना था कि यह समाधान नहीं था। हालांकि धन्यवाद। – teedyay

+1

ठीक है, तो आगे बढ़ें :-) – Pointy

उत्तर

17

यह एक बहुत दुर्भाग्यपूर्ण बग है। ऐसा लगता है कि आपको इसके आसपास काम करना होगा, और हैश लिंक विधि का उपयोग करना शायद सबसे अच्छा तरीका है। उपयोगकर्ता को पृष्ठ के शीर्ष पर ले जाने से बचने के लिए, event.preventDefault() और का उपयोग करके ईवेंट रद्द करें।

function myClickHandler(e) { 
    if (e.preventDefault) 
     e.preventDefault(); 
    e.returnValue = false; 
    alert("Not going anywhere!"); 
} 

इसे इस तरह कॉल:

<a href="#" onclick="myClickHandler(event)">Go nowhere 1</a> 

संपादित करें: आप सभी अपने पृष्ठ पर इस तरह हैश-लिंक के लिए घटना को रद्द कर सकता है:

var links = document.links; 
for (var i = 0; i < links.length; i++) { 
    var link = links[i]; 
    if (link.href == "#") { 
     if (link.addEventListener) { 
      link.addEventListener("click", cancelEvent, false); 
     } 
     else if (link.attachEvent) { 
      link.attachEvent("onclick", cancelEvent); 
     } 
    } 
} 
function cancelEvent(e) { 
    e = e || window.event; 
    if (e.preventDefault) 
     e.preventDefault(); 
    e.returnValue = false; 
} 

या jQuery के साथ कोड की केवल एक पंक्ति का उपयोग करके:

$("a[href='#']").click(function (e) { e.preventDefault(); }); 
+1

ओह, मुझे यह पसंद है! मैं '$ ('a [href = #]') के लिए गया था। लाइव ('क्लिक करें', फ़ंक्शन (ई) {e.preventDefault();}); 'बाद में बनाए गए हाइपरलिंक्स को कवर करने के लिए (यह काफी गतिशील है पृष्ठ)। – teedyay

2

आपको href="javascript:... का उपयोग करके क्लिक करने के लिए कोई ईवेंट बाध्य नहीं करना चाहिए: नीचे अच्छा नहीं है।

<a href="javascript:alert('Not going anywhere!');">Go nowhere 1</a> 

यदि आप ऑनक्लिक का उपयोग करने और href को रद्द करने के लिए जा रहे हैं तो बस ऑनक्लिक में झूठी वापसी करें।

<a onclick="alert('Not going anywhere!');return false;">Go nowhere 2</a> 
+0

ध्यान दें कि यदि आपके पास कोई href नहीं है तो आपको लिंक पर होवर करते समय पॉइंटर कर्सर नहीं मिलेगा। यदि आप पॉइंटर कर्सर चाहते हैं: आप href को "#" पर सेट कर सकते हैं। या इसे इस तरह सीएसएस में करें: http://stackoverflow.com/questions/2409836/how-to-set-cursor-style-to-pointer-for-links-without-hrefs –

1

यह वास्तव में एक बग नहीं है कि "क्या आप वाकई इस पृष्ठ को छोड़ना चाहते हैं?" जब आप पहले लिंक पर क्लिक करते हैं तो संदेश पॉप अप होता है; More reasons I dislike IE

+0

मुझे लगता है कि दस्तावेज़ कहता है, "डिफ़ॉल्ट कार्रवाई: सिग्नल जो दस्तावेज़ को अनलोड किया जा रहा है। " लेकिन यह unloadoo unloaded है! फ्लिपिन 'आईई। मैंने वास्तव में सोचा था कि संस्करण 9 इसे सबसे ज्यादा शपथ ग्रहण करने वाले ब्राउज़रों की सूची में नंबर एक स्लॉट से बाहर ले जाएगा, लेकिन नहीं। – teedyay

5

में सिर्फ # और स्क्रिप्ट के बजाय कूद पेज को रोकने के लिए एक अधिक आसान समाधान IE और अन्य ब्राउज़र में onbeforeunload में ऑनअनलोड उपयोग करने के लिए है - यह आईई 9 में एक "सुविधा" हो रहा है ।

+0

यह मेरे लिए काम किया ... मैंने इसे अभी चालू करने के लिए बदल दिया और अब यह सभी ब्राउज़रों में काम करता है ... – Rich701