var str='测试:';'; str=str.replace(/';/g,“”);
-
2 是的,可能有一种方法可以做到这一点,但最简单的方法是从页面中删除所有事件处理程序和元素数据。 $(“body”).html($(body).html().replace(/\€/g,'$')) 这是一种糟糕的做法。 – 凯文·B 评论 2013年9月5日18:49 -
2 如果您想避免丢失事件和元素数据,那么它会变得更加复杂。 – 凯文·B 评论 2013年9月5日18:50 -
1 谢谢@KevinB——我想进一步充实一下。 我只是好奇。 我可以补充什么来更具体一些? – 丹中尉 评论 2013年9月5日19:01 -
2 最好是在服务器端进行,但如果这不是一个选项,那么客户端需要选择文档中的所有文本节点,对其进行迭代,然后分别在每个文本节点上执行替换。 – 凯文·B 评论 2013年9月5日19:05 -
1 这是一个使用我不久前写的插件突出显示文本的示例。 jsfiddle.net/2t8TV/1 我用它来包装所有出现的 € 使用span,然后我替换了这些span中的文本。 – 凯文B 评论 2013年9月5日19:09
14答案
$(“body”).children().each(函数(){ $(this).html($(this).html().replace(/@@/g,“$”)); });
ECMAScript 2015+方法
解决此任务时的陷阱
只需替换整个HTML(例如,使用 内部HTML )导致的受影响子树 DOM公司 完全删除和替换,但事件侦听器附加到 现有,现已删除 元素,因此它们将与它们一起删除。 同样, WeakMap(弱点地图) 现有元素的条目都将被删除。这是因为所有这些内容都需要 参考文献 元素或节点; a已更换 内部HTML 将创建全新的引用并丢弃旧的引用。 替换HTML也可能会替换 <脚本> 或 <样式> 内容或HTML标记或属性名称,这并不总是需要的。 更改HTML可能会导致 xss公司 攻击。 您可能需要替换属性值,例如 标题 和 中高音 , 以可控的方式 还有,但这些全有或全无的方法以及 正则表达式 没有能力这样做。
替换所有元素的文本内容
constreplaceOnDocument=(模式,字符串,{target=document.body}={})=>{ //句柄`string`-见最后一节 [ 目标, …target.querySelectorAll(“*:not(script):not(noscript):not(style)”) ].forEach(({childNodes:[…nodes]})=>个节点 .filter(({nodeType})=>nodeType===节点。 文本_代码) .forEach((textNode)=>textNode.textContent=textNode.textContent.replace(pattern,string)); }; 替换文档(/€/g,“$”);
替换文本节点、元素属性和属性
const replaceOnDocument=(()=>{ 常量替换={ [节点.TEXT_Node](节点、模式、字符串){ node.textContent=节点.textContent.replace(pattern,string); }, [Node.ELEMENT_Node](节点,模式,字符串,{attrs,属性}={}){ attrs.forEach((attr)=>{ if(节点类型[attr]!==“函数”&&node.hasAttribute(attr)){ node.setAttribute(attr,node.getAttribute(attr).replace(pattern,string)); } }); props.forEach((prop)=>{ if(节点类型[prop]===“字符串”&&node.hasAttribute(prop)){ node[prop]=节点[prop].replace(pattern,string); } }); } }; return(pattern,string,{target=document.body,attrs:[…attrs]=[],props:[…props]=[]}={})=>{ //句柄`string`-见最后一节 [ 目标, ...[ 目标, …target.querySelectorAll(“*:not(script):not(noscript):not(style)”) ].flatMap(({childNodes:[…nodes]})=>个节点) ].filter(({nodeType})=>replacer.hasOwnProperty(nodeType)) .forEach((node)=>replacer[node.nodeType](节点、模式、字符串、{ 属性, 道具 })); }; })(); 替换文档(/€/g,“$”{ 属性:[ “标题”, “alt”, “onerror”//这将被忽略 ], 道具:[ “value”//更改`<input>`的`value`属性不会更改其当前值,因此需要在此处访问该属性 ] });
替换为HTML实体
string=new DOMParser().parseFromString(string,“text/html”).documentElement.textContent;
-
1 本身看起来很棒,但我需要用插入软连字符的相同单词替换单词。 这是因为CSS连字符功能在某些荷兰语单词上出现了错误。 然后,您的函数使浏览器呈现: 低调(&S); 雷姆 和 ip­; 总和 (拉丁语示例)。 你不会碰巧知道如何解决这个问题,是吗? 评论 2018年6月26日11:39 -
2 谢谢! 你已经让我走上了正确的轨道 内部HTML 。我正在研究另一种方法,将两者兼而有之。 因此,我们可以看到哪一个是下一个web开发人员最快、最容易维护的。正如阿诺德过去常说的那样:我会回来的。;-) 评论 2018年6月26日12:52 -
2 Hier bin ich wieder先生。 实际上,我真的不知道如何测试脚本的速度。 我可以想象一些事情,但仅此而已。然而,我确实想出了一个简单的分叉脚本,可以用其他普通单词替换,并可以插入HTML实体。 请参见 jsfiddle.net/FrankConijn/t1e0k2fx/4 。将中央滚动条移至右侧,缩小输出字段,然后看到单词“medewer kerstevredenheidsonderzoek”被连字符连接。 评论 2018年6月26日20:12 -
1 -
2 @FrankConijn看 是否可以附加到 内部HTML 而不破坏后代的事件侦听器? 基本上, body.childrens[someChild].addEventListener(someEvent,someListener); 然后 body.innerHTML+=一些附加内容; 或 body.innerHTML=someNewContent; 序列化并重新传递整个HTML,清除任何以前绑定的事件侦听器。 这就是为什么在我的方法中,我会小心地替换单个文本节点的内容。 – 塞巴斯蒂安·西蒙 评论 2018年6月26日21:00
函数nativeSelector(){ var elements=document.querySelectorAll(“body,body*”); var结果=[]; var子项; for(var i=0;i<元素长度;i++){ child=元素[i].childNodes[0]; if(elements[i].hasChildNodes()&&child.nodeType==3){ 结果:push(child); } } 回报结果; } var textnodes=nativeSelector(), _nv; for(var i=0,len=textnodes.length;i<len;i++){ _nv=textnodes[i].nodeValue; textnodes[i].nodeValue=_nv.replace(/英镑/g,‘€’); }
button.addEventListener('单击',e=>{ const treeWalker=document.createTreeWalker(document.body,NodeFilter.SHOW_TEXT); while(treeWalker.nextNode()){ const节点=treeWalker.currentNode; node.textContent=节点.textContent.replace(/@/g,'$'); } })
<div>这是一个我们正在替换的@</ div(分频)> <div>这是我们正在替换的另一个@</ div(分频)> <div> <span>这是@div中span中的@</span> </div> <br> <input id=“button”type=“button“value=”将@替换为$“/>
<div id=“mydiv”> <!-- 您在此处翻页--> </div>
var html=document.getElementById('mydiv').innerHTML; html=html.replace(/this/g,“that”); document.getElementById('mydiv').innerHTML=html;
document.body.innerText=文档.body.innerText.replace('actualword','replacementword');
-
4 -
1 -
2 @FrankConijn实际上您必须设置innerText,这在答案中没有显示。 document.body.innerText=文档.body.innerText.replace('actualword','replacementword') ... – 授予 评论 2018年11月27日23:12
document.body.innerHTML=document.body.innerHTML.replacement(/Ooriginal/g,“新建”)
(函数($){ $.fn.highlightText=函数(){ //处理程序第一个参数 //第一个参数是regexp吗? var re,无功功率, h类, 要求, argType=$.type(参数[0]), 默认标记名=$.fn.highlightText.defaultTagName; if(argType===“regexp”){ //第一个参数是正则表达式 re=参数[0]; } //第一个参数是数组吗? else if(argType===“数组”){ //第一个参数是数组,生成 //供以后使用的正则表达式字符串 reStr=参数[0].join(“|”); } //第一个参数是字符串吗? else if(argType===“string”){ //将字符串存储在正则表达式字符串中 //供以后使用 reStr=参数[0]; } //否则,返回后什么也不做,因为 //参数是必需的。 其他{ 回报; } //然而,第二个参数是可选的, //它必须是字符串或布尔值。 如果是的话 //字符串,它将用作突出显示类。 //如果它是一个布尔值并且等于true,则 //将用作第三个参数和突出显示 //类将默认为“高亮显示”。 如果未定义, //highlight类将默认为“highlights”,并且 //第三个参数将默认为false,允许 //用于匹配部分匹配的插件。 //**如果第一个参数是正则参数,则例外 //表达式,第三个参数将被忽略。 argType=$.type(参数[1]); if(argType===“字符串”){ hClass=参数[1]; } else if(argType===“boolean”){ hClass=“highlight”; if(要求){ reStr=“\\b”+reStr+“\\b“; } } 其他{ hClass=“highlight”; } if(参数[2]和reStr){ reStr=reStr=“\\b”+reStr+“\\b“; } //如果未定义re(这意味着数组或 //字符串作为第一个参数传递)创建 //正则表达式。 如果(!re){ re=新RegExp(“(”+reStr+“)”,“ig”); } //迭代每个匹配的元素 return this.each(function(){ //选择此元素的所有内容 $(this).find(“*”).andSelf().contents() //只筛选到尚未突出显示的文本节点 .filter(函数(){ return this.nodeType===3&&$(this).最近(“.”+hClass).长度===0; }) //循环通过每个文本节点 .each(函数(){ 无功输出; 输出=this.nodeValue .replace(re,“<”+defaultTagName+“class='”+hClass+“'>$1”); if(输出!==this.nodeValue){ $(this).wrap(“<p></p>”).parent() .html(输出).contents().unwrap(); } }); }); }; $.fn.highlightText.defaultTagName=“span”; })(jQuery); $(“正文”).highlightText(“€”,“货币符号”); $(“span.currency-symbol”).text(“$”);
$(“#idBut”)点击(function(){ $(“body”).children().each(function(){ $(this).html($(this).html().split('@').jjoin(“$”)); }); });
-
1 -
2
str.replace(/text/g,“替换文本”);
-
1 -
1 你说得对,我都不知道。 但在这种情况下,这应该有助于: stackoverflow.com/questions/13574980/… 评论 2013年9月5日19:03
$(“p”).replaceText(“£”,“$”)
人口过剩</a>
<a href=“/i-am/123/a/人口过剩”><span class=“overpop”>人口过剩</span></a>
$(“*:containsIN(‘过多’)”).filter( 函数(){ return$(this).find(“*:包含('”+str+“')”).length==0 } ).html(函数(_,html){ if(html!=“未定义”){ return html.replace(/(overplopulation)/gi,'<span class=“overpop”>$1</span>'); } });
$.extend($.expr[“:”]{ “containsIN”:函数(elem,i,match,array){ return(elem.textContent||elem.innerText||“”).toLowerCase().indexOf((match[3]||““”).toLowerCase())>=0; } });