2010-11-20 13 views
79

क्रोम में उत्पादन पर सेट कैरट:contenteditable, पाठ (क्रॉस-ब्राउज़र) के अंत

<div id="content" contenteditable="true" style="border:1px solid #000;width:500px;height:40px;"> 
    hey 
    <div>what's up?</div> 
<div> 
<button id="insert_caret"></button> 

मेरा मानना ​​है कि एफएफ में यह कुछ इस तरह दिखेगा:

hey 
<br /> 
what's up? 

और आईई:

hey 
<p>what's up?</p> 
दुर्भाग्यवश,

दुर्भाग्यवश, इसे बनाने का कोई अच्छा तरीका नहीं है ताकि प्रत्येक ब्राउज़र एक div- या p-tag के बजाय <br /> डाले, या कम से कम मुझे कुछ भी ऑनलाइन नहीं मिला।


वैसे भी, क्या मैं अब क्या करना है, जब मैं बटन मारा, मैं कैरट पाठ के अंत में स्थापित किया जा करना चाहते हैं, कोशिश कर रहा हूँ तो यह कुछ इस तरह दिखना चाहिए:

hey 
what's up?| 

ऐसा करने का कोई तरीका है तो यह सभी ब्राउज़र में काम करता है?

उदाहरण:

$(document).ready(function() 
{ 
    $('#insert_caret').click(function() 
    { 
     var ele = $('#content'); 
     var length = ele.html().length; 

     ele.focus(); 

     //set caret -> end pos 
    } 
} 

उत्तर

213

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

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(); 
    } 
} 

placeCaretAtEnd(document.getElementById("content")); 

शुरू में कैरट रखने लगभग समान है: यह सिर्फ बदलते बूलियन में पारित की आवश्यकता है collapse() पर कॉल करें।

function createCaretPlacer(atStart) { 
    return function(el) { 
     el.focus(); 
     if (typeof window.getSelection != "undefined" 
       && typeof document.createRange != "undefined") { 
      var range = document.createRange(); 
      range.selectNodeContents(el); 
      range.collapse(atStart); 
      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(atStart); 
      textRange.select(); 
     } 
    }; 
} 

var placeCaretAtStart = createCaretPlacer(true); 
var placeCaretAtEnd = createCaretPlacer(false); 
+0

क्रोम के साथ काम नहीं करता है क्योंकि createTextRange एक मानक फ़ंक्शन नहीं है। Https://stackoverflow.com/a/41743191/700206 देखें। – Lee

+0

@Lee: यह क्रोम में ठीक काम करता है, जो 'window.getSelection' और' document.createRange' का समर्थन करता है। 'CreateTextRange' शाखा इंटरनेट एक्सप्लोरर के पुराने संस्करणों के लिए है। 'Window.getSelection' लिखने के समय –

+0

सभी ब्राउज़रों के 0.2 9% (आईई> 8) द्वारा समर्थित नहीं है। देखें: http://caniuse.com/#search=window.get चयन – Silentdrummer

-2

आप गूगल बंद संकलक का उपयोग कर रहे हैं, तो आप निम्न कर सकते हैं (कुछ टिम के जवाब से सरलीकृत): यहाँ एक उदाहरण है कि शुरू में कैरट रखने के लिए और अंत में कार्यों बनाता है

function placeCaretAtEnd(el) { 
    el.focus(); 
    range = goog.dom.Range.createFromNodeContents(el); 
    range.collapse(false); 
    range.select(); 
} 

यहाँ ClojureScript में एक ही बात है:

(defn place-caret-at-end [el] 
    (.focus el) 
    (doto (.createFromNodeContents goog.dom.Range el) 
     (.collapse false) 
     .select)) 

मैं IE बारे में निश्चित नहीं क्रोम, सफारी और फ़ायर्फ़ॉक्स, में इस परीक्षण किया है ...

+0

रेंज = goog.dom.Range।createFromNodeContents (एल); goog.dom क्या है? –

2

दुर्भाग्यवश टिम के उत्कृष्ट उत्तर ने केवल अंत में रखने के लिए मेरे लिए काम किया, शुरुआत में रखने के लिए मुझे इसे थोड़ा संशोधित करना पड़ा।

function setCaret(target, isStart) { 
    const range = document.createRange(); 
    const sel = window.getSelection(); 
    if (isStart){ 
    const newText = document.createTextNode(''); 
    target.appendChild(newText); 
    range.setStart(target.childNodes[0], 0); 
    } 
    else { 
    range.selectNodeContents(target); 
    } 
    range.collapse(isStart); 
    sel.removeAllRanges(); 
    sel.addRange(range); 
    target.focus(); 
    target.select(); 
} 

अगर focus() और select() वास्तव में जरूरत है, हालांकि सुनिश्चित नहीं हैं।

+0

आपने एक बाहरी पुस्तकालय भी पेश किया। यदि आपको लगता है कि फोकस और चयन की आवश्यकता नहीं है तो लाइनों पर टिप्पणी क्यों न करें और इसका परीक्षण क्यों करें? – dotnethaggis

+0

धन्यवाद, हटाया गया jquery। मुझे याद है कि मेरे कुछ विरोधाभासी परिणाम थे, मैं उन्हें फिर से अलग करने की कोशिश करूंगा। – dimid

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