Как исправить ошибку, цикл по замене слов на другие?
Всем привет. Пытаюсь реализовать замену слов на сайте на их перевод. Но почему то не меняет как надо. А меняется все значения на последний элемент в мапе. не могу правильно реализовать вот этот цикл
for (let keyMap2 of map2.keys()) {
for(let keyMap of map.keys()){
if(keyMap == keyMap2){
elm.nodeValue=map2.get(keyMap2);
}
}
}
Помогите исправить код Вот сам код и результат его работы.
let map = new Map([["73-b3"," Главная"],
["04-d2","Публикации"],
["d0-51", " Новости"],
["c5-3c", " Контакты"],
["7d-ae", "Удостоверяющий центр"]]);
let map2= new Map([["73-b3"," Main"],
["04-d2","Publications"],
["d0-51", " News"],
["c5-3c", " Contacts"],
["7d-ae", "Certification center"],
["8f-01", "Verification Center"]]);
reserveTranslateText(document)
function reserveTranslateText(elm) {
if (elm.nodeType == Node.ELEMENT_NODE || elm.nodeType == Node.DOCUMENT_NODE) {
// exclude elements with invisible text nodes
if (isExcluded(elm)) {
return
}
for (var i = 0; i < elm.childNodes.length; i++) {
// recursively call to traverse
reserveTranslateText(elm.childNodes[i]);
}
}
if (elm.nodeType == Node.TEXT_NODE) {
// exclude text node consisting of only spaces
if (elm.nodeValue.trim() == "") {
return
}
for (let keyMap2 of map2.keys()) {
for(let keyMap of map.keys()){
if(keyMap == keyMap2){
elm.nodeValue=map2.get(keyMap2);
}
}
}
}
}
/*******************************************************************************/
function isExcluded(elm) {
if (elm.tagName == "STYLE") {
return true;
}
if (elm.tagName == "SCRIPT") {
return true;
}
if (elm.tagName == "NOSCRIPT") {
return true;
}
if (elm.tagName == "IFRAME") {
return true;
}
if (elm.tagName == "OBJECT") {
return true;
}
if (elm.tagName == "TITLE"){
return true;
}
return false
}
<div id="navigation">
<ul>
<li class="selected"><a href="index.shtml">Главная</a></li>
<li><a href="public.shtml">Публикации</a></li>
<li><a href="news.shtml">Новости</a></li>
<li><a href="contacts.shtml">Контакты</a></li>
<li><a href="/cert/">Удостоверяющий центр</a></li>
</ul>
</div>
а должно быть так
Main
Publications
News
Contacts
Certification center
Ответы (1 шт):
Автор решения: Igor
→ Ссылка
Двойной цикл делает для всех элементов одно и то же. Естественно, результат для всех элементов - один и тот же.
let map = new Map([
["73-b3", " Главная"],
["04-d2", "Публикации"],
["d0-51", " Новости"],
["c5-3c", " Контакты"],
["7d-ae", "Удостоверяющий центр"]
]);
let map2 = new Map([
["73-b3", " Main"],
["04-d2", "Publications"],
["d0-51", " News"],
["c5-3c", " Contacts"],
["7d-ae", "Certification center"],
["8f-01", "Verification Center"]
]);
reserveTranslateText(document)
function reserveTranslateText(elm) {
if (elm.nodeType == Node.ELEMENT_NODE || elm.nodeType == Node.DOCUMENT_NODE) {
// exclude elements with invisible text nodes
if (isExcluded(elm)) {
return;
}
for (var i = 0; i < elm.childNodes.length; i++) {
// recursively call to traverse
reserveTranslateText(elm.childNodes[i]);
}
}
if (elm.nodeType == Node.TEXT_NODE) {
// exclude text node consisting of only spaces
if (elm.nodeValue.trim() == "") {
return;
}
for (let keyMap of map.keys()) {
if (map2.has(keyMap) && elm.nodeValue.trim() == map.get(keyMap).trim()) {
elm.nodeValue = map2.get(keyMap);
return;
}
}
}
}
/*******************************************************************************/
function isExcluded(elm) {
if (elm.tagName == "STYLE") {
return true;
}
if (elm.tagName == "SCRIPT") {
return true;
}
if (elm.tagName == "NOSCRIPT") {
return true;
}
if (elm.tagName == "IFRAME") {
return true;
}
if (elm.tagName == "OBJECT") {
return true;
}
if (elm.tagName == "TITLE") {
return true;
}
return false
}
<div id="navigation">
<ul>
<li class="selected"><a href="index.shtml">Главная</a></li>
<li><a href="public.shtml">Публикации</a></li>
<li><a href="news.shtml">Новости</a></li>
<li><a href="contacts.shtml">Контакты</a></li>
<li><a href="/cert/">Удостоверяющий центр</a></li>
</ul>
</div>