टेक्स्ट इनपुट तत्व में टेक्स्ट के अंत में कर्सर रखने के लिए जावास्क्रिप्ट का उपयोग करें


308

जावास्क्रिप्ट के माध्यम से इनपुट पाठ तत्व में पाठ के अंत में कर्सर रखने के लिए सबसे अच्छा तरीका क्या है (और मैं सबसे सरल तरीका मानता हूं) - तत्व पर ध्यान केंद्रित करने के बाद?

जवाबों:


170

मैं IE में इसी मुद्दे (RJS / प्रोटोटाइप के माध्यम से ध्यान केंद्रित करने के बाद) का सामना किया। फ़ायरफ़ॉक्स पहले से ही कर्सर छोड़ रहा था जब क्षेत्र के लिए पहले से ही एक मूल्य है। IE पाठ की शुरुआत में कर्सर को मजबूर कर रहा था।

समाधान मैं इस प्रकार है:

<input id="search" type="text" value="mycurrtext" size="30" 
       onfocus="this.value = this.value;" name="search"/>

यह IE7 और FF3 दोनों में काम करता है


3
यह textarea के लिए क्या होगा?
तारेक

19
अब क्रोम में काम करता है (9.0.597.98)
मैट

6
यह अब IE9 में काम नहीं करता है - कर्सर क्षेत्र की शुरुआत में कूदता है।
टाउन

6
इसके अलावा एफएफ 8. में काम नहीं करता है। चेनोसॉरस से समाधान हालांकि काम करने लगता है।
सिमोन

3
मेरे लिए Chrome में 24.0.1312.57, IE 9.0.8112, लेकिन फ़ायरफ़ॉक्स 18.0.2 नहीं
क्रिस - हैडॉक्स टेक्नॉलॉजी

190

अधिकांश ब्राउज़रों में इसे काम करने का एक सरल तरीका है।

this.selectionStart = this.selectionEnd = this.value.length;

हालाँकि, कुछ ब्राउज़रों के * quirks के कारण, अधिक समावेशी उत्तर इस तरह दिखता है

setTimeout(function(){ that.selectionStart = that.selectionEnd = 10000; }, 0);

JQuery का उपयोग करना (श्रोता को सेट करने के लिए, लेकिन यह अन्यथा आवश्यक नहीं है)

वेनिला जेएस का उपयोग करना ( इस उत्तरaddEvent से ऋण लेना )


क्वर्क्स

क्रोम में एक अजीब क्विक होता है, जहां फ़ोकस इवेंट कर्सर को फ़ील्ड में ले जाने से पहले आग लगाता है; जो मेरे सरल समाधान शिकंजा। इसे ठीक करने के लिए दो विकल्प:

  1. आप 0 एमएस का टाइमआउट जोड़ सकते हैं ( जब तक स्टैक स्पष्ट नहीं हो जाता है तब तक ऑपरेशन को स्थगित करें )
  2. आप से घटना को बदल सकते हैं focusकरने के लिए mouseup। यह तब तक उपयोगकर्ता के लिए बहुत कष्टप्रद होगा जब तक आप अभी तक ध्यान का ध्यान नहीं रखते। मैं वास्तव में इन विकल्पों में से किसी के साथ प्यार में नहीं हूं।

इसके अलावा, @vladkras ने बताया कि ओपेरा के कुछ पुराने संस्करणों ने गलत तरीके से लंबाई की गणना की है जब इसमें रिक्त स्थान हैं। इसके लिए आप एक बड़ी संख्या का उपयोग कर सकते हैं जो आपकी स्ट्रिंग से बड़ी होनी चाहिए।


2
मेरे लिए क्रोम में 24.0.1312.57, IE 9.0.8112 और फ़ायरफ़ॉक्स 18.0.2
क्रिस - हैडॉक्स टेक्नॉलॉजी

4
यह एक अवलोकन (कीचड़) के बजाय एक अच्छा समाधान है, कम कोड है, और अधिक समझ में आता है फिर यहां चर्चा की गई विकल्प। धन्यवाद।
डेरेक लित्ज़

मैं ऐसा केवल पहले फ़ोकस इवेंट के लिए करना चाहूंगा, और इसे तुरंत कॉल करूंगा। अन्यथा, हर बार जब आप फ़ील्ड में क्लिक करते हैं, तो कर्सर को अंत तक ले जाया जाएगा।
डेमियन

