getSelection() 在 IE 中不起作用

IT技术 javascript jquery internet-explorer
2021-03-04 15:29:56

有人可以帮我让这段代码在 IE 中工作吗:

HTML:

<p>Alex Thomas</p>
<button id="click">Click</button>

JS

$('#click').click(function(){
    var range = window.getSelection().getRangeAt(0);
    var selectionContents = range.extractContents();
    var span = document.createElement("span");
    span.style.color = "red";
    span.appendChild(selectionContents);
    range.insertNode(span);
});

在这里编码:http : //jsfiddle.net/WdrC2/

提前致谢...

3个回答

9 之前的 IE 不支持window.getSelection(). 您可以document.selection改用(有关说明,请参阅此 msdn 页面)。此选择对象有一个createRange()返回对象的方法TextRange有关详细信息,请参阅此 msdn 页面)。

请注意,selectiontextrange对象都是微软自己的实现,并不遵循 W3C 标准。您可以www.quirksmode.org/dom/range_intro.html阅读有关textrangerange问题的更多信息

以下实现适用于 IE:

$('#click').click(function(){
    var range = document.selection.createRange();
    range.pasteHTML("<span style='color: red'>" + range.htmlText + "</span>");
});

它不像其他实现那么好,因为您必须使用字符串而不是 dom。有一个小技巧,您可以将其粘贴<span id="myUniqueId"></span>为占位符,然后使用 dom 替换它。您仍然必须使用range.htmlTextrange.text尽管如此。

BTW:上面的实现显然只有 IE。您必须使用一些浏览器功能检测来决定使用哪个版本。

你确定 IE9 不支持window.getSelection()msdn.microsoft.com/en-us/library/ie/ff975169(v=vs.85).aspx说它确实..
2021-04-20 15:29:56
在 IE 11 中document.selection返回undefined——我不太确定上面的答案是否有效。
2021-04-21 15:29:56
@Rijk 你是对的,这就是为什么我写了“IE 9之前的版本不支持 window.getSelection()”。:)
2021-05-15 15:29:56

在这里测试这个:http : //jsfiddle.net/6BrWe/

这是一个小技巧,不那么漂亮,但应该可以在 IE 和其他浏览器中工作 - 不过我还没有做过很多跨浏览器测试:)

$('#click').click(function() {
    var whatBrowser = getIt();
    if (whatIsIt == 'notIE' && whatBrowser) {
        notIE(whatBrowser);
    }
    else if (whatIsIt == "isIE"&& whatBrowser) {
        isIE(whatBrowser);
    };
});

var whatIsIt = "";

function getIt() {
    if (window.getSelection) {
        whatIsIt = "notIE";
        return window.getSelection();
    }
    else if (document.getSelection) {
        whatIsIt = "notIE";
        return document.getSelection();
    }
    else {
        var selection = document.selection && document.selection.createRange();
        if (selection.text) {
            whatIsIt = "isIE";
            return selection;
        };
        return false;
    };
    return false;
};

function isIE(selection) {
    if (selection) {
        var selectionContents = selection.text;
        if (selectionContents) {
            selection.pasteHTML('<span class="reddy">' + selectionContents + '</span>');
        };
    };
};

function notIE(selection) {
    var range = window.getSelection().getRangeAt(0);
    var selectionContents = range.extractContents();
    var span = document.createElement("span");
    span.className= "reddy";
    span.appendChild(selectionContents);
    range.insertNode(span);
};
有了所有这些 JS,我不得不想知道你为什么不只document.getElementById("click").onclick为第一行做一个但是,对于使用特征检测的彻底答案,+1。
2021-04-25 15:29:56
OP 在那里有 jQuery,所以我没有改变那部分
2021-05-11 15:29:56

如果你想把“亚历克斯·托马斯”涂成红色,你可以这样做

HTML

<p id='txt'>Alex Thomas</p>
<input type='button' id='btn' value='click' />

JS

$('#click').click(function(){
  $('#txt').attr('color','Red');
});
他想让“亚历克斯·托马斯”的突出显示部分变成红色,而不是整个部分。
2021-05-03 15:29:56