onClick ईवेंट में जावास्क्रिप्ट फोकस बदल रहे हैं?

वोट
6

ध्यान दें: एक संभव समाधान केवल फ़ायरफ़ॉक्स 3.0 में काम की जरूरत है, मेरे ऐप IE से उपयोग की अनुमति नहीं है! =)

मैं एक कड़ी है, जिसे क्लिक, उपयोगकर्ता के लिए एक लाइटबॉक्स प्रदर्शित करेगा है:

<a href=# onclick=show_lightbox();return false;>show lightbox</a>

मेरी समस्या जब लाइटबॉक्स प्रदर्शित किया जाता है, ध्यान लिंक पर रहता है। तो उपयोगकर्ता को ऊपर या नीचे कुंजी प्रेस अगर, वे स्क्रॉल मुख्य दस्तावेज़, नहीं लाइटबॉक्स कि प्रदर्शित किया जाता है अंत!

मैं इस तरह कोड का उपयोग कर लाइटबॉक्स तत्व को फ़ोकस सेट करने की कोशिश की है

function focus_on_lightbox() {
  document.getElementById('lightbox_content').focus(); 
} 

यह ठीक काम करता है अगर मैं फ़ायरबग कंसोल इसमें लिखें, लेकिन अगर मैं onclick टुकड़ा के अंत में इसे शामिल काम नहीं करेगा। ऐसा लगता है कि मैं ऑनक्लिक ईवेंट के अंदर निष्पादित कोड से लिंक से दूर फोकस बदल नहीं सकते?


- अद्यतन 1 मैं पहले कुछ इस तरह की कोशिश की है

<a href=# onclick=show_lightbox();focus_on_lightbox();return false;>show lightbox</a>

और मैं कुछ डिबगिंग आउटपुट को जोड़ने के लिए समारोह संशोधन किया है, इस प्रकार है

function focus_on_lightbox() {
  console.log('hihi');
  console.log(document.activeElement);
  document.getElementById('lightbox_content').focus(); 
  console.log(document.activeElement);
}

उत्पादन इस प्रकार है

hihi
<a onclick=closePopup();lightbox('apartment_detail','11619');focus_on_lightbox();return false; href=#>
<a onclick=closePopup();lightbox('apartment_detail','11619');focus_on_lightbox();return false; href=#>

तो फोकस इससे पहले कि मैं कुछ भी किया था लिंक पर था और बाद मैं फोकस बदलने की कोशिश की यह अभी भी लिंक पर बने रहे?

सुनिश्चित नहीं हैं कि यह मायने रखता है, लेकिन मैं ajax का उपयोग लाइटबॉक्स लोड करने के लिए, इस प्रकार अगर

  new Ajax.Updater(lightbox_content_id, url, {asynchronous:true, evalScripts:true, onLoading:show_lightbox_loading(), onComplete:focus_on_lightbox() }); 

मैं ajax पूरा करने के बाद फ़ोकस सेट करने की कोशिश की, लेकिन यह भी, कोई भाग्य।

मैं क्या खो रहा हूँ?


मैं एक समाधान काम है कि,, ध्यान सेट करने का प्रयास करता है, तो मैं document.activeElement की जाँच करके सफल देखकर नहीं तो द्वारा नीचे सुझाव दिया गया था बनाने के लिए, 100 मिलीसेकंड प्रतीक्षा करके पुनः प्रयास करने की कोशिश कर रहा हूँ। अगर मैं निम्नलिखित समारोह का उपयोग करें, यह काम करेंगे

function focus_on_lightbox() {
  var seconds_waited = 0
  pause(100);
  var current_focus = document.activeElement
  while (document.getElementById(lightbox_content_id) != current_focus && seconds_waited < 2000)
  {
    document.getElementById(lightbox_content_id).focus(); 
    console.log(document.activeElement);
    pause(100);
    current_focus = document.activeElement
    seconds_waited += 100;
  }
}

हालांकि, अगर मैं फ़ायरबग डिबगिंग बयान console.log निकालने के लिए, समारोह काम करना बंद !! मुझे पता नहीं क्यों यह मामला होगा है ?? क्यों प्रभावित फ़ायरबग कंसोल के लिए एक चर outputting होगा मौसम फोकस तत्व के लिए नहीं ले जाया गया या है? console.log बयान ध्यान केंद्रित प्रभावित करता है? शायद सांत्वना डिबगिंग विंडो को फोकस लाकर?

22/05/2009 को 04:52
का स्रोत उपयोगकर्ता
अन्य भाषाओं में...                            


4 जवाब

वोट
4

मुझे लगता है कि तुम्हारी समस्या वापसी झूठी बाद आपका ध्यान विधि बुला रहा है। अपने कोड की तरह होना चाहिए:

<a href="#" 
    onclick="show_lightbox();focus_on_lightbox();return false;">
    show lightbox
</a>
22/05/2009 को 04:56
का स्रोत उपयोगकर्ता

वोट
1

मेरे अनुभव में, ध्यान केंद्रित मुद्दों कभी कभी समय से संबंधित हो सकता है (उदाहरण के लिए, ध्यान () कार्यान्वित तत्व से पहले पूरी तरह से ध्यान केंद्रित करने के लिए तैयार है)। मैं यह सोचते हैं रहा है कि लाइटबॉक्स मार्कअप डायनामिक रूप से तैयार किया जाता है जब show_lightbox समारोह कहा जाता है? अगर ऐसी बात है तो आप कि इससे समस्या, जैसे कुछ है देखने के लिए ध्यान केंद्रित करने के प्रयास करने से पहले कुछ देरी जोड़ने की कोशिश कर सकते हैं:

setTimeout("focus_on_lightbox();", 10);
22/05/2009 को 05:26
का स्रोत उपयोगकर्ता

वोट
0

तत्व में ही ध्यान केंद्रित करें। तत्व लोड घटना पर, कुछ एमएस के एक समय समाप्ति सेट करें और फिर this.focus फोन ();

वरना jQuery का प्रयास करें।

22/05/2009 को 06:26
का स्रोत उपयोगकर्ता

वोट
3

यहाँ समारोह है कि अंत में काम किया है

function focus_on_lightbox(seconds) {
  var seconds_waited
  seconds_waited = seconds
  document.getElementById(lightbox_content_id).focus(); 
  seconds_waited += 100;

  if (document.getElementById(lightbox_content_id) != document.activeElement && seconds_waited < 2000)
    setTimeout("focus_on_lightbox(" + seconds_waited + ");", 100);
  {
  }
}

तो क्यों console.log फोकस की स्थापना को प्रभावित किया? फोकस बदलने का प्रयास के बीच थामने की इससे पहले कि मैं इस समारोह का उपयोग कर रहा था।

function pause(milliseconds) {
    var dt = new Date();
    while ((new Date()) - dt <= milliseconds) { /* Do nothing */ }
}

इस कारण जावास्क्रिप्ट लगातार कुछ कर रही किया जाना है और मुझे लगता है कि यह दस्तावेज समय या अद्यतन या कुछ और रेंडर करने के लिए दे रही है नहीं कर रहा था। console.log इस लॉक को तोड़ कर पेज अपना ध्यान केंद्रित बदलने के लिए एक मौका देने के लिए लग रहा था।

जब मैं समय समाप्ति का उपयोग कर के दृष्टिकोण बदल प्रयास के बीच रोकने के लिए, console.log अब जरूरत थी!

धन्यवाद मुझे सही दिशा में इशारा करते हुए के लिए bmoeskau।

22/05/2009 को 06:53
का स्रोत उपयोगकर्ता

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more