this.selectionStart = this.selectionEnd = 0; यह इनपुट बॉक्स के पहले अक्षर से पहले ध्यान केंद्रित करना चाहिए। लेकिन जब मैंने डिबग किया, तो यह सिलेक्शन और सिलेक्शन के मूल्य को भी नहीं बदल रहा है! और इसे भी पहले किरदार की ओर नहीं बढ़ाया !!
सोहम

1
ओपेरा को कभी-कभी गलत तरीके से काम करने selectionStartऔर lengthरिक्त स्थान पर कम संख्या में लौटने की सूचना दी गई थी । इसलिए मैं 10000इसके बजाय या किसी अन्य बड़ी संख्या का उपयोग करता हूं this.value.length(IE8 और IE11 पर परीक्षण किया गया)
vladkras

160

यह कोशिश करो, यह मेरे लिए काम किया है:

//input is the input element

input.focus(); //sets focus to element
var val = this.input.value; //store the value of the element
this.input.value = ''; //clear the value of the element
this.input.value = val; //set that value back.  

कर्सर को अंत तक ले जाने के लिए, इनपुट पर पहले ध्यान केंद्रित करना होगा, फिर जब मूल्य बदल जाएगा तो यह अंत में मिल जाएगा। यदि आप एक ही .value सेट करते हैं, तो यह क्रोम में नहीं बदलेगा।


2
यह onfocus = "this.value = this.value;
Tareq

15
मान सेट करने से पहले फ़ोकस सेट करना क्रोम में काम करने की कुंजी है।
अनातोली टेकटोनिक

7
क्यों this.लाइनों 2, 3, और 4 पर इनपुट के सामने रखा ? हम पहले से ही जानते हैं कि inputइनपुट तत्व है। प्रयोग thisबेमानी लगता है। अच्छा समाधान अन्यथा!
११

3
@ तारेक वे समान नहीं हैं। यह ट्रिक स्वीकार किए गए जवाब से बहुत बेहतर है।
लुईस

4
आसान:$input.focus().val($input.val());
दूधोव्स्की

99

इस बिट के साथ चारों ओर हैक करने के बाद, मैंने सबसे अच्छा तरीका यह पाया कि setSelectionRangeयदि ब्राउज़र इसका समर्थन करता है, तो फ़ंक्शन का उपयोग करना है; यदि नहीं, तो माइक बैरो के उत्तर में विधि का उपयोग करने से पीछे हटें (अर्थात मूल्य को स्वयं से बदलें)।

मैं उस स्थिति में भी scrollTopउच्च मूल्य पर सेट हो रहा हूं जब हम लंबवत-स्क्रॉल करने योग्य हैं textarea। ( $(this).height()फ़ायरफ़ॉक्स और क्रोम की तुलना में एक उच्च मूल्य का उपयोग करना अधिक विश्वसनीय लगता है ।)

मैंने इसे एक jQuery प्लगइन के रूप में बनाया है। (यदि आप jQuery का उपयोग नहीं कर रहे हैं तो मुझे विश्वास है कि आप अभी भी आसानी से पर्याप्त प्राप्त कर सकते हैं।)

मैंने IE6, IE7, IE8, Firefox 3.5.5, Google Chrome 3.0, Safari 4.0.4, Opera 10.00 में परीक्षण किया है।

यह putCursorAtEnd प्लगइन के रूप में jquery.com पर उपलब्ध है । आपकी सुविधा के लिए, रिलीज़ 1.0 का कोड निम्नानुसार है:

// jQuery plugin: PutCursorAtEnd 1.0
// http://plugins.jquery.com/project/PutCursorAtEnd
// by teedyay
//
// Puts the cursor at the end of a textbox/ textarea

// codesnippet: 691e18b1-f4f9-41b4-8fe8-bc8ee51b48d4
(function($)
{
    jQuery.fn.putCursorAtEnd = function()
    {
    return this.each(function()
    {
        $(this).focus()

        // If this function exists...
        if (this.setSelectionRange)
        {
        // ... then use it
        // (Doesn't work in IE)

        // Double the length because Opera is inconsistent about whether a carriage return is one character or two. Sigh.
        var len = $(this).val().length * 2;
        this.setSelectionRange(len, len);
        }
        else
        {
        // ... otherwise replace the contents with itself
        // (Doesn't work in Google Chrome)
        $(this).val($(this).val());
        }

        // Scroll to the bottom, in case we're in a tall textarea
        // (Necessary for Firefox and Google Chrome)
        this.scrollTop = 999999;
    });
    };
})(jQuery);

