Document.body.innerHTML.replace不能使用变量正则字符串
Document.body.innerHTML.replace not working with variable regex string
下面的代码应该通过使用前一个标题标签的href链接替换wikipedia页面上特定标题标签文本的每个实例来工作。然而,似乎没有任何东西可以取代任何东西。当用硬编码的值测试这段代码时,它工作得非常好。控制台日志显示一切都应该正常工作,但事实并非如此。任何帮助都会很感激。
if (document.title.indexOf("Wikipedia") != -1) {
var pageHTML = document.body.innerHTML;
for(var i = 0, l=document.links.length; i<l; i++) {
//doSomething(document.links[i].href);
var link = document.links[i].href;
var title = document.links[i].title;
if(title != ""){
var a = document.createElement('a');
var linkText = document.createTextNode(title);
a.appendChild(linkText);
a.title = title;
a.href = link;
console.log(typeof title)
pageHTML = document.body.innerHTML.replace(new RegExp(title,"g"), a);
}
}
//var finalHTML = "<h1>HELLO<h1>"
//Appending to DOM
document.open();
document.write(pageHTML);
document.close();
}
除了每次迭代用单个值覆盖pageHTML
之外,目前您可以替换整个页面HTML并破坏其javascript事件,例如单击/悬停处理程序和许多其他通过addEventListener或.on
属性附加的事件。此外,您将覆盖整个页面,从而迫使浏览器完全解析它并重新绘制。
正确的方法是只替换包含标题文本的节点:
// title-to-href map used for bulk regexp-replacement
var linkMap = {};
var linkTitles = [];
for (var i = 0, link; (link = document.links[i++]); ) {
if (link.title) {
linkTitles.push(escapeForRegex(link.title));
linkMap[link.title] = link.href;
}
}
// regexp that matches all titles
var titlesRx = new RegExp(linkTitles.join('|'), 'g');
// iterate all text nodes and build a list of elements that contain titles
var nodesToReplace = [];
var walker = document.createTreeWalker(document.body, NodeFilter.SHOW_TEXT);
while (walker.nextNode()) {
var node = walker.currentNode;
var newHTML = node.nodeValue.replace(titlesRx, function(title) {
return '<a href="' + linkMap[title] + '" title="' + title + '">' + title + '</a>';
});
if (newHTML != node.nodeValue) {
nodesToReplace.push({node: node, html: newHTML});
}
}
// replace the contents of affected elements
var scratchpad = document.createElement('div');
nodesToReplace.forEach(function(info) {
scratchpad.innerHTML = info.html;
for (var i = 0, child; (child = scratchpad.children[i++]); ) {
info.node.parentNode.insertBefore(child, info.node);
}
info.node.remove();
});
function escapeForRegex(s) { return s.replace(/[{}()'[']'/''.+?^$:=*!|]/g, "''$&"); }
也许你错过了这个:-
pageHTML = document.body.innerHTML.replace(new RegExp(title,"igm"), a);
如果您的意思是将title属性的值替换为父链接的href属性的值,则此解决方案肯定有效
pageHTML = document.body.innerHTML.replace(title, link);
相关文章:
- 使用JSON文件中的变量(字符串)填充文本区域
- 如何向变量字符串添加更多值
- jquery将变量字符串作为ID's
- 如何用HTML和相应的引号形成变量字符串
- PHP 反序列化 JS 序列化的变量字符串
- Javascript 不传递整个变量字符串
- 带有变量字符串的索引
- 如何将表单类值合并到新的变量字符串中
- 在 JavaScript 中将变量字符串括起来
- jQuery:用变量字符串替换(连接的)按钮值
- "[对象对象]”;在警报提示中使用时替换变量字符串
- 通过变量字符串定义对象
- 无法在Javascript中连接字符串+变量+字符串
- Fancybox-是否可以使用javascript变量字符串作为HTML内容
- 从变量字符串应用条件
- 如何在pug中插入变量字符串
- Javascript -在变量字符串中捕获名称
- 不能把变量(字符串)在javascript innerhtml
- 用变量字符串调用React类
- 使用 Browserify/Babel/node.js您是否需要一个基于变量字符串的文件