2010-08-01 8 views
32

मुझे this question में उपयोगकर्ता के समान समस्या है, जो वेबकिट में this bug के कारण है। हालांकि, प्रदान किया गया कामकाज मेरे ऐप के लिए काम नहीं करेगा। मुझे समस्या दोबारा बताएं ताकि आपको एक और प्रश्न पढ़ना पड़े:क्रोम पर बेहतर कामकाज की तलाश फोकस बग पर चयन करें

मैं फोकस होने पर टेक्स्टरेरा में सभी टेक्स्ट चुनने की कोशिश कर रहा हूं। निम्नलिखित jQuery कोड आईई/एफएफ/ओपेरा में काम करता है:

$('#out').focus(function(){ 
    $('#out').select(); 
}); 

हालांकि, क्रोम/सफारी में पाठ का चयन किया गया - बहुत संक्षेप में - लेकिन फिर mouseUp घटना निकाल दिया जाता है और पाठ चयनित नहीं है। निम्नलिखित तरीके को ऊपर दिए गए लिंक में की पेशकश की है:

$('#out').mouseup(function(e){ 
    e.preventDefault(); 
}); 

हालांकि, इस समाधान का कोई मुझे लिए अच्छा है। जब मैं टेक्स्टटेरा फोकस देता हूं तो मैं सभी पाठ केवल चुनना चाहता हूं। वह होना चाहिए, तो यदि वह चुनता है तो पाठ का केवल एक हिस्सा चुनने में सक्षम हो। क्या कोई ऐसे कामकाज के बारे में सोच सकता है जो अभी भी इस आवश्यकता को पूरा करता है?

+5

समस्या का सबसे सामान्य रूप से सुझाव दिया समाधान में स्पष्ट स्पष्ट दोष खोलना के लिए एक बड़ा +1। – SDC

उत्तर

29

इस बारे में कैसे?

$('#out').focus(function() { 
    $('#out').select().mouseup(function (e) { 
     e.preventDefault(); 
     $(this).unbind("mouseup"); 
    }); 
}); 
+0

धन्यवाद, मुझे यह और भी पसंद है - एक अलग ध्वज की आवश्यकता नहीं है! – Jenni

+9

शायद '.one()' यहां एक बेहतर तरीका है। – ValeriiVasin

+0

+1। मुझे नहीं लगता कि इतने सारे लोग क्यों सोचते हैं कि मूल 'रोकथाम() 'फिक्स पर्याप्त है। इसमें स्पष्ट रूप से गंभीर त्रुटियां हैं, और फिर भी इसे हर जगह समाधान के रूप में सुझाव दिया जा रहा है। इसे हल करने के लिए धन्यवाद। (हालांकि हाँ, मैं @InviS से सहमत हूं कि '.one()' ऐसा करने का एक बेहतर तरीका हो सकता है) – SDC

2

bool बनाएं। फ़ोकस ईवेंट के बाद इसे true पर सेट करें और माउस अप ईवेंट के बाद इसे रीसेट करें। माउस के दौरान, यदि यह true है, तो आप जानते हैं कि उपयोगकर्ता ने केवल टेक्स्ट फ़ील्ड चुना है; इसलिए आप जानते हैं कि आपको माउस को होने से रोकना चाहिए। अन्यथा, आपको इसे पारित करना होगा।

var textFieldGotFocus = false; 

$('#out').focus(function() 
{ 
    $('#out').select(); 
    textFieldGotFocus = true; 
}); 

$('#out').mouseup(function(e) 
{ 
    if (textFieldGotFocus) 
     e.preventDefault(); 
}); 

$(document).mouseup(function() { textFieldGotFocus = false; }); 

यह है कि आप, क्योंकि यह गारंटी नहीं है कि उपयोगकर्ता पाठ क्षेत्र पर माउस बटन जारी करेंगे mouseup श्रोता कि document पर चर रीसेट करता है डाल महत्वपूर्ण है।

+0

धन्यवाद! इसने एक आसान विचार भी प्रेरित किया: document.mouseup पर श्रोता के बजाय, ध्वज को झूठ पर सेट करें। mouseup: 'if (textFieldGotFocus) {e.preventDefault(); textFieldGotFocus = false;} ' – Jenni

+0

गोश संख्या। वैश्विक युद्ध + घटना हैंडलिंग == परेशानी के लिए नुस्खा। – SDC

23

स्वीकार्य उत्तर (और मूल रूप से अब तक पाया गया हर दूसरे समाधान) कुंजीपटल फोकस के साथ काम नहीं करता है, i। ई। मेरे क्रोमियम में टैब दबाकर, कम से कम नहीं 21. मैं उपयोग के बजाय निम्नलिखित स्निपेट:

