4

我正在努力解决一个实际直截了当的问题:在 Internet Explorer 中,我想在当前插入符号位置插入纯文本。这对于简单的 TEXTAREA 元素非常有效,但它并不完全适用于可编辑的 IFRAME,这就是我所拥有的。

在我使用的脚本中,我从 IFRAME 的文档中创建了一个 TextRange 对象,我用它来将文本作为 HTML 粘贴到光标位置。

<iframe id="editable">
  <html>
    <body>
      Some really boring text.
    </body>
  </html>
</iframe>
<script type="text/javascript">

    window.onload = function() {
        var iframe = document.getElementById('editable');
        var doc = iframe.contentDocument || iframe.contentWindow.document;

        doc.body.innerHTML = iframe.textContent || iframe.innerHTML;

        // Make IFRAME editable
        if (doc.body.contentEditable) {
            doc.body.contentEditable = true;
        } 
    }

    function insert(text) {
        var iframe = document.getElementById('editable');
        var doc = iframe.contentDocument || iframe.contentWindow.document;
        iframe.focus();
      if(typeof doc.selection != 'undefined') {
            var range = doc.selection.createRange();
            range.pasteHTML(text);
      }
}
</script>
<input type="button" value="Insert" onClick="insert('foo');"/>

当我在 IFRAME 中选择一些文本时,选择将被替换为“foo”——这是预期的行为。但是当我只是将插入符号放在文本中的某个位置时,插入将不起作用。

这是常见的行为,因为对于我只是将光标放在某处的情况“没有真正的选择”,还是它是 IE 中可编辑 IFRAME 的错误,因为它与简单的 TEXTAREA 元素配合得很好?

有解决方法吗?

4

1 回答 1

6

如果您使用onmousedown而不是onclick在您的按钮中,您可能会发现它有效。

更新

之所以会有所不同,是因为click事件在 iframe 失去焦点(这会破坏 IE 中的折叠选择)之后触发,而mousedown在之前触发。

进一步更新

您也可以尝试通过在 iframe 失去/接收焦点时保存/恢复选定的 TextRange 在 IE 中解决此问题。像这样的东西应该工作:

function fixIframeCaret(iframe) {
    if (iframe.attachEvent) {
        var selectedRange = null;
        iframe.attachEvent("onbeforedeactivate", function() {
            var sel = iframe.contentWindow.document.selection;
            if (sel.type != "None") {
                selectedRange = sel.createRange();
            }
        });
        iframe.contentWindow.attachEvent("onfocus", function() {
            if (selectedRange) {
                selectedRange.select();
            }
        });
    }
}

window.onload = function() {
    var iframe = document.getElementById('editable');
    fixIframeCaret(iframe);
};
于 2011-03-17T12:17:38.053 回答