我在使用 contentEditable 设置为 true 的 IE 文档时遇到了一个不寻常的问题。在位于块元素之前的文本节点末尾的范围上调用 select() 会导致选择向右移动一个字符并出现在不应出现的位置。我已经向微软提交了一个针对 IE8 的错误。如果可以,请为这个问题投票,以便解决。
https://connect.microsoft.com/IE/feedback/ViewFeedback.aspx?FeedbackID=390995
我写了一个测试用例来演示效果:
<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>
这个问题暴露在 myhandler 函数中。这就是我所做的一切,在保存和恢复选择之间没有第 3 步,但是光标移动了。除非选择为空(即我有一个闪烁的光标,但没有文本),否则它似乎不会发生,并且它似乎只发生在光标位于紧接在块节点之前的文本节点的末尾时。
似乎该范围仍然在正确的位置(如果我在它返回 div 的范围上调用 parentElement),但是如果我从当前选择中获得一个新范围,则新范围在段落标记内,这就是它父元素。
如何解决此问题并始终保存和恢复 Internet Explorer 中的选择?