4
लंबाई की गणना क्यों? अगर आप वैसे भी इसे ओवरशूट करने जा रहे हैं, तो सिर्फ ये.सेट्सलेक्शनियन (9999,9999) क्यों नहीं?
17

21
<script type="text/javascript">  
    function SetEnd(txt) {  
      if (txt.createTextRange) {  
       //IE  
       var FieldRange = txt.createTextRange();  
       FieldRange.moveStart('character', txt.value.length);  
       FieldRange.collapse();  
       FieldRange.select();  
       }  
      else {  
       //Firefox and Opera  
       txt.focus();  
       var length = txt.value.length;  
       txt.setSelectionRange(length, length);  
      }  
    }   
</script>  

यह फ़ंक्शन IE9, फ़ायरफ़ॉक्स 6.x और ओपेरा 11.x में मेरे लिए काम करता है


महान, पहला तैयार समाधान जो एफएफ 6 और आईई 8 दोनों के लिए काम करता है।
सिमोन

3
किसी कारण के लिए लोकप्रिय जवाब मेरे लिए काम नहीं किया। यह सही काम किया।
मीट्रिक 15

IE9 में मेरे लिए काम नहीं करता है। त्रुटि:SCRIPT16389: Unspecified error.
सोहम

1
पूरी तरह से एफएफ 46, क्रोम 51 और आईई 11. में काम करता है
वेबदेवग्यी

यह IE 8 में काम करता है जबकि कुछ अन्य विकल्प नहीं था। धन्यवाद।
BenMaddox

17

मैंने क्रोम में काफी शानदार सफलता के साथ निम्नलिखित की कोशिश की है

$("input.focus").focus(function () {
    var val = this.value,
        $this = $(this);
    $this.val("");

    setTimeout(function () {
        $this.val(val);
    }, 1);
});

त्वरित ठहरनेवाला:

यह प्रत्येक इनपुट फ़ील्ड को उस पर फ़ोकस वर्ग के साथ लेता है, फिर इनपुट फ़ील्ड के पुराने मान को एक चर में संग्रहीत करता है, बाद में यह रिक्त स्ट्रिंग को इनपुट फ़ील्ड पर लागू करता है।

फिर यह 1 मील प्रति सेकंड इंतजार करता है और फिर से पुराने मूल्य में डालता है।


उत्तम! अन्य सभी समाधान मेरे लिए काम नहीं कर रहे हैं, केवल आपका समाधान मेरे लिए काम कर रहा है। हो सकता है कि क्योंकि मैं textarea के लिए मान असाइन करने के लिए php का उपयोग कर रहा हूं, और js उस मूल्य का पता नहीं लगा सकता जिससे js को 1 मिली सेकेंड का इंतजार करना पड़े।
zac1987

3
@ zac1987 शायद ऐसा नहीं है क्योंकि php html को रेंडर करेगा, html क्लाइंट को लोड किया जाएगा और फिर js चलेगा। संभावना है कि आप एक दस्तावेज तैयार घटना की प्रतीक्षा नहीं कर रहे हैं।
जुलाब

बस यह इंगित करने के लिए कि सेटटाइमआउट का उपयोग करना अप्रत्याशित परिणाम का कारण हो सकता है। कोड कुछ परिस्थितियों में सही ढंग से व्यवहार कर सकता है जैसे कभी-कभी कुछ उस 1ms के दौरान इनपुट को बदल सकता है कि वैल वापस सेट नहीं होगा। यह भी ध्यान रखना महत्वपूर्ण है कि 1ms दूसरा न्यूनतम प्रतीक्षा समय है। इसलिए यदि आपके पास कुछ सीपीयू बाध्य विधियां हैं, तो फोकस 1ms से अधिक इंतजार कर सकता है। यह UI को अनुत्तरदायी बना देगा। और यह आवश्यक नहीं होना चाहिए क्योंकि .val () विधि को वैसे भी UI परिवर्तनों को ट्रिगर करना चाहिए।
Locc Faure-Lacroix

10

यह 2019 है और ऊपर दिए गए तरीकों में से कोई भी मेरे लिए काम नहीं करता है, लेकिन इस एक ने https://css-tricks.com/snippets/javascript/move-cursor-to-end-of-input/ से लिया।

