Ich habe ein ungewöhnliches Problem mit einem IE-Dokument mit contentEditable auf True festgelegt. Das Aufrufen von select() in einem Bereich, der sich am Ende eines Textknotens befindet, der einem Blockelement unmittelbar vorausgeht, bewirkt, dass die Auswahl nach dem rechten einen Zeichen verschoben wird und dort erscheint, wo es nicht sollte. Ich habe einen Fehler an Microsoft gegen IE8 eingereicht. Wenn Sie können, stimmen Sie bitte für dieses Problem ab, damit es behoben werden kann.IE TextRange Select-Methode funktioniert nicht richtig
https://connect.microsoft.com/IE/feedback/ViewFeedback.aspx?FeedbackID=390995
ich einen Testfall geschrieben haben, die Wirkung zu zeigen:
<html>
<body>
<iframe id="editable">
<html>
<body>
<div id="test">
Click to the right of this line ->
<p id="par">Block Element</p>
</div>
</body>
</html>
</iframe>
<input id="mytrigger" type="button" value="Then Click here to Save and Restore" />
<script type="text/javascript">
window.onload = function() {
var iframe = document.getElementById('editable');
var doc = iframe.contentDocument || iframe.contentWindow.document;
// An IFRAME without a source points to a blank document. Here we'll
// copy the content we stored in between the IFRAME tags into that
// document. It's a hack to allow us to use only one HTML file for this
// test.
doc.body.innerHTML = iframe.textContent || iframe.innerHTML;
// Marke the IFRAME as an editable document
if (doc.body.contentEditable) {
doc.body.contentEditable = true;
} else {
var mydoc = doc;
doc.designMode = 'On';
}
// A function to demonstrate the bug.
var myhandler = function() {
// Step 1 Get the current selection
var selection = doc.selection || iframe.contentWindow.getSelection();
var range = selection.createRange ? selection.createRange() : selection.getRangeAt(0);
// Step 2 Restore the selection
if (range.select) {
range.select();
} else {
selection.removeAllRanges();
selection.addRange(range);
doc.body.focus();
}
}
// Set up the button to perform the test code.
var button = document.getElementById('mytrigger');
if (button.addEventListener) {
button.addEventListener('click', myhandler, false);
} else {
button.attachEvent('onclick', myhandler);
}
}
</script>
</body>
</html>
Das Problem wird in der MyHandler Funktion ausgesetzt. Das ist alles, was ich mache, es gibt keinen Schritt 3 zwischen dem Speichern und Wiederherstellen der Auswahl, und dennoch bewegt sich der Cursor. Es scheint nicht zu passieren, wenn die Auswahl leer ist (dh ich habe einen blinkenden Cursor, aber keinen Text), und es scheint nur dann zu passieren, wenn der Cursor am Ende eines Textknotens steht, der einem Blockknoten unmittelbar vorangeht.
Es scheint, dass der Bereich immer noch in der richtigen Position ist (wenn ich ParentElement auf den Bereich aufrufen, wird das div zurückgegeben), aber wenn ich einen neuen Bereich von der aktuellen Auswahl erhält, ist der neue Bereich innerhalb der Absatzmarke und das ist das Elternelement.
Wie kann ich das umgehen und die Auswahl im Internet Explorer konsistent speichern und wiederherstellen?
Nachdem ich einige Zeit damit verbracht habe, bin ich einigermaßen überzeugt, dass es keine Möglichkeit gibt, das Caret programmatisch am Ende eines Textknotens zu platzieren, der einem Blockelement unmittelbar vorangeht. –