如何删除ContentEditable中的H1格式(wysiwyg)
除了使用撤消,我不认为有一种方法可以删除内容中的h1和h2标签可编辑。 预期的行为是再次点击H1按钮应该关闭它,但它不。 还有一个“删除格式”按钮,但它只适用于粗体,斜体等项目。有没有办法通过JavaScript来做到这一点?
编辑:结果必须删除打开和关闭H1标记,而不是用其他任何东西替换它。
请看这里的简化测试用例:http://jsfiddle.net/kthornbloom/GSnbb/1/
<div id="editor" contenteditable="true">
<h1>This is a heading one</h1>
How can I remove the header styling if I want to?
</div>
我决定将我在我的评论中概述的方法实现为我的其他答案:遍历所选范围内的节点并删除特定节点(在这种情况下,基于标记名称)。
这是完整的演示。 它在IE <= 8(它缺少DOM范围和选择支持)时不起作用,但会适用于其他主流浏览器。 一个问题是选择并不总是被保留下来,但这并不难实现。
http://jsfiddle.net/gF3sa/1/
这个例子包括来自SO其他地方的修改后的范围遍历代码。
function nextNode(node) {
if (node.hasChildNodes()) {
return node.firstChild;
} else {
while (node && !node.nextSibling) {
node = node.parentNode;
}
if (!node) {
return null;
}
return node.nextSibling;
}
}
function getRangeSelectedNodes(range, includePartiallySelectedContainers) {
var node = range.startContainer;
var endNode = range.endContainer;
var rangeNodes = [];
// Special case for a range that is contained within a single node
if (node == endNode) {
rangeNodes = [node];
} else {
// Iterate nodes until we hit the end container
while (node && node != endNode) {
rangeNodes.push( node = nextNode(node) );
}
// Add partially selected nodes at the start of the range
node = range.startContainer;
while (node && node != range.commonAncestorContainer) {
rangeNodes.unshift(node);
node = node.parentNode;
}
}
// Add ancestors of the range container, if required
if (includePartiallySelectedContainers) {
node = range.commonAncestorContainer;
while (node) {
rangeNodes.push(node);
node = node.parentNode;
}
}
return rangeNodes;
}
function getSelectedNodes() {
var nodes = [];
if (window.getSelection) {
var sel = window.getSelection();
for (var i = 0, len = sel.rangeCount; i < len; ++i) {
nodes.push.apply(nodes, getRangeSelectedNodes(sel.getRangeAt(i), true));
}
}
return nodes;
}
function replaceWithOwnChildren(el) {
var parent = el.parentNode;
while (el.hasChildNodes()) {
parent.insertBefore(el.firstChild, el);
}
parent.removeChild(el);
}
function removeSelectedElements(tagNames) {
var tagNamesArray = tagNames.toLowerCase().split(",");
getSelectedNodes().forEach(function(node) {
if (node.nodeType == 1 &&
tagNamesArray.indexOf(node.tagName.toLowerCase()) > -1) {
// Remove the node and replace it with its children
replaceWithOwnChildren(node);
}
});
}
removeSelectedElements("h1,h2,h3,h4,h5,h6");
这可能不完全符合您的需求,但您可以通过使用FormatBlock
命令并传入“div”或“pre”作为最终参数来完成此操作:
document.execCommand('formatBlock', false, 'p');
演示:http://jsfiddle.net/GSnbb/2/ [jsFiddle已被删除]
编辑 :是的,这并没有回答现在的问题。 但是,它会在编辑之前对有关不替换<h1>
元素的问题进行编辑,并且是原始问题的合理答案。
这是可行的与JavaScript,逻辑如下:
从选定的文本中删除所有<h1>
和</h1>
s = s.replace(/<h1>/g, '');
s = s.replace(/</h1>/g,'');
插入更正后的文本以代替原来的文本
我已经草拟了一个基于JSFiddle的解决方案,但它需要一些调整。
作品 :从Gecko和基于webKit的浏览器上的选定文本中删除<h1>
和</h1>
未开发 :IE支持 - 参考 jsfiddle中的链接应该不难
破碎 :
<h1>
和</h1>
) - 易于修复 <h1>
时 - 您需要多选择一些选项和范围来排序。 PS你有没有考虑过使用现有的文本编辑器插件,而不是自己创建它?
链接地址: http://www.djcxy.com/p/41637.html上一篇: How to remove H1 formatting within ContentEditable (wysiwyg)