function moveCursorToEnd(id) {
  var el = document.getElementById(id) 
  el.focus()
  if (typeof el.selectionStart == "number") {
      el.selectionStart = el.selectionEnd = el.value.length;
  } else if (typeof el.createTextRange != "undefined") {           
      var range = el.createTextRange();
      range.collapse(false);
      range.select();
  }
}
<input id="myinput" type="text" />
<a href="#" onclick="moveCursorToEnd('myinput')">Move cursor to end</a>


1
धन्यवाद @MaxAlexanderHanna, मैं केवल था el.focus()में else ifतो यह कुछ मामलों में काम नहीं कर रहा था। मैंने इस काम को अब क्रोम में सत्यापित किया और (कंपकंपी) IE
एंडी रेडडजैट

7/12/2019 तक IE और CHROME दोनों में परीक्षण और काम करता है। धन्यवाद, उत्थान।
मैक्स अलेक्जेंडर हैना

शानदार, यह कैटालिना बीटा पर सफारी में काम करता है।
नेटऑपरेटर विब्बी

8

सरल। मूल्यों को संपादित या बदलते समय, पहले ध्यान केंद्रित करें फिर मूल्य निर्धारित करें।

$("#catg_name").focus();
$("#catg_name").val(catg_name);

पुराना मानक अभी भी 2016 में क्रोम और एफएफ में यहां काम करता है।
वोलोमाइक

1
एकदम सही जवाब।
पार्थ पॉल

7

अभी भी मध्यवर्ती चर की जरूरत है, (देखें var val =) अन्यथा कर्सर अजीब व्यवहार करता है, हमें अंत में इसकी आवश्यकता है।

<body onload="document.getElementById('userinput').focus();">
<form>
<input id="userinput" onfocus="var val=this.value; this.value=''; this.value= val;"
         class=large type="text" size="10" maxlength="50" value="beans" name="myinput">
</form>
</body>

6

el.setSelectionRange(-1, -1);

https://codesandbox.io/s/peaceful-bash-x2mti

यह विधि एक कॉल में HTMLInputElement.selectionStart, SelectionEnd, और SelectionDirection गुणों को अपडेट करती है।

https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement/setSelectionRange

अन्य जेएस विधियों में -1आमतौर पर अंतिम वर्ण का मतलब (से) होता है। इस एक के लिए भी मामला है, लेकिन मैं डॉक्स में इस व्यवहार का स्पष्ट उल्लेख नहीं पा सका।


यह मेरे लिए पूरी तरह से काम करता है और यह सबसे सरल है। +1
क्रिस फैर

मुझे onfocus = "this.value = this.value;" भी शामिल करना पड़ा माइक बैरो के जवाब से
क्रिस फार

5

सभी मामलों के लिए सभी ब्राउज़रों के लिए:

function moveCursorToEnd(el) {
    window.setTimeout(function () {
            if (typeof el.selectionStart == "number") {
            el.selectionStart = el.selectionEnd = el.value.length;
        } else if (typeof el.createTextRange != "undefined") {
            var range = el.createTextRange();
            range.collapse(false);
            range.select();
        }
    }, 1);
}

यदि आपको ऑन-फ़ोकस ईवेंट हैंडलर से कर्सर ले जाने की आवश्यकता है, तो टाइमआउट आवश्यक है


ध्यान दें कि यह एंड्रॉइड पर समस्याओं का कारण बनता है, हालांकि, रेंज चयन कीबोर्ड बफर में डेटा डालता है, जिसका अर्थ है कि आपके द्वारा टाइप की गई कोई भी कुंजी इनपुट में पाठ को डुप्लिकेट कर देगी, जो कि सबसे उपयोगी नहीं है।
माइक 'पोमैक्स' कमेरमन्स

1
यह अद्भुत और मेरे लिए कमाल का काम है! मेरे पास इनपुट्स का एक समूह है, जिसे एक स्क्रॉललैट की आवश्यकता है और वह अजीब चीजें करता है अर्थात इसलिए मैं एक ऐसी चीज की तलाश में था जिसे मैं एक शिम के लिए उपयोग कर सकता हूं और यह वह था। यह अन्य ब्राउज़रों में काम नहीं करता है, लेकिन जहां कुछ भी काम नहीं करता है वह अद्भुत है!
zazvorniki

5

