2012-05-18 17 views
11

में मुझे फोकस ईवेंट के साथ थोड़ा सा समस्या मिली है जिसे मैं अभी जानता हूं। जाहिर है, किसी अन्य ब्राउज़र टैब पर स्विच करते समय आग लगाना और फिर वापस दोबारा। मैं ऐसा नहीं करना चाहता था; क्या यह संभव है?ब्राउज़र टैब बदलना अनिवार्य रूप से फोकस ईवेंट को सक्रिय करता है, खासकर Google क्रोम

मुझे आज तक इस बारे में कभी पता नहीं था। यह एक छोटा सा प्रदर्शन है: http://jsfiddle.net/MJ6qb/1/

var times = 0; 
$('input').on('focus', function() { 
    times ++; 
    $(this).after('<br>Focused '+times+' times'); 
}); 

पुन: पेश करने के लिए: इनपुट पर ध्यान दें, तो ब्राउज़र टैब स्विच, तो वापस स्विच। जब आप टैब पर वापस स्विच करते हैं, तो सभी ब्राउज़र फ़ोकस ईवेंट को आग लगते हैं, और Google क्रोम 1 इसे दो बार फायर कर रहा है!

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

यह jQuery से संबंधित प्रतीत नहीं होता है (मैंने वेनिला जावास्क्रिप्ट के साथ परीक्षण किया है) लेकिन मैं एक समाधान के लिए jQuery का उपयोग कर सकता हूं। क्या मैं इसके बारे में कुछ कर सकता हूं? मुझे पता है कि मैं jQuery के one() का उपयोग कर सकता हूं लेकिन मैं चाहता हूं कि फ़ंक्शन एक से अधिक बार चलें।

+1

थोड़ा असंबंधित प्रयास करें, लेकिन आप जब पता लगाने के लिए सक्षम हो सकता है ब्राउज़र टैब केंद्रित या धुंधला और ओवे है [इस] (http://stackoverflow.com/a/6184276/1028949) में डिफ़ॉल्ट व्यवहार को राइड करें। क्रोम डबल-फायर एक [ज्ञात बग] (http://code.google.com/p/chromium/issues/detail?id=124583) है, जो मैं बता सकता हूं। – Quantastical

+0

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

+1

आपके द्वारा अनुभव किए जा रहे व्यवहार की अपेक्षा की जाती है। जब आप टैब छोड़ते हैं, तो आप उस टेक्स्टबॉक्स पर फ़ोकस कर रहे हैं और जब आप वापस आते हैं तो आप इसे फिर से केंद्रित कर रहे हैं। एक और आवेदन छोड़ने के लिए भी यही है। दुर्भाग्य से, मैं ओवरराइड करने या इसके चारों ओर जाने का तरीका नहीं सोच सकता। – Quantastical

उत्तर

5

this

var times = 0; 
var prevActiveElement; 

    $(window).on("blur", function(e){ 
      prevActiveElement = document.activeElement; 
    }); 

    $('input').on('focus', function() { 
     if (document.activeElement === prevActiveElement) { 
      return; 
     } 
     prevActiveElement = document.activeElement; 
     times++; 
     $(this).after('<br>Focused ' + times + ' times'); 
    }).on("blur", function(){ 
     prevActiveElement = null; 
    });​ 
+0

ऐसा लगता है कि यह काम करता है! कामकाज के लिए धन्यवाद! जानकारी के उस टुकड़े के लिए 'सक्रिय एलीमेंट' के बारे में भी कभी नहीं पता था। –

+0

वैसे, यह कई इनपुट के साथ भी उत्पादन में पूरी तरह से काम कर रहा है: http://jsfiddle.net/MJ6qb/5/ (यदि आप उत्सुक हैं, तो अनुरोध देखने के लिए कंसोल खोलें)। –

+0

@WesleyMurch '$ (" body ")। (" धुंधला ") पर बिल्कुल ट्रिगर नहीं किया गया है। 'ब्लर' बबल नहीं करता है, आप शायद '$ ("बॉडी") चाहते हैं। ("फोकसआउट", "[डेटा-ऑटोकंपलेट]", एफएन) '। फोकस के बराबर '$ (" बॉडी ") है। (" फोकसिन "," [डेटा-ऑटोकंपलेट] ", एफएन)' – Esailija

3

समस्या को हल करने के लिए यह प्रयास करें:

var times = 0, foc=true; 

$(window).on('focus', function() { 
    foc = false; 
    setTimeout(function() {foc=true}, 200); 
}); 

$('input').on('focus', function() { 
    if (foc || times===0) { 
     times ++; 
     $(this).after('<br>Focused '+times+' times'); 
    } 
}); 

FIDDLE

+0

अभी तक, क्लिक पर आग नहीं लगती है जब तक कि आप पहले किसी अन्य विधि जैसे टीएबी (या पहले किसी अन्य इनपुट पर क्लिक करना) पर ध्यान केंद्रित न करें - अभी भी परीक्षण करें। लेकिन हाँ, दिलचस्प समाधान! –

+0

यह अजीब बात है, क्रोम में ठीक काम कर रहा है, फोकस इवेंट हर बार आग लगती है, लेकिन ब्राउजर टैब में बदलाव नहीं होती है। – adeneo

+0

यदि आप कुछ और करने से पहले इनपुट में क्लिक करते हैं तो यह काम नहीं करता है। @adeno क्या आपने कोशिश की? –

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