- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想用 TreeWalker 在文本节点中插入 html 标签,但 TreeWalker 强制我的 html 括号进入 & lt; >不管我试过什么。这是代码:
var text;
var tree = document.createTreeWalker(document.body,NodeFilter.SHOW_TEXT);
while (tree.nextNode()) {
text = tree.currentNode.nodeValue;
text = text.replace(/(\W)(\w+)/g, '$1<element onmouseover="sendWord(\'$2\')">$2</element>');
text = text.replace(/^(\w+)/, '<element onmouseover="sendWord(\'$1\')">$1</element>');
tree.currentNode.nodeValue = text;
}
使用\< 或 "而不是 ' 不会有帮助。我的解决方法是将所有 DOM 树复制到一个字符串并用它替换 html 正文。它适用于非常简单的网页并解决了我的第一个问题,但这是一个糟糕的 hack,除了一个微不足道的页面之外什么都不会起作用。我想知道我是否可以直接使用文本节点而不是使用解决方法。这是(当前有问题的)解决方法的代码:
var text;
var newHTML = "";
var tree = document.createTreeWalker(document.body);
while (tree.nextNode()) {
text = tree.currentNode.nodeValue;
if (tree.currentNode.nodeType == 3){
text = text.replace(/(\W)(\w+)/g, '$1<element onmouseover="sendWord(\'$2\')">$2</element>');
text = text.replace(/^(\w+)/, '<element onmouseover="sendWord(\'$1\')">$1</element>');
}
newHTML += text
}
document.body.innerHTML = newHTML;
编辑:我意识到更好的解决方法是自定义标记文本节点((Customtag_Start_Here)等),将整个 DOM 复制到一个字符串,然后使用我的自定义标记来识别文本节点并以这种方式修改它们。但如果我不必这样做,我宁愿不这样做。
最佳答案
要将文本节点“更改”为元素,您必须 replace it with an element .例如:
var text = tree.currentNode;
var el = document.createElement('foo');
el.setAttribute('bar','yes');
text.parentNode.replaceChild( el, text );
如果你想保留部分文本节点,并在“中间”插入一个元素,你需要create another text node和 insert it并将元素放入树中适当的位置。
编辑:这是一个可能对您非常有用的功能。 :)
给定一个文本节点,它在文本值上运行一个正则表达式。对于它发现的每个命中,它都会调用您提供的自定义函数。如果该函数返回一个字符串,则匹配被替换。但是,如果该函数返回如下对象:
{ name:"element", attrs{onmouseover:"sendWord('foo')"}, content:"foo" }
然后它将围绕匹配项拆分文本节点并在该位置注入(inject)一个元素。您还可以返回一个字符串数组或那些对象(并且可以递归地使用数组、字符串或对象作为 content
属性)。
function textNodeReplace(node,regex,handler) {
var mom=node.parentNode, nxt=node.nextSibling,
doc=node.ownerDocument, hits;
if (regex.global) {
while(node && (hits=regex.exec(node.nodeValue))){
regex.lastIndex = 0;
node=handleResult( node, hits, handler.apply(this,hits) );
}
} else if (hits=regex.exec(node.nodeValue))
handleResult( node, hits, handler.apply(this,hits) );
function handleResult(node,hits,results){
var orig = node.nodeValue;
node.nodeValue = orig.slice(0,hits.index);
[].concat(create(mom,results)).forEach(function(n){
mom.insertBefore(n,nxt);
});
var rest = orig.slice(hits.index+hits[0].length);
return rest && mom.insertBefore(doc.createTextNode(rest),nxt);
}
function create(el,o){
if (o.map) return o.map(function(v){ return create(el,v) });
else if (typeof o==='object') {
var e = doc.createElementNS(o.namespaceURI || el.namespaceURI,o.name);
if (o.attrs) for (var a in o.attrs) e.setAttribute(a,o.attrs[a]);
if (o.content) [].concat(create(e,o.content)).forEach(e.appendChild,e);
return e;
} else return doc.createTextNode(o+"");
}
}
它不是完全通用的,因为它不支持属性上的命名空间。但希望这足以让你继续前进。 :)
你会像这样使用它:
findAllTextNodes(document.body).forEach(function(textNode){
replaceTextNode( textNode, /\b\w+/g, function(match){
return {
name:'element',
attrs:{onmouseover:"sendWord('"+match[0]+"')"},
content:match[0]
};
});
});
function findAllTextNodes(node){
var walker = node.ownerDocument.createTreeWalker(node,NodeFilter.SHOW_TEXT);
var textNodes = [];
while (walker.nextNode())
if (walker.currentNode.parentNode.tagName!='SCRIPT')
textNodes.push(walker.currentNode);
return textNodes;
}
或者如果您想要更接近原始正则表达式的内容:
replaceTextNode( textNode, /(^|\W)(\w+)/g, function(match){
return [
match[1], // might be an empty string
{
name:'element',
attrs:{onmouseover:"sendWord('"+match[2]+"')"},
content:match[2]
}
];
});
关于javascript - 用元素替换 TextNode 中间的文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22129405/
如果你写下面的代码: const e = document.body.firstChild; if (e.nodeType === Node.TEXT_NODE) console.log(e.
假设我有以下... Some text 当我的鼠标经过 Some , Some将返回并且与 text 相同. 如果不将每个节点放入它自己的元素中,这可能吗? 最佳答案 这几乎是不可能的。因为在 Jav
如果我在 HTML 文件中手动编写以下行: 将为每个新行创建一个文本节点。 我想了解 addEventListener 方法的 useCapture 参数。我选择使用 div 元素的 chil
我正在使用单选按钮制作一个简单的多项选择程序。当学生回答错误时,我可以在她的选择后面打一个X,但是如何将X变成红色呢?谢谢你的帮助,杰拉德 1756-1819 funct
我想用 TreeWalker 在文本节点中插入 html 标签,但 TreeWalker 强制我的 html 括号进入 & lt; >不管我试过什么。这是代码: var text; var tree
我想选择 div 元素内的文本并将其用 包裹起来标签。 标签应该只换行到 div 内的文本,而不是子元素内的文本,例如 本例中的标记。 Testing Some more text insi
与直接设置其 textContent 相比,创建 TextNode 并将其附加到 HTML 元素有什么优势? 假设我有一个跨度。 var span = document.getElementById(
我想选择 div 元素内的文本并将其用 包裹起来标签。 标签应该只换行到 div 内的文本,而不是子元素内的文本,例如 本例中的标签。 Testing Some more text insi
我想向文本节点添加一个元素。例如:我有一个在元素的文本节点中搜索字符串的函数。当我找到它时,我想用 HTML 元素替换它。有一些标准吗?谢谢。 最佳答案 您不能只替换字符串,您必须替换整个 TextN
假设我们有以下元素 Hello World .如果我想修改中的内容标签我在javascript代码中有两种方式: document.getElementById("abc").innerHTML="g
有没有办法得到所有textNode的集合文档中的对象? getElementsByTagName()非常适合 Elements,但是 textNode s 不是元素。 更新:我意识到这可以通过遍历 D
有什么方法可以在网络浏览器中更改 DOM textNode 的值吗? 我特别想看看我是否可以更改现有节点,而不是创建一个新节点。 澄清一下,我需要使用 Javascript 来完成此操作。浏览器中的所
我在javascript中插入了几个textNode,但不知道如何用回车符分隔它们。我尝试过输入“\n”、“\r”和“ ”,但它们都不起作用 var textNode = document.creat
我的 HTML 代码: Firebrand will tend to burn any bricks out there. so the best idea is to ignore any acti
我正在使用 HtmlAgilityPack 抓取一些网站。问题是它似乎坚持在大多数地方插入 TextNode,这些地方要么是空的,要么只包含大量的\n、空格和\r。 当我计算 childnodes 时
我有一个这样的 HTML 结构: Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor inci
Fiddle here fiddle 的基本解释:当有人开始在单元格中输入内容,然后按 Tab 键移开或取消焦点时,它会在其上方创建一个新行,清空底行,并将焦点移至该新行中的“下一个”输入元素排。它不
One Two Three Four var text = $(".list").contents().filter(function() { return this.nodeType == 3;
这个: import React from "react"; import { render } from "react-dom"; let $container; render( ($cont
对于这个 HTML 节点: foo and bar go ### with baz 我想替换字符串 ###与另一个节点( well ),而不替换整个 innerHTML wrapper div . 预
我是一名优秀的程序员,十分优秀!