2010-05-20 18 views
35

Die alte Version der Frage ist unten, nachdem ich mehr erforscht habe, entschied ich mich, die Frage umzuformulieren. Das Problem wie zuvor ist, dass ich ein contenteditable div fokussieren muss, ohne den Text hervorzuheben, indem ich gerade den Fokus auf den Text in Chrome lege.jquery Setzen der Cursorposition in contenteditable div

Ich stelle fest, dass Leute diese Probleme in Textareas lösten, indem sie die Caret-Position in der Textarea zurücksetzten. Wie kann ich das mit einem zufrieden stellenden Element machen? Alle Plugins, die ich ausprobiert habe, funktionieren nur mit Textareas. Vielen Dank.

Old Phrasierung der Frage:

Ich habe ein contenteditable Element, das ich konzentrieren wollen, aber nur insoweit, als den Cursor an der Vorderseite des das Element zu platzieren, sondern die Auswahl alles.

elem.trigger('focus'); mit jquery wählt den gesamten Text im gesamten Element in Chrom. Firefox verhält sich korrekt und setzt das Caret auf die Vorderseite des Textes. Wie kann ich Chrome so verhalten, wie ich will, oder ist Fokus vielleicht nicht das, was ich suche für.

Vielen Dank.

+0

Diese [vorherige Frage] (http://stackoverflow.com/questions/499126/ jquery-set-cursor-position-im-text-Bereich) kann bei der Cursorpositionierung helfen. –

+0

Sind Sie sicher, dass die Arbeiten zufrieden sind? Ich konnte diese nicht zur Arbeit bringen. – Mark

+0

@Mark: Ich habe den Code auf die neueste Jquery aktualisiert und die Demo so modifiziert, dass sie mit reichhaltigem Inhalt funktioniert. –

Antwort

19

Demo: http://so.devilmaycode.it/jquery-setting-cursor-position-in-contenteditable-div/

 <div id="editable" contentEditable="true"> 
      <h2>Lorem</h2> <p>ipsum dolor <i>sit</i> 
       amet, consectetur <strong>adipiscing</strong> elit.</p> Aenean. 
     </div> 

<script type="text/javascript"> 
     $(function() { 
      $('[contentEditable="true"]').on('click', function (e) { 
       if (!$(this).hasClass('editing')) { 
        var html = $(this).html(); 
        if (html.length) { 
         var range = rangy.createRange(); 
         $(this).toggleClass('editing').html('<span class="content-editable-wrapper">' + html + '</span>'); 
         var $last = $(this).find('.content-editable-wrapper'); 
         range.setStartAfter($last[0]); 
         range.collapse(false); 
         rangy.getSelection().setSingleRange(range); 
        } 
       } 
      }).on('blur', function() { 
       $(this).toggleClass('editing').find('.content-editable-wrapper').children().last().unwrap(); 
      }); 
     }); 
    </script> 
+1

Das ist ein interessanter Hack, eine großartige Idee. Vielen Dank. Aber die Contenteditable ist ein Wysiwyg-Editor, also kann ich nicht einfach ein Textfeld ersetzen. – Mark

+0

sehen Sie die Updates! ;-) –

+1

Dies funktioniert nicht mit einem Textfeld :-( –

2

Ja, es geschieht, weil Sie

elem.trigger('focus'); 

try-Klasse zu verwenden, verwendet haben oder das Element zu identifizieren, auf dem Sie einen Trigger-Ereignis ausgelöst werden soll.

+0

elem ist eine Variable. – Mark

+2

Haben Sie es als Eingabe verwendet? Trigger ('focus'); ??? – Chirag

29

Vielleicht irre ich die Frage, aber würde das folgende nicht tun (Annahme einer bearbeitbaren <div> mit ID "editierbar")? Der Timer ist da, weil in Chrome, die native Browser Verhalten, das das gesamte Element wählt nach dem focus Ereignis auszulösen scheint, wodurch die Wirkung des Auswahlcode überschrieben, es sei denn, bis nach dem Fokus Veranstaltung verschoben:

var div = document.getElementById("editable"); 

div.onfocus = function() { 
    window.setTimeout(function() { 
     var sel, range; 
     if (window.getSelection && document.createRange) { 
      range = document.createRange(); 
      range.selectNodeContents(div); 
      range.collapse(true); 
      sel = window.getSelection(); 
      sel.removeAllRanges(); 
      sel.addRange(range); 
     } else if (document.body.createTextRange) { 
      range = document.body.createTextRange(); 
      range.moveToElementText(div); 
      range.collapse(true); 
      range.select(); 
     } 
    }, 1); 
}; 

div.focus(); 
+1

Awe !, das ist eine schöne Sache! Danke Tim. –

+1

Mein Gott, Tim, wie hast du das gemacht Danke, – pilau

+0

das ist großartig, aber wie lege ich den Fokus am Ende des div statt der Front? Http://jsfiddle.net/bq6 jQ/1/http://stackoverflow.com/questions/22599694/how-can-i-type-inside-the-parent-contentetitable-div – Squirrl

1

ich es geschafft um dieses Problem nach ein bisschen Stochern um das DOM zu lösen.

elm.focus(); 
window.getSelection().setPosition(0); 

Wahrscheinlich funktioniert nur auf WebKit-Browsern, aber da es die einzige Quelle des Problems ist, habe ich eine bedingte (mit jQuery)

if(!$.browser.webkit) { 
    elm.focus(); 
} else { 
    elm.focus(); 
    window.getSelection().setPosition(0); 
} 

Hoffnung das Ihr Problem löst.

+0

hmm, nicht sicher warum, das funktioniert nicht für mich. Tim Downs Antwort tut es aber. – Mark

+0

Ich habe dies auf Chrome, aber nicht Firefox zu arbeiten. – Skitterm

0

Set Zeigerposition in pre oder div tag:

function setCursor(pos) { 
 
    var el = document.getElementById("asd"); 
 
    var range = document.createRange(); 
 
    var sel = window.getSelection(); 
 
    range.setStart(el.childNodes[0], pos); 
 
    range.collapse(true); 
 
    sel.removeAllRanges(); 
 
    sel.addRange(range); 
 
    el.focus(); 
 
} 
 

 
$('button').click(function() { 
 
    setCursor(5); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div id="asd" contenteditable="true" > 
 
asd 
 
two 
 
</div> 
 
<button>Set caret position</button>

Quelle: https://social.msdn.microsoft.com/Forums/en-US/f91341cb-48b3-424b-9504-f2f569f4860f/getset-caretcursor-position-in-a-contenteditable-div?forum=winappswithhtml5

Verwandte Themen