2008-10-06 12 views
12

पर केंद्रित है, मुझे एक लाइटबॉक्स टेक्स्टबॉक्स मिला है जो एक एएसपी.NET अपडेट पैनेल से AJAX कॉल का उपयोग करके प्रदर्शित होता है। जब लाइटबॉक्स प्रदर्शित होता है, तो मैं टेक्स्टबॉक्स पर ध्यान केंद्रित करने के लिए लाइटबॉक्स में मौजूद टेक्स्टबॉक्स की focus() विधि का उपयोग करता हूं।यह देखने के लिए जांच कर रहा है कि कोई DOM तत्व

फ़ायरफ़ॉक्स में, टेक्स्ट बॉक्स में कोई समस्या नहीं होती है। आईई में, पाठ बॉक्स जब तक कि मैं

setTimeout(function(){txtBx.focus()}, 500); 

का उपयोग थोड़ा बाद में फोकस विधि आग बनाने के लिए, के बाद डोम तत्व मैं यह सोचते हैं रहा हूँ लोड किया गया है फोकस हासिल नहीं करता है।

समस्या यह है कि, तुरंत उस रेखा से ऊपर है, मैं पहले से ही यह देखने के लिए जांच कर रहा हूं कि तत्व शून्य/अपरिभाषित है, इसलिए ऑब्जेक्ट पहले से मौजूद होना चाहिए यदि वह उस पंक्ति को हिट करता है, तो यह केवल फोकस हासिल करने की अनुमति नहीं देगा किसी कारण से तुरंत।

स्पष्ट रूप से इस समस्या को "ठीक करने" के लिए टाइमर सेट करना यह हल करने का सबसे अच्छा या सबसे शानदार तरीका नहीं है।

var txtBx = document.getElementById('txtBx'); 

if (txtPassword != null) { 
    txtPassword.focus(); 
    while (txtPassword.focus === false) { 
     txtPassword.focus(); 
    } 
} 

वहाँ किसी भी तरह से एक पाठ बॉक्स इतना ध्यान केंद्रित मैं ऊपर की तरह कुछ कर सकता है कि यह बताने के लिए है: मैं निम्नलिखित की तरह कुछ करने में सक्षम होना चाहते हैं?

या क्या मैं इसे गलत तरीके से देख रहा हूं?

संपादित
स्पष्ट करने के लिए, मैं पृष्ठ लोड पर कोड बुला नहीं कर रहा हूँ। पृष्ठ के शीर्ष पर है, हालांकि यह एक फ़ंक्शन के अंदर है जिसे एएसपी.नेट की असिंक्रोनस पोस्टबैक पूर्ण हो जाती है, जब पेज लोड नहीं होता है।

क्योंकि यह अजाक्स अद्यतन के बाद प्रदर्शित होता है, इसलिए डीओएम पहले ही लोड हो जाना चाहिए, इसलिए मुझे लगता है कि jQuery की $(document).ready() घटना यहां सहायक नहीं होगी।

+0

क्या विधि अगर आप 0 की देरी के साथ टाइमआउट() सेट करते हैं तो विधि काम करती है? – Aintaer

+0

क्या यह हो सकता है कि स्क्रिप्ट लाइटबॉक्स + टेक्स्टबॉक्स से पहले निष्पादित हो रही है? आप लाइटबॉक्स कैसे खोल रहे हैं? शायद कुछ कोड पोस्ट करें। –

+0

यह निश्चित रूप से संभव है, मुझे यकीन नहीं है कि इसके आसपास काम करने के लिए क्या करना है। –

उत्तर

1

जावास्क्रिप्ट डालने का प्रयास करें जो पृष्ठ के अंत में पृष्ठ के अंत में फोकस सेट करता है या पृष्ठ लोड होने के बाद इसे आग लगा देता है। यह सुनिश्चित करने में मदद करेगा कि ध्यान केंद्रित करने से पहले डीओएम पूरी तरह से लोड हो गया है।

मैंने इस के लिए FastInit का उपयोग किया है। JQuery $ (दस्तावेज़) .ready() भी काम करेगा।

1

आप इस तरह कुछ कोशिश कर सकते हैं [आईई विशिष्ट]। (Untested)

theAjaxCreatedElement.onreadystatechange = function() { 
    if (this.readyState != "complete") 
     return; 
    this.focus(); 
}; 

