【问题标题】:Create TextSelection from selection in IE11从 IE11 中的选择创建 TextSelection
【发布时间】:2014-07-25 14:26:35
【问题描述】:

我正在尝试修复 IE11 中的应用程序,但遇到了这个错误:在旧版本的 IE 中,有一个简单的selection object,但在 IE11 中已弃用。 MSDN 页面提供使用 getSelection 代替它,但它不一样。我需要根据选择创建一个TextRange,在旧 API 中有一个简单的解决方案:

// there is a TextRange object what I need
var textRange = document.selection.createRange();

新的HTMLSelection 对象没有createRange() 方法,我也没有找到合适的解决方案,什么不是修改DOM。

我试试这个:http://jsfiddle.net/p4Lu4/1/(用法:选择一些文本并按任意键。)

它的问题:如果你选择扔一个红色的盒子,它会删除盒子。

谁能知道更好的解决方案?

解决方案:

我想,我找到了解决办法。不是最好和最好的,但它对我有用:我可以从 Selection 创建完全相同的 TextRange。

http://jsfiddle.net/p4Lu4/4/

更新 2:

我为此创建了一个模块:https://gist.github.com/festo/50fe800c7369db140a62

【问题讨论】:

  • document.getSelection().getRangeAt(0) 适合我
  • @dandavis:它将返回一个Range 对象,而不是TextRange,这是我需要的......
  • 您链接到的文本范围仅适用于少数元素,而不适用于任意选定的元素:“您使用 IHTMLBodyElement::createTextRange、IHTMLInputHiddenElement::createTextRange、IHTMLInputTextElement::createTextRange、IHTMLTextAreaElement 检索 TextRange 对象::createTextRange 或 IHTMLButtonElement::createTextRange." 正文很奇怪,但其他的有一个 .value 和 .selectionStart/.selectionEnd 属性,您可以使用它们来操作文本值。
  • 对不起,我有点困惑:我认为TextRangeIHTMLTxtRange 是一样的,只是IHTMLTxtRange 是一个更新的版本......不幸的是,我需要使用整个身体。
  • 在我的Rangy library 中有 Rang-to-TextRange 转换,作为提供 IE TextRange module 有一个findText() 方法

标签: javascript internet-explorer selection


【解决方案1】:

我的 Rangy 库有代码将 DOM 兼容范围转换为 IE TextRange,作为在 IE

var textRange = rangy.getSelection().getNativeTextRange();

请注意,Rangy 选择的getNativeTextRange() 方法仅存在于 IE 中。

另一种选择是使用 Rangy 的 TextRange module,其中添加了一个类似于 IE 的 findText() 方法到 Rangy 的范围对象,以及 class applier module 进行突出显示。这适用于所有主流浏览器。

演示:http://jsfiddle.net/sycqeev2/

我不确定当您突出显示文本并按下某个键时您的演示中会发生什么,因此我没有尝试对此进行任何操作。

【讨论】:

    猜你喜欢
    • 2015-07-26
    • 1970-01-01
    • 1970-01-01
    • 2019-07-16
    • 2014-05-22
    • 1970-01-01
    • 2019-12-24
    • 1970-01-01
    • 2019-02-01
    相关资源
    最近更新 更多