javascript - 选择文本并为其添加标签

标签 javascript jquery

关于这个主题有很多问题,但我似乎找不到任何解决我的问题的方法,所以我决定提出我的问题。我的情况是我有一个下拉列表,其中包含多个选项和 iframe 内的文本区域。当用户在文本区域中选择某些文本并从下拉列表中选择一个选项时,所选文本将有一个 a 标签环绕,并且选项值将成为标签 href。这是我的代码:

   var optionTag       = document.getElementById("option-id");
   var optionValue     = optionTag.options[optionTag.selectedIndex].value;
   var iframe          = document.getElementById("my-frame");
   var iframeContent   = iframe.contentDocument.body.innerHTML.split("<br>")[0];

    //get user selected text
   var iframeSelection = iframe.contentWindow.getSelection().toString();

    // and wrap a tag around it then add href equal to value of option
    var aTag        = "<a href=\"" + optionValue + "\">" + iframeSelection +"</a>";

   // replace user selected text with new a tag
   iframe.contentDocument.body.innerHTML = iframeContent.replace(iframeSelection,aTag)

此代码有效,但它仅替换第一个单词(如果该单词已存在)。例如:

lorem ipsum click dolor sit amet click spum

如果用户选择第二个单词“单击”并选择一个选项,那么我的代码将仅替换第一个单词“单击”,如果我有多个单词“单击”,它仍然只替换第一个单词,但如果用户选择如果输入“ipsum”或“lorem”这个词,那么它就可以正常工作。我不知道如何解决这个问题,请帮忙。谢谢!

p/s: 我不想替换所有“点击”词,我只想替换用户选择的确切部分。

最佳答案

问题在于您的 replace() 调用中的 iframeSelection 是“单击”,而不是您之前选择的元素,因此它会替换第一次出现的元素。

相反,尝试获取您选择的范围,将其删除并将新元素附加到该范围。

var selection = iframe.contentWindow.getSelection();
range = selection.getRangeAt(0);
range.deleteContents();
range.insertNode(document.createElement(your_new_element)); 

如果没有您的 HTML,我无法进行测试,JSFiddle 会有所帮助。

关于javascript - 选择文本并为其添加标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32501639/

相关文章:

javascript - 删除 fullCalendar 中的所有事件源

jquery - Div 在向左/向右过渡时越过其他 div

javascript - 如何制作与 JS 库无关的选择器包装器?

javascript - 如何使用 javascript 创建卡住/非滚动窗口区域?

javascript - 以编程方式选择第 N 个选项

javascript - 检查浏览器空闲的替代方法

隐藏所选选项的Javascript

javascript - BlueImp Jquery 上传 - 从 data.files 获取索引

javascript - 如何将图像数组插入到 swipebox 画廊中?

javascript - react : Can't get correct width of element after render