我想用我正在製作的一個chrome擴展進行解析,並用另一個單詞替換任何一個單詞的實例。這就是我不工作對我來說用Javascript替換dom中每個單詞的實例
function jamify() {
$("body").html().replace(/James/g,"Jamie");
}
我想用我正在製作的一個chrome擴展進行解析,並用另一個單詞替換任何一個單詞的實例。這就是我不工作對我來說用Javascript替換dom中每個單詞的實例
function jamify() {
$("body").html().replace(/James/g,"Jamie");
}
.html()
的快速和相當髒的替代有幾個缺點。
更好的方法是隻替換實際文本節點中的字符串,因爲jQuery不是(當前)問題上的標籤,我認爲香草javascript是一個合適的選項。
var walker = document.createTreeWalker(
document.body,
NodeFilter.SHOW_TEXT, {
acceptNode: function(node) {
return NodeFilter.FILTER_ACCEPT;
}
},
false
);
while (walker.nextNode()) {
walker.currentNode.data = walker.currentNode.data.replace(/James/g, 'Jamie');
}
<!-- James -->
<div data-name="James" class="James">
James
</div>
這個例子將僅觸摸實際的文本元素(一個或多個),註釋和兩個屬性(data-name
和class
)將不會被替換,所以它仍然是安全的,有javascript和/或css指這些。
這應該是接受的答案,並清楚地解釋了原因。好答案 – happymacarts
我展示它這種方式來表明你必須調用一些功能的HTML重置爲新更換的字符串
注意:這將消滅你已經連接了任何DOM事件之前替換
你可以通過嵌套調用縮短各成一體這一點,如果你想
function jamify() {
var str = $(".test").html();
console.log('jamify', str);
str2 = str.replace(/James/g,"Jamie");
$(".test").html(str2);
//to simplify it could be done this way too
//$(".test").html($(".test").html().replace(/James/g,"Jamie"))
}
$(document).ready(function(){
//alert('ready');
$('.inner').click(function(){console.log('inner click')})
//Yea!, my click event is all good.
jamify();
//Now all your inner click EVENT is broken so this is not good
//solution if there are any events attached in your DOM
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="test">
<p>James is here</p>
<div class="inner">this div is James</div>
</div>
對不起,其他人我正在工作的片段,並沒有看到解決方案張貼在評論 – happymacarts
如果字是在的textContent你可以嘗試:
var all = document.querySelectorAll('.test')
//using .test as a wrapper section, try using body in production as selector (in the snippets it breaks)
all.forEach(x => x.textContent = x.textContent.replace(/James/gi, "Jamie"))
// keep in mind forEach for nodes has limited support, tested in chrome
<div class="test">
<p>James is here</p>
<div >this div is James</div>
</div>
試試這個:'$( 「身體」)HTML($( 「身體」)HTML() .replace(/ James/g,「傑米」));' –
@ChrisG Drat,你打我吧...替換不會替換到位... – ppeterka
@ChrisG請記住,雖然這是做他所問的因爲,它會打破很多其他的東西。在這個網站上運行代碼,所見即所得的編輯器獲得第二個工具欄。所有事件監聽器也將中斷。身體中的所有腳本都會被重新執行。 –