$('#out').focus(function() { 
    $(this).select().one('mouseup', function (e) { 
    $(this).off('keyup'); 
    e.preventDefault(); 
    }).one('keyup', function() { 
    $(this).select().off('mouseup'); 
    }); 
}); 

keyup या focus हैंडलर में e.preventDefault() मदद नहीं करता है, तो एक कीबोर्ड के बाद अचयनित उनके डिफ़ॉल्ट में ऐसा नहीं लगता है हैंडलर, बल्कि focus और keyup घटनाओं के बीच कहीं कहीं।

जैसा कि @ बेयरलीफित्ज़ द्वारा सुझाया गया है, अन्य घटना संचालकों को गलती से अनदेखा न करने के लिए नामांकित घटनाओं के साथ काम करना बेहतर हो सकता है। 'keyup''keyup.selectText' और 'mouseup' के साथ 'mouseup.selectText' के साथ बदलें।

+1

+1 कीबोर्ड समर्थन FTW – rowanu

+4

जब आप ईवेंट को अनबाइंड करते हैं, तो आप अनजाने में इनपुट पर होने वाले अन्य हैंडलर को अनबाइंड कर सकते हैं। इसे रोकने के लिए आप "माउसअप" के बजाय "mouseup.selectText" जैसे नामस्थान का उपयोग कर सकते हैं, फिर केवल आपके एकल ईवेंट हैंडलर को हटा दिया जाएगा। – BarelyFitz

+0

नामस्थान संकेत के साथ संयुक्त यह सबसे अच्छा समाधान है जिसे मैंने अभी तक इस चिपचिपा विकेट के लिए पाया है और मैं इसे घर की सराहना करता हूं। – dartacus

1
onclick="var self = this;setTimeout(function() {self.select();}, 0);" 
+0

यह उत्तर प्रेरित: '$ (" # एक ")। ('फोकस', शून्य, फ़ंक्शन() {var $ that = $ (this); setTimeout (function() {$ that.select();} , 0);}); ' –

0

digitalfresh के समाधान ज्यादातर वहाँ है, लेकिन() यदि आप मैन्युअल .focus को गति प्रदान कि में एक बग है जे एस का उपयोग कर (ताकि एक क्लिक का उपयोग नहीं), या आप क्षेत्र के लिए टैब है, तो आप एक अवांछित मिलता है माउसअप इवेंट बाध्य - इससे पहला क्लिक होता है जिसे टेक्स्ट को अनदेखा करने के लिए अचयनित करना चाहिए।

हल करने के लिए:

var out = $('#out'); 
var mouseCurrentlyDown = false; 

out.focus(function() { 
    out.select(); 

    if (mouseCurrentlyDown) { 
    out.one('mouseup', function (e) { 
     e.preventDefault(); 
    }); 
    } 
}).mousedown(function() { 
    mouseCurrentlyDown = true; 
}); 

$('body').mouseup(function() { 
    mouseCurrentlyDown = false; 
}); 

नोट: mouseup घटना शरीर और इनपुट नहीं पर होना चाहिए हम, इनपुट के अंतर्गत mousedown-इंग इनपुट से बाहर माउस को ले उपयोगकर्ता के लिए खाते में करना चाहते हैं के रूप में, और फिर माउसअप-आईएनजी।

3

क्यों बस नहीं:

$('#out').focus(function(){ 
    $(this).one('mouseup', function() { 
     $(this).select(); 
    }); 
}); 

सभी प्रमुख ब्राउज़रों में काम करने के लिए लगता है ...

+2

यह मेरे लिए काम किया। यह ध्यान देने योग्य है कि जब आप कोड के माध्यम से इनपुट पर ध्यान केंद्रित करते हैं तो यह काम नहीं करता है। इसके आस-पास पहुंचने के लिए, मैं '$ ('# element') का उपयोग करता हूं। ($। '(' # Element ') के बजाय फोकस()। फोकस()'। –

2

इनपुट बॉक्स पर ध्यान केंद्रित डालने से पहले पाठ का चयन करें।

$('#out').select().focus(); 
2

माउस अनुक्रम से फोकस ईवेंट को अलग करने के लिए एक बहुत ही अलग दृष्टिकोण होगा। यह वास्तव में मेरे लिए अच्छी तरह से काम करता है - कोई राज्य चर नहीं, कोई लीक हैंडलर नहीं, हैंडलर का अनजान निष्कासन नहीं है, और यह क्लिक, टैब या प्रोग्रामेटिक फोकस के साथ काम करता है। संहिता और नीचे jsFiddle -

$('#out').focus(function() { 
    $(this).select(); 
}); 
$('#out').on('mousedown.selectOnFocus', function() { 
    if (!($(this).is(':focus'))) { 
     $(this).focus(); 
     $(this).one('mouseup.selectOnFocus', function(up) { 
      up.preventDefault(); 
     }); 
    } 
}); 

https://jsfiddle.net/tpankake/eob9eb26/27/

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