मुझे स्वीकृत उत्तर बहुत पसंद हैं, लेकिन इसने क्रोम में काम करना बंद कर दिया। क्रोम में, कर्सर को अंत तक जाने के लिए, इनपुट मूल्य को बदलना होगा। समाधान इस प्रकार है:

<input id="search" type="text" value="mycurrtext" size="30" 
   onfocus="var value = this.value; this.value = null; this.value = value;" name="search"/>

1
यह वह समाधान है जो वास्तव में अब मेरे लिए क्रोम पर काम करता है। वाक्यविन्यास अजीब है, लेकिन हे, अब के लिए इस समाधान के साथ जीना सीखेंगे!
सैम

3

JQuery में, वह है

$(document).ready(function () {
  $('input').focus(function () {
    $(this).attr('value',$(this).attr('value'));
  }
}

2
यह फ़ंक्शन केवल तब मूल्य मान निर्दिष्ट करेगा जब $ ('इनपुट') फ़ोकस प्राप्त करता है। यह लाइन के अंत में कर्सर नहीं भेजेगा।
वृष

3

यह समस्या दिलचस्प है। इसके बारे में सबसे भ्रामक बात यह है कि मैंने जो कोई समाधान नहीं पाया वह समस्या को पूरी तरह हल कर दिया।

++++++++ SOLUTION ++++++++

  1. आपको इस तरह से JS फ़ंक्शन की आवश्यकता है:

    function moveCursorToEnd(obj) {
    
      if (!(obj.updating)) {
        obj.updating = true;
        var oldValue = obj.value;
        obj.value = '';
        setTimeout(function(){ obj.value = oldValue; obj.updating = false; }, 100);
      }
    
    }
  2. आपको इस आदमी को ऑनफोकस और ऑनक्लिक घटनाओं में कॉल करने की आवश्यकता है।

    <input type="text" value="Test Field" onfocus="moveCursorToEnd(this)" onclick="moveCursorToEnd(this)">

यह सभी उपकरणों पर काम करता है !!!!


2

मैंने अभी-अभी पाया कि iOS में, सेटिंग textarea.textContentप्रॉपर्टी हर बार टेक्स्टारिया एलिमेंट में टेक्स्ट के अंत में कर्सर रखेगा। व्यवहार मेरे ऐप में एक बग था, लेकिन ऐसा प्रतीत होता है कि आप जानबूझकर उपयोग कर सकते हैं।


2
var valsrch = $('#search').val();
$('#search').val('').focus().val(valsrch);

यह समाधान मौजूदा jQuery समाधान से बेहतर क्या है?
रोवनियन

यह एक और उपाय है। यदि आपके पास html फ़ाइलों और केवल जावास्क्रिप्ट को फिर से तैयार करने की अनुमति नहीं है, तो यह समाधान betther है;) मेरी भी यही स्थिति थी!
हनकराम

इस समाधान ने मेरे लिए काम किया दूसरा jQuery समाधान संभवतः इस तथ्य से संबंधित नहीं था कि आप ध्यान केंद्रित करने से पहले इनपुट मूल्य को खाली करते हैं।
talsibony

2

कुछ जवाब ले रहा है .. एक एकल पंक्ति jquery बना रहा है।

$('#search').focus().val($('#search').val());

1

यदि इनपुट फ़ील्ड को केवल एक स्थिर डिफ़ॉल्ट मान की आवश्यकता होती है जो मैं आमतौर पर jQuery के साथ करता हूं:

$('#input').focus().val('Default value');

यह सभी ब्राउज़रों में काम करने लगता है।


1

हालांकि यह बहुत सारे उत्तरों के साथ एक पुराना प्रश्न हो सकता है, मैं एक समान मुद्दे पर भाग गया और कोई भी उत्तर मुझे पसंद नहीं था और / या खराब तरीके से समझाया गया था। चयनस्टार्ट और चयन गुणों के साथ मुद्दा यह है कि वे इनपुट प्रकार संख्या के लिए मौजूद नहीं हैं (जबकि पाठ प्रकार के लिए प्रश्न पूछा गया था, मुझे लगता है कि यह उन अन्य लोगों की मदद कर सकता है जिनके पास अन्य इनपुट प्रकार हो सकते हैं जिन्हें उन्हें ध्यान केंद्रित करने की आवश्यकता है)। इसलिए यदि आप नहीं जानते कि इनपुट प्रकार फलन पर ध्यान केंद्रित करेगा या नहीं, तो आप उस समाधान का उपयोग नहीं कर सकते।

वह समाधान जो क्रॉस ब्राउज़र का काम करता है और सभी इनपुट प्रकारों के लिए सरल है:

  • एक चर में इनपुट के मूल्य को प्राप्त करें और संग्रहीत करें
  • इनपुट पर ध्यान दें
  • संग्रहीत मूल्य पर इनपुट का मान सेट करें

इस तरह से इनपुट तत्व के अंत में कर्सर होता है।
तो आप सब कुछ इस तरह से करेंगे (jquery का उपयोग करते हुए, तत्व चयनकर्ता को प्रदान किया जाना चाहिए कि जिस पर ध्यान केंद्रित करना है वह क्लिक किए गए तत्व के 'डेटा-फ़ोकस-तत्व' डेटा विशेषता के माध्यम से सुलभ है और फ़ंक्शन '.foo' पर क्लिक करने के बाद निष्पादित होता है। तत्व):

$('.foo').click(function() {
    element_selector = $(this).attr('data-focus-element');
    $focus = $(element_selector);
    value = $focus.val();
    $focus.focus();
    $focus.val(value);
});

यह काम क्यों करता है? बस, जब .focus () कहा जाता है, तो इनपुट तत्व की शुरुआत में फोकस जोड़ा जाएगा (जो कि यहां की मुख्य समस्या है), इस तथ्य की अनदेखी करते हुए, कि इनपुट तत्व का पहले से ही इसमें एक मूल्य है। हालांकि, जब किसी इनपुट का मूल्य बदला जाता है, तो कर्सर स्वचालित रूप से इनपुट तत्व के अंदर मूल्य के अंत में रखा जाता है। इसलिए यदि आप उसी मान के साथ मूल्य को ओवरराइड करते हैं जो पहले इनपुट में दर्ज किया गया था, तो मूल्य अछूता दिखेगा, कर्सर, हालांकि, अंत तक चलेगा।


1

कोशिश करें कि यह वैनिला जावास्क्रिप्ट के साथ काम करे।

<input type="text" id="yourId" onfocus=" let value = this.value; this.value = null; this.value=value" name="nameYouWant" class="yourClass" value="yourValue" placeholder="yourPlaceholder...">

जेएस में

document.getElementById("yourId").focus()

0

पाठ के अंत में पाठ क्षेत्र पर क्लिक करने पर कर्सर सेट करें ... इस कोड का भिन्न रूप है ... ALSO काम करता है! फ़ायरफ़ॉक्स, IE, सफारी, क्रोम के लिए ..

सर्वर-साइड कोड में:

txtAddNoteMessage.Attributes.Add("onClick", "sendCursorToEnd('" & txtAddNoteMessage.ClientID & "');")

जावास्क्रिप्ट में:

function sendCursorToEnd(obj) {
    var value =  $(obj).val(); //store the value of the element
    var message = "";
    if (value != "") {
        message = value + "\n";
     };
    $(obj).focus().val(message);
    $(obj).unbind();
 }

0

यदि आप पहले मूल्य निर्धारित करते हैं और फिर फोकस सेट करते हैं, तो कर्सर हमेशा अंत में दिखाई देगा।

$("#search-button").click(function (event) {
    event.preventDefault();
    $('#textbox').val('this');
    $("#textbox").focus();
    return false;
});

यहाँ https://jsfiddle.net/5on50caf/1/ का परीक्षण करना है।


0

मैं एक "div" तत्व के अंत में कर्सर रखना चाहता था जहां संतोषप्रद = सत्य हो, और मुझे Xeonbross कोड के साथ एक समाधान मिला :

<input type="button" value="Paste HTML" onclick="document.getElementById('test').focus(); pasteHtmlAtCaret('<b>INSERTED</b>'); ">

<div id="test" contenteditable="true">
    Here is some nice text
</div>

और यह कार्य जादू करते हैं:

 function pasteHtmlAtCaret(html) {
    var sel, range;
    if (window.getSelection) {
        // IE9 and non-IE
        sel = window.getSelection();
        if (sel.getRangeAt && sel.rangeCount) {
            range = sel.getRangeAt(0);
            range.deleteContents();

            // Range.createContextualFragment() would be useful here but is
            // non-standard and not supported in all browsers (IE9, for one)
            var el = document.createElement("div");
            el.innerHTML = html;
            var frag = document.createDocumentFragment(), node, lastNode;
            while ( (node = el.firstChild) ) {
                lastNode = frag.appendChild(node);
            }
            range.insertNode(frag);

            // Preserve the selection
            if (lastNode) {
                range = range.cloneRange();
                range.setStartAfter(lastNode);
                range.collapse(true);
                sel.removeAllRanges();
                sel.addRange(range);
            }
        }
    } else if (document.selection && document.selection.type != "Control") {
        // IE < 9
        document.selection.createRange().pasteHTML(html);
    }
}

अधिकांश ब्राउज़रों के लिए ठीक काम करता है, कृपया इसे जांचें, यह कोड टेक्स्ट डालता है और टेक्स्ट को div एलिमेंट (इनपुट तत्व नहीं) के अंत में फोकस करता है

https://jsfiddle.net/Xeoncross/4tUDk/

धन्यवाद, एक्सोनक्रॉस


0

मैंने भी उसी समस्या का सामना किया। अंत में यह मेरे लिए काम करने वाला है:

jQuery.fn.putCursorAtEnd =  = function() {

  return this.each(function() {

    // Cache references
    var $el = $(this),
        el = this;

    // Only focus if input isn't already
    if (!$el.is(":focus")) {
     $el.focus();
    }

    // If this function exists... (IE 9+)
    if (el.setSelectionRange) {

      // Double the length because Opera is inconsistent about whether a carriage return is one character or two.
      var len = $el.val().length * 2;

      // Timeout seems to be required for Blink
      setTimeout(function() {
        el.setSelectionRange(len, len);
      }, 1);

    } else {

      // As a fallback, replace the contents with itself
      // Doesn't work in Chrome, but Chrome supports setSelectionRange
      $el.val($el.val());

    }

    // Scroll to the bottom, in case we're in a tall textarea
    // (Necessary for Firefox and Chrome)
    this.scrollTop = 999999;

  });

};

इसे हम इस प्रकार कह सकते हैं:

var searchInput = $("#searchInputOrTextarea");

searchInput
  .putCursorAtEnd() // should be chainable
  .on("focus", function() { // could be on any event
    searchInput.putCursorAtEnd()
  });

यह मेरे लिए सफारी, IE, क्रोम, मोज़िला में काम करता है। मोबाइल उपकरणों पर मैंने यह कोशिश नहीं की।


0

इस समाधान की जाँच करें!

//fn setCurPosition
$.fn.setCurPosition = function(pos) {
    this.focus();
    this.each(function(index, elem) {
        if (elem.setSelectionRange) {
            elem.setSelectionRange(pos, pos);
        } else if (elem.createTextRange) {
            var range = elem.createTextRange();
            range.collapse(true);
            range.moveEnd('character', pos);
            range.moveStart('character', pos);
            range.select();
        }
    });
    return this;
};

// USAGE - Set Cursor ends
$('#str1').setCurPosition($('#str1').val().length);

// USAGE - Set Cursor at 7 position
// $('#str2').setCurPosition(7);
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<p>Set cursor at any position</p>
<p><input type="text" id="str1" value="my string here" /></p>
<p><input type="text" id="str2" value="my string here" /></p>


0

सुपर आसान (आपको इनपुट तत्व पर ध्यान केंद्रित करना पड़ सकता है)

inputEl = getElementById('inputId');
var temp = inputEl.value;
inputEl.value = '';
inputEl.value = temp;

-1

मैंने पहले सुझावों की कोशिश की लेकिन किसी ने मेरे लिए काम नहीं किया (उन्हें क्रोम में परीक्षण किया गया), इसलिए मैंने अपना कोड लिखा - और यह फ़ायरफ़ॉक्स, IE, सफारी, क्रोम में ठीक काम करता है ...

टेक्सारिया में:

onfocus() = sendCursorToEnd(this);

जावास्क्रिप्ट में:

function sendCursorToEnd(obj) { 
var value = obj.value; //store the value of the element
var message = "";
if (value != "") {
    message = value + "\n";
};
$(obj).focus().val(message);}

-1

यहाँ मेरे जवाब का jsField डेमो है। डेमो कॉफीस्क्रिप्ट का उपयोग करता है, लेकिन आप इसे सादे जावास्क्रिप्ट में बदल सकते हैं यदि आपको आवश्यकता है तो आप ।

जावास्क्रिप्ट में महत्वपूर्ण हिस्सा:

var endIndex = textField.value.length;
if (textField.setSelectionRange) {
   textField.setSelectionRange(endIndex, endIndex);
}

मैं इस उत्तर को पोस्ट कर रहा हूं क्योंकि मैंने पहले ही इसे किसी और के लिए लिखा था, जिसका प्रश्न समान था। यह उत्तर शीर्ष के रूप में कई किनारे के मामलों को कवर नहीं करता है क्योंकि यहाँ शीर्ष उत्तर हैं, लेकिन यह मेरे लिए काम करता है, और इसमें एक jsField डेमो है जिसके साथ आप खेल सकते हैं।

यहाँ jsFiddle से कोड है, इसलिए यदि jsField गायब हो जाता है तो भी यह उत्तर सुरक्षित है:

moveCursorToEnd = (textField) ->
  endIndex = textField.value.length
  if textField.setSelectionRange
    textField.setSelectionRange(endIndex, endIndex)

jQuery ->
  $('.that-field').on 'click', ->
    moveCursorToEnd(this)
<div class="field">
    <label for="pressure">Blood pressure</label>:
    <input class="that-field" type="text" name="pressure" id="pressure" value="24">
</div>
<p>
    Try clicking in the text field. The cursor will always jump to the end.
</p>
body {
    margin: 1em;
}

.field {
    margin-bottom: 1em;
}

-1

निम्नलिखित कोड आज़माएं:

$('input').focus(function () {
    $(this).val($(this).val());
}).focus()

1
पीछे चल रहे व्हाट्सएप को जोड़ने से ओपी ने संकेत दिया है कि वे इच्छा रखते हैं?
चार्ल्स डफी

लेकिन मेरा जवाब -2 क्यों मिलता है? मुझे नहीं मिला! यह उदाहरण है कि यह काम करता है
msroot

अब जब आपने अनिर्दिष्ट साइड इफेक्ट तय कर दिया है, तो यह स्पष्ट रूप से गलत है (अनिर्दिष्ट व्यवहार-बोध में), लेकिन मैं समझ सकता हूं कि यह उस बिंदु से पहले क्यों कम हो गया होगा। इस बिंदु पर, मैं जिस कारण से उत्थान नहीं कर रहा हूं, वह संभावित रूप से खराब प्रदर्शन है - बिना पढ़े हुए लंबाई का मूल्य पढ़ना और लिखना धीमा होना संभावित है; setSelectionRangeदृष्टिकोण निश्चित रूप से और अधिक कुशल जब / जहां समर्थित है।
चार्ल्स डफी

1
(खैर - वह, और मुझे यकीन नहीं है कि यह मौजूदा उत्तरों में क्या जोड़ता है, जो preexisting मान को फिर से सेट करके भी काम करता है; यदि यह कुछ नया / महत्वपूर्ण जोड़ देता है, तो केवल कोड के बजाय जो कुछ है उसका वर्णन करते हुए कुछ पाठ जोड़ते हैं। , मदद करेगा)।
चार्ल्स डफी

सुनिश्चित करें - और क्या ओपी ने इस सवाल में संकेत दिया कि वे एक स्थान चाहते थे? यदि नहीं, तो यह विनिर्देश का हिस्सा नहीं है; इस प्रकार, "अनिर्दिष्ट"।
चार्ल्स डफी

-1

हालांकि मैं बहुत देर से जवाब दे रहा हूं, लेकिन भविष्य में क्वेरी के लिए यह मददगार होगा। और यह contenteditablediv में भी काम करता है ।

जहां से आपको अंत में ध्यान केंद्रित करने की आवश्यकता है; इस कोड को लिखें-

var el = document.getElementById("your_element_id");
placeCaretAtEnd(el);

और समारोह है -

function placeCaretAtEnd(el) {
    el.focus();
    if (typeof window.getSelection != "undefined"
            && typeof document.createRange != "undefined") {
        var range = document.createRange();
        range.selectNodeContents(el);
        range.collapse(false);
        var sel = window.getSelection();
        sel.removeAllRanges();
        sel.addRange(range);
    } else if (typeof document.body.createTextRange != "undefined") {
        var textRange = document.body.createTextRange();
        textRange.moveToElementText(el);
        textRange.collapse(false);
        textRange.select();
    }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.