- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我需要使用 JavaScript 重新格式化输入 HTML,以便生成的输出 HTML 始终是 <p>
的序列包含仅一个或多个<span>
的节点节点和每个 <span>
节点应该包含恰好一个 #text
节点。
举个例子,我想转换如下所示的 HTML:
<p style="color:red">This is line #1</p>
<p style="color:blue"><span style="color:yellow"><span style="color:red">This is</span> line #2</span></p>
<p style="color:blue"><span style="color:yellow"><span style="color:green">This is line #3</span></span>
<p style="color:blue"><span style="color:yellow">This is</span><span style="color:red">line #4</span></span></p>
HTML 看起来像这样:
<p style="color:red"><span style="color:red">This is line #1</span></p>
<p style="color:red"><span style="color:red">This is</span><span style="color:yellow"> line #2</span></p>
<p style="color:green"><span style="color:red">This is line #3</span>
<p style="color:yellow"><span style="color:yellow">This is</span><span style="color:red">line #4</span></span></p>
额外的,有点离题的信息:
wkhtmltopdf
如果 HTMl 变得过于复杂且嵌套跨度导致在 TinyMCE 中编辑不直观,则会出现行高问题)window
但不直接在本文档中。我自己能够将 jQuery 代码重新格式化为纯 JavaScript,但实际上无法在此实例中使用 jQuery :-(
我还在玩的额外的、半途而废的非功能性代码,以减少反对票:
function reformatChildNodes(node) {
var n,l,parent;
if(node.nodeName.toLowerCase() == 'p') {
// We are on a root <p> node, make that it has at least one child span node:
if(!node.childNodes.length) {
var newSpan = document.createElement('span');
/* set style on newSpan here */
node.appendChild(newSpan);
}
if(node.childNodes[0].nodeName.toLowerCase() != 'span') {
// First child of the <p> node is not a span, so wrap it in one:
var newSpan = document.createElement('span');
/* set style on newSpan here */
newSpan.appendChild(node.childNodes[0]);
node.appendChild(newSpan);
}
// Now repeat for each child node of the <p> and make sure they are all <span> nodes:
for(n=0;n<node.childNodes.length;++n)
reformatChildNodes(node.childNodes[n]);
} else if(node.nodeName.toLowerCase() == 'span') {
// We are on a <span> node, make that it has only a single #text node
if(!node.childNodes.length) {
// This span has no children! it should be removed...
} else if(node.parentNode.nodeName.toLowerCase() != 'p') {
// We have a <span> that's not a direct child of a <p>, so we need to reformat it:
node.parentNode.parentNode.insertBefore(node, parent);
} else {
for(n=0;n<node.childNodes.length;++n)
reformatChildNodes(node.childNodes[n]);
}
} else if(node.nodeName.toLowerCase() == 'div') {
// This is justa dirty hack for this example, my app calls reformatChildNodes on all nodes
for(n=0;n<node.childNodes.length;++n)
reformatChildNodes(node.childNodes[n]);
}
}
最佳答案
此解决方案遍历跨度,展开它们(在必要时),然后继续处理刚刚展开的元素,以便它处理所有这些元素。左边只有带有文本节点子节点的顶级跨度。
function wrap(text, color) {
var span = document.createElement("span");
span.style.color = color;
span.appendChild(text);
return span;
}
function format(p) {
for (var cur = p.firstChild; cur != null; cur = next) {
var next = cur.nextSibling;
if (cur.nodeType == 3) {
// top-level text nodes are wrapped in spans
next = p.insertBefore(wrap(cur, p.style.color), next);
} else {
if (cur.childNodes.length == 1 && cur.firstChild.nodeType == 3)
continue;
// top-level spans are unwrapped…
while (cur.firstChild) {
if (cur.firstChild.nodeType == 1)
// with nested spans becoming unnested
p.insertBefore(cur.firstChild, next);
else
// and child text nodes becoming wrapped again
p.insertBefore(wrap(cur.firstChild, cur.style.color), next);
}
// now empty span is removed
next = cur.nextSibling;
p.removeChild(cur);
}
}
p.style.color = p.firstChild.style.color;
}
关于javascript - 使用 JavaScript 展平 DOM 中的嵌套跨度以优化 HTML 编辑器输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18904675/
这就是我现在正在做的事情。我在设计中使用 LESS CSS。我需要在指定输入之间放置 2 个跨度。所有元素的宽度都应为 100%。跨度应始终为 20px 宽度输入宽度可以根据屏幕宽度进行更改。谁能帮帮
我有一个包含文本和输入字段的跨度。我想知道是否可以让文本左对齐,输入字段右对齐。 NAME: .textBox{ display:inline-block; width:450px
我有这个按钮,我想让它在我点击“选择”时调用方法,在我点击“更改”时调用另一个方法: Select Change 我尝试输入 (click)="method()",但没有成功。我很
我正在开发聊天应用程序 (cordova),当我要在无法输入的表情符号后输入文本时,我在这段代码中遇到了问题 https://output.jsbin.com/radaref This i
很抱歉,如果这是一个非常愚蠢的问题,但我是一名开发人员,目前我的设计技能很少,我在个人网站上工作并且遇到了一个小问题。 我有一个带 ul 的顶部导航和 li元素。这些元素包含链接 . 跨度仅在链接悬
fiddle :https://jsfiddle.net/burz4g8s/4/ 我的 HTML 包含多行双按钮对。服务器端应用程序在 JSP 循环中输出按钮,所以我无法控制各个按钮——我不能使用 d
TextView.setLetterSpacing允许设置字母间距/字符间距。 有没有对应的CharacterStyle / span class允许在 TextView? 中的文本子集上设置字母间距
如何使洋红色矩形比红色矩形短 6 倍? GridLayout { id: gridLayout anchors.fill: parent flo
我最近开始使用 Twitter Bootstrap,但我似乎无法理解 span 的作用以及为什么会有不同的编号 span,例如 span4、span12?什么是偏移量以及它们何时使用? (有时与跨度一
我正在尝试构建一个 jQuery 函数来计算跨度中的总数 var sumnormaltotal = 0; $('span[id^="normaloffertotalspan"]').each(func
我想知道haskell如何评估以下表达式。 span (`elem` ['A'..'Z']) "BOBsidneyMORGANeddy" 结果是 ("BOB","sidneyMORGANeddy")
我有三个词,我想在第一个空格之后的内容周围添加一个跨度,所以 hello world 变成: hello world 和: hello world again 变成: hello world agai
我正在寻找纯 CSS 解决以下问题的方法。 考虑以下 HTML: Some text Some text 两者都是 正在显示元素 inline-block .如何在第二个 的左侧
如何将 Span 放置在其容器的底部? 我目前拥有的:http://jsfiddle.net/wRbax/2/ 我希望 .box 始终位于 .td 的底部 CSS .td { vertical
我试图在 li 中 float 两个 span。左跨度将有我的标签,在右跨度内我将构建一个具有嵌套跨度的图形。我有基本结构,但 chrome 将数字放在左侧跨度的末尾。我该如何解决这个问题? HTML
我有一个像这样的 JavaScript 变量: var text = "A businessman should be able to manage his business matters"; 我想
一些内容可编辑的框与其他框重叠,因此并非所有框都是可编辑的。我想保留与跨度位置中心对齐的文本,如下所示。我如何实现这一点? span { margin: auto; text-alig
我正在使用 WYSIWYG (InnovaEditor) 来编辑我网站上的内容,它适用于 Chrome、IE,主要适用于 Firefox,但 FF 有一个稍微令人讨厌的问题。我将 span 标签插入到
这是我的 html: Settings Export Import 和CSS: span.button { float:right; margin-righ
这里是问题所在:http://jsfiddle.net/STG22/3/ 我希望 span 不会分成两个不同的行(就像上面示例中的第三行一样)。我该怎么做? CSS: span { backg
我是一名优秀的程序员,十分优秀!