2009-08-25 16 views
15

में काम नहीं कर रहा है मैं jQuery का उपयोग कर वेबपैप विकसित कर रहा हूं। मेरे पास कार्यक्षमता है जो 3 इनपुट फ़ील्ड की नई पंक्ति जोड़ती है। इन डोम तत्वों को बनाने के बाद मैं इनपुट फ़ील्ड में से एक को ध्यान केंद्रित करना चाहता हूं। मैं जरूरी इनपुट फ़ील्ड पर jQuery फोकस() फ़ंक्शन को कॉल करने के साथ कर रहा हूं।jQuery फोकस() कभी-कभी आईई 8

समस्या यह है कि कॉलिंग फोकस() आईई 6 और एफएफ 3.5 में ठीक काम करता है, लेकिन आईई 8 में काम नहीं कर रहा है।

मैं इसे दिखाने के लिए इस समस्या का सरल काम करने का उदाहरण बनाने की कोशिश कर रहा था, लेकिन कोड फोकस() के पट्टी संस्करण के साथ ठीक काम कर रहा है। तो मेरा अनुमान था कि आईओ 8 में फोकस() को कॉल करते समय डीओएम तैयार नहीं है। इसके लिए मैंने सेटटाइमआउट ('मायफोकस()', 400) को कॉल करने का प्रयास किया। मुझे सफलता मिली और कुछ मामलों में फोकस वास्तव में काम कर रहा था लेकिन अभी भी हमेशा नहीं। यादृच्छिक रूप से यह मेरे इनपुट फ़ील्ड पर ध्यान केंद्रित नहीं करता है।

प्रश्न है: क्या किसी को भी इसी तरह की समस्याओं का सामना करना पड़ा है और क्या किसी को यह पता है कि इसे कैसे कामयाब किया जाए? सेटटाइमआउट का उपयोग करना बहुत बदसूरत कामकाज की तरह लगता है।

अग्रिम

में Tnx संपादित: 26.08.2009

सरल उदाहरण पर पुन: पेश करने सफल। यहां HTML + JS कोड है जो IE8 पर इस बग को पुन: उत्पन्न करता है।

<html> 
<head> 
    <script type="text/javascript" src="js/jquery-1.3.2.min.js"></script> 
    <script type="text/javascript"> 
     function performChanged() { 
      formChanged = true; 
     } 

     function handleChange() { 
      var parentDiv = $('#container'); 
      newValue = $(html).html(); 

      parentDiv.html(newValue); 
      $(".sel1",parentDiv).bind('change',handleChange); 
      //alert('Uncomment this and after alert focus will be on input'); 
      $("input.cv_values",parentDiv).focus(); 
     } 

     $(document).ready(function() { 
      $('.trackChange').bind('change', handleChange); 
     }); 
     var html = '<div class=\"div1\">\n<select class=\"sel1\" id=\"sel1\" name=\"sel1\"><option value=\"\"><\/option>\n<option value=\"11\">Select me to see problem<\/option>\n<\/select>\n\n\n<input class=\"cv_values\" id=\"sel3\" name=\"sel3\" size=\"30\" type=\"text\" value=\"\" /><br/>Focus should in input field. With alert it is but without alert focus is not there</div>'; 
    </script> 
</head> 
<body> 
    <select class="trackChange" onchange='performChanged();'> 
     <option value=""></option> 
     <option value="1" >Select me to generate new inputs</option> 
    </select> 

    <div id="container"></div> 
</body> 

पुन: पेश करने के लिए: 1) पहले ड्रॉप-डाउन से चयन मूल्य। आप देखेंगे कि पहली बार इनपुट 2 काम कर रहा है 2) दूसरे ड्रॉपडाउन से मूल्य का चयन करें। आप देखेंगे कि बग पुन: उत्पन्न होता है।

फिर कोड में आप लाइन को टिप्पणी कर सकते हैं जहां यह जेएस अलर्ट() दिखाता है। अजीब बात यह है कि अगर यह चेतावनी है() तो फोकस करने के बाद ठीक काम कर रहा है।

उम्मीद है कि यह समझने में सहायता करता है कि मेरी समस्या कहां है।

पीएस मुझे इस तरह से काम करने के लिए मेरे ऐप की आवश्यकता है - यह ड्रॉपडाउन से मूल्य चुनने के बाद उन इनपुट को पुन: उत्पन्न कर रहा है। यह मेरे ऐप का सरलीकृत उदाहरण है;)।

+1

कोड स्निपेट पोस्ट करें। चीजों को आसान बनाता है। – krishna

+0

क्या आपने विंडो के "लोड" ईवेंट पर ध्यान केंद्रित करने की कोशिश की है ("DOMContentLoaded" पर नहीं, a.k.a. - 'document.ready (...)' - एक)? – kangax

उत्तर

6

अजीब मैं एक ही समस्या थी और इतने की तरह सादे पुराने जावास्क्रिप्ट का उपयोग कर इसका समाधान नहीं:

document.getElementById('friend_name').focus();

का उपयोग jQuery बराबर $('#friend_name').focus(); IE8 में काम नहीं किया: -/

+3

यह ऐसा कुछ है जिसे आप jQuery नींव को रिपोर्ट करना चाहते हैं। – Fresheyeball

1

