2012-06-19 8 views
15

अगर मैं jQuery जो window.open() करता है के साथ एक क्लिक आरंभ किया है, यह पॉप अप ब्लॉकर द्वारा अवरुद्ध है अगर मैं क्लिक मैन्युअल विंडो बंद नहीं कर दिया जाए। ब्राउज़र दोनों के बीच कैसे भिन्न होता है?ब्राउजर उपयोगकर्ता क्लिक और प्रोग्रामेटिक क्लिक के बीच अंतर कैसे बताता है?

+1

यहाँ एक [jsfiddle] (http://jsfiddle.net/twMSG/1/) प्रदर्शित करने के लिए है। यह पेज लोड पर पॉपअप करने की कोशिश करेगा लेकिन अवरुद्ध हो जाएगा। 'क्लिक' ईवेंट को कॉल करने से प्रोग्रामेटिक रूप से अवरुद्ध हो जाता है लेकिन यदि आप इसे किसी अन्य क्लिक ईवेंट के भीतर कॉल करते हैं तो यह हो जाता है। – sachleen

उत्तर

6

इस की फ़ायरफ़ॉक्स कार्यान्वयन this bug पर विस्तार से चर्चा की है, और this other bug सहित क्या लंबाई साइटों आदेश (असंदिग्ध उन पर एक अवांछित पॉप अप विंडो थोपना करने के लिए इस मामले में में के माध्यम से जाना होगा, कुछ और दिलचस्प पृष्ठभूमि है: से window.open() बुला एक छवि के भीतर load घटना)। यदि आप बगजिला के आसपास खोज करते हैं तो आप पाएंगे कि मोज़िला लोगों ने यह सब ठीक से काम करने के लिए कई सालों लगे, उदाहरण के लिए here's a bug from 2001

जिस तरह से यह वर्तमान में काम करता है यह है: जब फ़ायरफ़ॉक्स समय window.open() की एक निश्चित राशि जावास्क्रिप्ट (about:config में dom.disable_open_click_delay के लिए देखो) में सक्षम किया गया है के लिए, ऑपरेटिंग सिस्टम से क्लिक करें घटना प्राप्त करता है। यदि आप एक उपयोगकर्ता क्लिक तो पहला कदम होने वाली है, window.open() के सक्षम किए बिना कोड से click() घटना को कॉल करते हैं कभी नहीं होता है, हालांकि window.open() करने के लिए कॉल ही सफल होगा to stop sites detecting that you have popup blocking enabled

मुझे यकीन है कि कैसे अन्य ब्राउज़रों इस सामग्री को लागू लेकिन अगर यह बहुत अलग था यह मेरे लिए आश्चर्य की बात हो जाएगा नहीं कर रहा हूँ।

1

मुझे विश्वास है कि jQuery के माध्यम से click बुला वास्तव में बहुत तत्व पर एक क्लिक ट्रिगर नहीं करता, लेकिन इसके बजाय समारोह क्लिक को सुनने के लिए कहता है। तो हालांकि आप click() पर कॉल कर रहे हैं, आप वास्तव में केवल एक फ़ंक्शन को कॉल कर रहे हैं।

जब उपयोगकर्ता क्लिक करता है, यह एक वास्तविक क्लिक है।

उदाहरण:

var handler = function() { 
    alert('hi'); 
}; 

$('#example').on('click', handler); 
$('#example').click(); // really just calls handler(); 
+0

क्या यह मूल जावास्क्रिप्ट .click() के बारे में भी सच है? – nbrooks

+1

ध्यान देने योग्य दिलचस्प बात: यदि आप उपयोगकर्ता के रूप में, क्लिक कोड निष्पादित किए जाने वाले कुछ भी करते हैं, तो यह अभी भी करता है। इसमें 'क्लिक' ईवेंट को कॉल करने वाले किसी चीज़ पर क्लिक करना शामिल है। या यहां तक ​​कि एक महत्वपूर्ण प्रेस इवेंट भी इसे कॉल कर सकता है और यह काम करेगा। – sachleen

+0

यह अनुमान करना मुश्किल है कि ब्राउजर इस चेक को कैसे लागू करता है क्योंकि उपयोगकर्ता को संकेत मिलने पर निर्देश देने के लिए विनिर्देशन में कुछ भी नहीं है। http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-2651361 – Fenton

0

ब्राउज़र की मूल कोड (ऑपरेटिंग सिस्टम से) वास्तविक माउस क्लिक घटना संभालती है और ब्राउज़र घटना वस्तु बनाता है। उस बिंदु पर ब्राउज़र के मूल कोड में, ब्राउज़र जानता है कि यह ईवेंट वास्तविक माउस क्लिक द्वारा बनाया गया था।

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

संबंधित मुद्दे