【问题标题】:Javascript window.getSelection().focusNode.nodeValue return with HTMLJavascript window.getSelection().focusNode.nodeValue 返回 HTML
【发布时间】:2017-09-28 09:20:31
【问题描述】:

嘿...我真的不想使用其他人的编辑器...

我想学习“如何创建”而不是“如何使用”

所以我决定创建自己的编辑器...

My editor

它很容易创建 bbcode 编辑器... 但是当我尝试创建 HTML 版本(实时预览和编辑)

我有一个小问题(可能是我最大的问题) 当然提出问题是我搜索后的最后希望......

无论如何,我的英语很糟糕,所以我希望你能明白我在说什么。

看,我的期望 VS 真的

Expectation VS Really

这是我最简单的编辑器

$(document).ready(function(){
	$(".buttonBold").click(function(){
		$(".editableDiv").focus();
		var help_me_anchorNode 			= window.getSelection().anchorNode.nodeValue;
		var help_me_anchorOffset 		= window.getSelection().anchorOffset
		var help_me_focusOffset 		= window.getSelection().focusOffset
		var help_me_focusNodeValueLength 	= window.getSelection().focusNode.nodeValue.length;
		var help_me_firstTag 			= "<b>";
		var help_me_lastTag 			= "</b>";

		if(help_me_anchorOffset > help_me_focusOffset){
			var help_me_firstTag 		= "</b>";
			var help_me_lastTag 		= "<b>";
		}
		window.getSelection().anchorNode.nodeValue = help_me_anchorNode.slice(0, help_me_anchorOffset) + help_me_firstTag + help_me_anchorNode.slice(help_me_anchorOffset);
		var help_me_focusNodeValue = window.getSelection().focusNode.nodeValue;
		if(window.getSelection().focusNode.nodeValue.length - help_me_focusNodeValueLength > 0) {
			help_me_focusOffset += window.getSelection().focusNode.nodeValue.length - help_me_focusNodeValueLength;
		}
		window.getSelection().focusNode.nodeValue = help_me_focusNodeValue.slice(0, help_me_focusOffset) + help_me_lastTag + help_me_focusNodeValue.slice(help_me_focusOffset);
	});

});
.editableDiv{
	width: 300px;
	height: 100px;
	background: #ccc;
	padding: 10px;
	}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>

<button class="buttonBold">Bold</button>
<div class="editableDiv" contenteditable="true">
Double click this : HELPME
<br />
<br />
And then, click the "Bold" Button
<br />
The result will : &lt;b&gt;HELPME&lt;/b&gt;
<br />
Not : <b>HELPME</b>
</div>

【问题讨论】:

    标签: javascript jquery bbcode html-editor nodevalue


    【解决方案1】:

    您可以使用window.getSelection().surroundContents()

    $(".buttonBoldHtml").click(function(){
      $(".editableDiv").focus();
    
      var highlight = window.getSelection(),
          bold = $('<b/></b>')[0],
          range = highlight.getRangeAt(0);
      range.surroundContents(bold);
    });
    

    如果您选择部分节点(当突出显示的文本在打开标记之间开始或停止时),您必须使用extractContents()

    $(".buttonBoldHtml").click(function(){
      $(".editableDiv").focus();
    
      var range = window.getSelection().getRangeAt(0),
          bold = document.createElement('b');
      bold.appendChild(range.extractContents());
      range.insertNode(bold);
    });
    

    我已经编辑了演示并添加了一个粗体和斜体的测试:

    Demo

    【讨论】:

    • 未捕获的 DOMException:无法在“Range”上执行“surroundContents”:Range 已部分选择了非文本节点。选择多行 span>时
    • 哇......它的工作完美......但我仍然想知道......为什么你创建元素“span”......谢谢你的帮助^_^
    • 但我真的很抱歉...我的问题仍然没有解决...这就是为什么我使用 getSelection() & anchorOffset 而不是 exectCommand(); ....当我为 {VALUE} 之类的第二个属性创建弹出窗口时...输入 URL 时需要弹出窗口...当我单击弹出窗口时...焦点更改为弹出窗口...所以我需要检测所选文本和焦点偏移并用 $().html(""); 替换整个文本
    • @JackRose 这对我来说似乎是一个不同的问题,你应该验证这个并打开另一个问题
    • 对不起,我的错...我的问题在几个小时前就解决了...但焦点仍然有问题...感谢您的帮助@Nicolas R ^_^
    猜你喜欢
    • 2011-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-23
    相关资源
    最近更新 更多