के बाद से आप किसी भी कोड पोस्ट नहीं किया है आप उपयोग कर रहे: के बाद एचटीएमएल भरी हुई है

$(document).ready(function(){ 
    //code here 
}); 

यह जावास्क्रिप्ट रन कर देगा।

और आपको live events का भी उपयोग करना चाहिए। जब डोम में आपके जोड़ने के इनपुट स्वचालित रूप से उनके लिए बाध्य होगा।

$("p").live("focus", function(){ 
    alert($(this).text()); 
}); 

इसका मतलब है कि बनाए गए हर पी पर इसका ध्यान केंद्रित होगा।

+0

मैं कुछ इनपुट पर ध्यान केंद्रित करना चाहता हूं लेकिन मुझे उस फोकस ईवेंट से अवगत होने की आवश्यकता नहीं है। पीएस jQuery वर्तमान स्थिर संस्करण "फोकस" घटना के लिए लाइव का समर्थन नहीं करता है। – oskarae

30

मुझे अपने ऐप के साथ एक ही समस्या थी, लेकिन मैं आपके कोड के साथ फोकस समस्या को पुन: उत्पन्न नहीं कर सकता। मेरी समस्या थोड़ा अलग थी कि मेरे पृष्ठ में एक लिंक हैश था जिसने आईई को अपना तत्व फोकस नहीं दिया था।

setTimeout(function() { 
    $('.my-thing').focus(); 
}, 100); 

ध्यान देने योग्य नहीं एक उपयोगकर्ता द्वारा लेकिन यह आईई एक पल साँस लेने के लिए देता है:

वैसे भी, समस्या को हल पाने के लिए मैं एक समय समाप्ति गयी।

+0

क्या आप जानते हैं कि यह समाधान क्यों काम करता है? (ओह, धन्यवाद। यह निश्चित रूप से काम करता है।) – jjnguy

+0

मुझे काफी दिलचस्पी है कि यह क्यों काम करता है। – kukudas

+1

कुछ [प्राचीन दस्तावेज] से (http://javascript.gakaa.com/div-focus-4-0-5-.aspx): टेक्स्ट बॉक्स फोकस देने और बॉक्स में सभी टेक्स्ट को पूर्व-चयन करने के लिए, उपयोग करें फोकस() का अनुक्रम और तत्व पर चयन() विधियों। यदि यह अनुक्रम विंडोज़ परिवर्तन के बाद होता है (जैसे एक चेतावनी संवाद बॉक्स बंद होने के बाद), विधियों को एक अलग फ़ंक्शन में रखें, और इस फ़ंक्शन को बातचीत के लिए अलर्ट() विधि के बाद setTimeout() विधि के माध्यम से आमंत्रित करें। यह IE/Windows अनुक्रम कथन निष्पादन को सही तरीके से अनुक्रमित करने की अनुमति देता है। – davidchambers

4

आईई 8 के साथ समान समस्या थी। जब मैं खोला जाता हूं तो मैं संवाद में इनपुट पर ध्यान केंद्रित करना चाहता था। प्रयुक्त autoOpen = झूठी। ध्यान दिया गया है कि फोकस केवल संवाद में पहले फोकस करने योग्य तत्व के लिए काम नहीं करता है। सेटटाइमआउट का प्रयास किया लेकिन यह कभी-कभी काम करता था। ध्यान केंद्रित करने से पहले धुंधला तत्व मेरी मदद की।

$('#dialog').find('#name').blur(); 
$('#dialog').find('#name').focus(); 
+0

धन्यवाद! यह वही है जब देरी की सहायता नहीं होती है। – Episodex

1

यह फोकस सेट करने के पल के लिए सबसे अच्छा समाधान है:

$ ('elt')। f adeIn (200, फ़ंक्शन() {$ ('elt')। फोकस();});

$("elem").blur(); 
$("elem").focus().focus(); 

मुझे पता नहीं क्यों है, लेकिन किसी भी तरह बुला फोकस दो बार आईई साथ मदद करता है:

8

Kazys समाधान के साथ संयोजन के रूप में, मैं यह मेरी सभी समस्याओं (IE8 & .hta फ़ाइलों का उपयोग कर) ठीक करने के लिए मिला ।

संपादित करें: मुझे यह पता चला है कि .show() और .select() भी मदद कर सकते हैं।

+0

'$ (" आईडी ")। फोकस()। फोकस(); 'मेरे लिए काम करता है, क्या इसका उपयोग करके कोई नकारात्मकता है? @ मैक्स माहेम – bumbumpaw

+0

कुछ भी नहीं जो मुझे अभी तक पता है। –

+0

आईई 11 में भी मेरे लिए इसे फिक्स्ड!धन्यवाद :) – Krenor

0

यह एक पुराना सवाल है, लेकिन यह खोज में शीर्ष है, इसलिए अपडेट करना चाहता था।

मुझे नहीं पता कि यह कितना समय तय किया गया था, लेकिन मैं आज jquery-2.1.3 का उपयोग कर आईई 11 में इस मुद्दे में भाग गया। मैंने पाया कि उपरोक्त पोंनी द्वारा निर्धारित सेटटाइमआउट में फ़ोकस कॉल को लपेटकर, मेरे लिए सबसे अच्छा काम किया।

मुझे इसे काम करने के लिए कुछ मामलों में टाइमआउट बढ़ाने की आवश्यकता थी।