एक और तरीका है, onFocus साथ तत्व की पृष्ठभूमि का रंग बदलने तो अगर यह होता है यह क्या है, होना चाहिए नहीं तो js चेक के साथ इसे पुनः प्राप्त करने हो सकता है: तत्व फिर से फ़ोकस।

+0

मैंने कोशिश की। तैयारस्टेट पहले से ही "पूर्ण" है, जो वास्तव में मुझे खराब करता है। आईई का कहना है कि डीओएम तत्व तैयार है, लेकिन आप इसे "वास्तव में तैयार" होने तक विशिष्ट चीजें नहीं कर सकते हैं, मुझे लगता है कि इसका वर्णन करने का सबसे अच्छा तरीका है। –

1

आप इस कोशिश कर सकते हैं:

  1. PageRequestManager की endRequest घटना का प्रयोग करें। एक बार अजाक्स अपडेट समाप्त होने के बाद वह घटना आग लगती है।

    <script type="text/javascript"> 
        function onRequestEnd() 
        { 
        var txtBx = $get('txtBx'); 
        txtBx.focus(); 
        } 
        Sys.WebForms.PageRequestManager.getInstance().add_endRequest(onRequestEnd); 
    </script> 
    

    पाठ बॉक्स शुरू में ध्यान केंद्रित करने के लिए आप Application ग्राहक की load घटना के लिए pageLoad समारोह (शॉर्टकट का उपयोग कर सकते हैं:

  2. ईवेंट हैंडलर

यहाँ में पाठ बॉक्स फोकस कुछ नमूना कोड है -साइड ऑब्जेक्ट):

<script type="text/javascript"> 
function pageLoad() 
{ 
    var txtBx = $get('txtBx'); 
    txtBx.focus(); 
} 
</script> 
+0

वही है जो मैं अभी वास्तव में उपयोग कर रहा हूं। तत्व की फोकस() विधि onRequestEnd() विधि में बुलाई जा रही है। –

1

आईई में कई चीजें हैं, जो चाल है:

  1. तो ध्यान केंद्रित तत्व अलग z- सूचकांक है - आप जल्दी से वर्तमान में केंद्रित तत्व (संभवतः सेट करते समय 'छुपा' विशेषता), फ़ोकस सेट की है कि z- सूचकांक सेट कर सकते हैं, और फिर इसे वापस मूल z- करने के लिए सेट सूचकांक।

  2. वर्तमान में केंद्रित तत्व को धुंधला करने की कोशिश करें।

  3. यदि तत्व 'shimmed' है - 'shim' तत्व पर ध्यान केंद्रित करें।

+0

"shimmed" से आपका क्या मतलब है? –

+0

http://blogs.sun.com/venky/entry/ie_shim_technique – Thevs

1

ऐसा लगता है कि आईई स्क्रिप्ट समाप्त होने के बाद तक डोम अपडेट नहीं करता है। इस प्रकार, फोकस के लिए एक लूप परीक्षण डीओएम को अपडेट करने की अनुमति नहीं देगा। setTimeout का उपयोग करना शायद एकमात्र कामकाजी समाधान है।

.focus() के साथ आपका उदाहरण एक प्रसिद्ध उदाहरण है, उदाहरण के लिए देखें। this answer

1

क्या आपने autofocus="autofocus" विशेषता को टेक्स्टबॉक्स तत्व में जोड़ने का प्रयास किया है जिसे आप अजाक्स के माध्यम से बुला रहे हैं?

आम तौर पर, जब मुझे गतिशील सामग्री पर चलाने के लिए कुछ अतिरिक्त जावास्क्रिप्ट कार्यक्षमता की आवश्यकता होती है, तो मैं बस उस जावास्क्रिप्ट को सामग्री के रूप में भी जोड़ूंगा।

यह जावास्क्रिप्ट डीओएम में जोड़े जाने के बाद भी निष्पादित होगा। मुझे आपकी मूल फ़ाइल में जावास्क्रिप्ट लिखने और फिर डीओएम में बदलावों के लिए "सुनना" में एक बिंदु नहीं दिख रहा है। जैसा कि आपने बताया है, सेटटाइमआउट() इस तरह की किसी चीज़ के लिए किसी और चीज़ की तुलना में एक हैक से अधिक है :)

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