在单击Javascript时替换网页中字符串的所有实例
Replace all instance of a string in a webpage on click Javascript
好的,所以我正在制作一个Chrome扩展,我想要它,以便扩展有2个按钮,一个打开扩展,一个关闭它。而扩展正在运行,我希望它取代"ab"到"ef"的网页上的所有实例(只是一个例子)。这意味着,在用户点击后,扩展将始终转换"ab"到"ef"上的每个网页,而不必每次打开它。我是通过Javascript来做到这一点的。这是我的代码(HTML和Javascript),请看看你能做什么!
JSFiddle: https://jsfiddle.net/syf5f687/
HTML:<!doctype html>
<html>
<head>
<title>AB to EF</title>
<script src="popup.js"></script>
</head>
<body>
<h1>AB to EF Converter</h1>
<button id="turnOn">Turn On</button>
<button id="turnOff">Turn Off</button>
</body>
</html>
JS(我认为这是完全错误的,我甚至没有把关闭按钮):
var markup = document.documentElement.innerHTML;
document.addEventListener('DOMContentLoaded', function() {
var checkPageButton = document.getElementById('turnOn');
checkPageButton.addEventListener('clickOn', function() {
chrome.tabs.getSelected(null, function(tab) {
markup.replace(/ab/, "ef")
});
}, false);
}, false);
我建议不要替换html。首先,您可能会意外地更改元素标签名称,其次,替换html将使整个文档不得不重新解析和重新呈现,因为您正在引入一组新的html代码。
我建议遍历文本节点并替换textContent
属性。
你可以通过使用TreeWalker api来实现。创建一个树行走器,createTreeWalker()
通过NodeFilter.SHOW_TEXT
,只选择文本节点,然后在每个节点上替换textContent
。
var element = null;
var walker = document.createTreeWalker(document.body,NodeFilter.SHOW_TEXT,null,false);
while(element=walker.nextNode()){
element.textContent = element.textContent.replace(/ab/g,"ef");
}
注意,这将改变脚本和样式标签中的文本节点,所以如果你不想这样做,你可以添加一个过滤器作为第三个参数来跳过它们。
演示function changeIt() {
var element = null;
var walker = document.createTreeWalker(document.body, NodeFilter.SHOW_TEXT, null, false);
while (element = walker.nextNode()) {
element.textContent = element.textContent.replace(/ab/g, "ef");
}
}
document.querySelector("button").addEventListener("click",changeIt);
div {
padding:5px;
border:1px solid rgba(0,0,0,0.3);
}
<button>Change text</button>
<div>
able, dabble, fabble, crabble
<span>mable, cable, fable</span>
</div>
<div>
able, dabble, fabble, crabble
<span>mable, cable, fable</span>
</div>
<div>
able, dabble, fabble, crabble
<span>mable, cable, fable</span>
<div>
able, dabble, fabble, crabble
<span>mable, cable, fable</span>
<div>
able, dabble, fabble, crabble
<span>mable, cable, fable</span>
</div>
</div>
</div>
相关文章:
- 删除数组Javascript中字符串的所有实例
- 如何通过JS在不干扰其标记的情况下更改HTML文档中字符串的所有实例
- 是否有将基于字符串的JSON转换为Mongoose Schema对象实例的本地功能
- JavaScript:计算字符串中特定整数的实例
- 从 Node.js 模块中的缓冲区实例中逐行读取字符串
- 正则表达式来更改字符串中的所有实例
- javascript正则表达式,将多个实例替换为多行字符串中的单个实例
- 如何更改字符串/符号的所有实例的样式
- 替换字符串中YouTube/Vimeo iframe的所有实例
- 字符串是对象 String() 的实例吗?
- 我们如何在 javascript 对象中使用字符串名称存储创建 Backbone 视图的实例
- 如何匹配并返回一个字符串的多个实例,其中单个撇号可以包含在任何索引中
- Jquery:在一个字符串中查找所有实例模式,提示用户替换模式的所有实例,然后进行替换
- Ember.js:使用模型实例的路由获取模型实例的 url 字符串
- 如何在 JavaScript 中替换字符串中“+”的多个实例
- 查找字符串中单词所有实例的位置,在控制台中得到不需要的重复
- 正则表达式 Express 将反斜杠 的每个实例替换为字符串中的 u
- 按第三个实例拆分字符串
- Javascript向字符串实例添加方法
- 无法从JSON字符串实例化类型的值;没有单字符串构造函数/工厂方法