2013-10-31 3 views
9

सवाल पर व्याख्या करने के लिए:बचें तत्व कलंक हैंडलर जब लागू खिड़की कलंक (ब्राउज़र ध्यान केंद्रित खो देता है)

मैं एक तत्व जो जब क्लिक एक उप-तत्व प्राप्त करता है मिल गया है। उस उप-तत्व को धुंध हैंडलर दिया जाता है।

ब्राउज़र के फोकस (खिड़की धुंध पर) खोने पर उस हैंडलर को नहीं बुलाया जाना चाहिए।

उस लक्ष्य को मैं कई टैक्स का प्रयास किया है की ओर

, इस जा रहा है मेरे वर्तमान प्रयास:

function clicked() { 
    // generate a child element 
    ... 
    field = $(this).children(":first"); 
    $(window).blur(function() { 
     field.unbind("blur"); 
    }); 
    $(window).focus(function() { 
     field.focus(); 
     field.blur(function() { 
      save(this); 
     }); 
    }); 
    field.blur(function() { 
     save(this); 
    }); 
} 

यह काम नहीं करता। ऐसा प्रतीत होता है कि जब ब्राउज़र फोकस खो देता है, तो फ़ील्ड पहले फोकस खो रहा है।

+1

http://jsfiddle.net/3sdDr/ – adeneo

उत्तर

13

अच्छा सवाल!

यह संभव है, और काफी सरल है।

field.blur(function() { 
    if(document.activeElement !== this) { 
     // this is a blur that isn't a window blur 
    } 
}); 

JSFiddle

या वेनिला जे एस में:

field.addEventListener('blur', function() { 
    if(document.activeElement !== this) { 
     // this is a blur that isn't a window blur 
    } 
}); 

संपादित करें: हालांकि ब्राउज़र साथ अपने जवाब सौदों फोकस खोने, जानते हैं कि फ़ायरफ़ॉक्स unusal व्यवहार है जब लौटने (बग?) ध्यान केंद्रित करने के लिए। यदि आपके पास इनपुट केंद्रित है, और फिर विंडो को फ़ोकस करें, तो तत्व का धुंध ट्रिगर होता है (जो सवाल था)। यदि आप इनपुट के अलावा किसी अन्य चीज़ पर वापस आते हैं, तो धुंधला ईवेंट दूसरा समय निकाल दिया जाता है।

+1

आह, मुझे सक्रिय एलीमेंट के बारे में पता नहीं था। खुशी है कि यह सीधा है। मुझे विश्वास है कि यह काम करता है क्योंकि सक्रिय एलिमेंट वर्तमान में केंद्रित तत्व है, इसलिए जब धुंध होता है और फ़ील्ड अभी भी केंद्रित है, तो हमने कहीं और ध्यान केंद्रित नहीं किया है। इस प्रकार हम धुंध हैंडलर को कॉल करने से बच सकते हैं। धन्यवाद! –

+0

सही, @ माइकल। –

0

ऐसा करने का एक हल्का गंदा तरीका कार्रवाई करने से पहले setTimeout() का उपयोग करना हो सकता है।

var windowFocus; 

$(window).focus(function() { 
    windowFocus = true; 
}); 

$(window).blur(function() { 
    windowFocus = false; 
}); 

function clicked() { 
    // generate a child element 
    ... 

    field = $(this).children(":first"); 

    field.blur(function() { 
     setTimeout(function() { 
      if (windowFocus) { 
       save(this); 
      } 
     }, 50); 
    }); 
} 
संबंधित मुद्दे