2011-06-01 19 views
44

मैं एक डोम घटना की तलाश में हूं जिसके लिए मैं जावास्क्रिप्ट के साथ सुन सकता हूं, जब एक चयनित तत्व खोला गया है (लेकिन कोई विकल्प नहीं बदला गया है) तब चयनित तत्व को क्लिक करके बंद किया जाता है, पृष्ठ पर कहीं और कहीं और ।क्या कोई डोम ईवेंट है जो एक HTML चयन तत्व बंद होने पर आग लगती है?

यह चयन के blur घटना नहीं है, क्योंकि चयन फोकस बरकरार रखता है। इसी तरह, यह किसी अन्य तत्व या दस्तावेज़ की focus घटना, या mousedown या click विंडो, दस्तावेज़ या निकाय पर नहीं है।

यह चयन के change ईवेंट नहीं है, क्योंकि चयन के भीतर कोई विकल्प नहीं बदला गया है।

मैं विरासत इंटरनेट एक्सप्लोरर्स के बारे में चिंतित नहीं हूं - मानकों के अनुरूप आधुनिक ब्राउज़र में काम करने के लिए बस कुछ। हालांकि मालिकाना हैक्स जानना लायक हो सकता है। "परिणाम" पैनल

  • पाठ पर क्लिक करें चिह्नित "यहाँ" (या कहीं और) में selectbox पर http://jsfiddle.net/premasagar/FpfnM/

    1. क्लिक करें एक साथ:

      मैं इस समस्या का प्रदर्शन करने के JSFiddle बना लिया है एकल क्लिक करें और देखें कि लॉग में कोई भी ईवेंट जोड़ा गया है या नहीं। नवीनतम क्रोम या फ़ायरफ़ॉक्स में कोई घटना नहीं है।

    तो सवाल यह है: चयन बॉक्स पर क्लिक करते समय कोई ईवेंट लॉग इन करने के लिए जावास्क्रिप्ट को जोड़ा जा सकता है?

    (मैं एक ऐसी ही कहा है, लेकिन यहाँ अलग प्रश्न:
    JavaScript on iOS: opening an HTML select element)

  • +8

    यदि आप के बारे में बताया कि आपको यह करना चाहता था, यह मदद कर सकता है। – Pointy

    +1

    ... क्योंकि आपके प्रश्न का सीधा, सरल जवाब है, "नहीं"। :-) – Pointy

    +1

    अन्य प्रश्न पर टिप्पणी में कारण क्यों है: http://stackoverflow.com/questions/6097240/javascript-on-ios-opening-an-html-select-element#comment-7069149 लेकिन यह एक गंभीर कारण है। संक्षेप में, मैं केवल चुनिंदा तत्व की स्थिति के बारे में कुछ प्रोग्रामेटिक जानकारी प्राप्त करना चाहता हूं। यदि यह संभव नहीं है, तो मैं वास्तव में उत्सुक हूं कि क्यों नहीं (?) – Premasagar

    उत्तर

    25

    दुर्भाग्य से कोई चुनिंदा बॉक्स बंद होने या खुला होने पर जानने के लिए कोई मानक घटना नहीं है, इसलिए आपका कोड जा रहा है विभिन्न ब्राउज़रों के लिए आवास के साथ सुंदर बालों वाली हो। जिसके अनुसार, मुझे लगता है कि यह किया जा सकता है, और मैं कुछ फ़ायरफ़ॉक्स में आप के लिए काम mouseup घटना का उपयोग कर मिल गया है:

    http://jsfiddle.net/FpfnM/50/

    Firefox में (और मैं क्रोम संभालने कर रहा हूँ), तो आप जा रहे हैं उस स्थिति को ट्रैक करने की आवश्यकता है जो बहुत सावधानीपूर्वक चयन करें। जब escape कुंजी दबाया जाता है या blur ईवेंट होता है, तो आपको इसे बंद करने के रूप में पहचानने के लिए राज्य को अपडेट करने की आवश्यकता होती है। मैंने अपने डेमो में इसे लागू नहीं किया है, और आप देख सकते हैं कि अगर आप चयन को बंद करने के बजाय भागते हैं तो क्या होता है।

    सफारी में चीजें आसान थीं, जहां चयन पर mousedown ईवेंट चयन खोलने का संकेत देता है, और चयन के किसी भी बंद को click ईवेंट द्वारा इंगित किया जाता है।

    यदि आपको ऐसा ब्राउज़र मिलता है जहां इनमें से कोई भी ईवेंट आग नहीं है, तो आप एक अतिरिक्त चाल का प्रयास कर सकते हैं। चूंकि चुनिंदा और टेक्स्टरेरा जैसे फॉर्म विजेट अक्सर ओएस द्वारा प्रस्तुत किए जाते हैं और ब्राउज़र के अंदर नहीं, यह संभव है कि आप उनके साथ बातचीत कर सकें और कुछ संदेश ब्राउज़र के ईवेंट हैंडलर पर नहीं पहुंच सकते हैं। यदि आप चयन बॉक्स खोलने पर कम जेड-इंडेक्स पर स्क्रीन को कवर करने वाले एक पारदर्शी टेक्स्टरेरा को स्थानांतरित करना चाहते थे, तो आप उस करीबी क्लिक को ट्रैक करने के लिए इसका उपयोग कर सकते हैं। यह ऐसी घटनाओं को कैप्चर करने में सक्षम हो सकता है जो ब्राउज़र DOM तत्व याद कर सकते हैं।

    अद्यतन: क्रोम चयन पर एक mousedown देखता है जब यह खुलता है और दस्तावेज़ जब पेज एक का चयन खुली के साथ क्लिक किया जाता है पर एक mouseup।

    http://jsfiddle.net/FpfnM/51/

    फिर से, आप हर एक में सही व्यवहार को संभालने के लिए कुछ ब्राउज़र पता लगाने करने की आवश्यकता होगी: यहाँ एक संस्करण है कि क्रोम के साथ काम करता है। विशेष रूप से क्रोम के साथ एक पकड़ यह है कि जब आप इसे बंद करने के लिए दूसरी बार चयन करते हैं तो कोई ईवेंट निकाल दिया नहीं जाता है। हालांकि, आप पेज क्लिक का पता लगा सकते हैं।

    त्वरित सारांश:

    Chrome/Safari: select.mousedown on open, document.mouseup on close 
    Firefox: select.click on open, document.mouseup on close 
    IE8/IE7: select.click on open, document.mouseup on close 
    

    वहाँ अन्य घटनाओं कि एक करीबी (भागने कुंजी दबाने आदि, धुंधला,) दर्शाता होगा के लिए बढ़त के मामलों की एक बहुत भयानक हैं, लेकिन इन न्यूनतम संभालने के लिए कर रहे हैं परिदृश्य जहां कोई उपयोगकर्ता चयन बॉक्स पर क्लिक करता है और फिर दस्तावेज़ क्षेत्र में क्लिक करता है।

    आशा है कि इससे मदद मिलती है!

    +0

    धन्यवाद। हां, क्रोम में मुझे केवल एक लॉग इवेंट मिलता है यदि चयन का विकल्प बदल दिया गया है। अगर मैं बस चयन खोलता हूं और फिर इसे "यहां" क्लिक करके बंद कर देता हूं तो मुझे कोई ईवेंट नहीं मिलता है। – Premasagar

    +0

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

    +0

    यह http://jsfiddle.net/xcadZ/ –

    1

    मुझे मिल गया पत्र के लिए अपने JSFiddle पर निर्देशों का पालन करके निम्न इवेंट:

    BODY, mousedown, STRONG 
    #document, mousedown, STRONG 
    window, mousedown, STRONG 
    SELECT, blur, SELECT 
    BODY, click, STRONG 
    #document, click, STRONG 
    window, click, STRONG 
    

    इन चुनिंदा मेनू पहले से ही फोकस और विस्तारित होने के बाद "यहां" क्लिक किए जाने पर सभी घटनाएं ट्रिगर हुईं। यह क्रोम के नवीनतम संस्करण में था।

    इनमें से कोई भी आपके उद्देश्यों के लिए पर्याप्त नहीं होना चाहिए?

    संपादित करें: यदि आप यह सुनिश्चित करना चाहते हैं कि यह आपका चयन तत्व है जो फोकस खो रहा है, तो वैश्विक जावास्क्रिप्ट चर सेट करें, 'selectFocused' सेट करें, और इसे गलत पर सेट करें। जब आपका चयन मेनू फोकस प्राप्त करता है, तो इसे सही पर सेट करें, और उपरोक्त में से कोई भी घटना होने पर इसे गलत पर सेट करें। 'selectFocused' अब आपके कोड में कहीं भी इस्तेमाल किया जा सकता है यह पता लगाने के लिए कि आपका चयन तत्व वर्तमान में फ़ोकस करता है या नहीं, और जब यह मान बदलता है, तो आप जानते हैं कि आपका चयन तत्व चुना गया है या अचयनित किया गया है।

    +0

    क्या आपने अभी "यहां" क्लिक किया था? या दो बार? नवीनतम क्रोम में,