Быстрое решение проблемы, с которой вы столкнулись, это добавление false;
в конец вашего запроса. Это не позволит Chrome удалить текст со страницы и даст ожидаемый результат.
Вот фиксированный код:
javascript:txt = document.getElementById("Ballas.27_Rebellion_and_Allying_With_Hunhow").parentElement.nextElementSibling;index = txt.innerHTML.indexOf(", but")+2;txt.innerHTML = txt.innerHTML.substring(0,index)+"<span style='background-color:yellow;'>"+txt.innerHTML.substring(index,index+40)+"</span>"+txt.innerHTML.substring(index+40);false;
Чтобы полностью ответить на вопрос, позвольте мне быстро объяснить, что происходит. Я начну с того, что немного разделю ваш JS, чтобы его было легче читать.
txt = document.getElementById("Ballas.27_Rebellion_and_Allying_With_Hunhow").parentElement.nextElementSibling;
index = txt.innerHTML.indexOf(", but")+2;
txt.innerHTML = txt.innerHTML.substring(0,index) +
"<span style='background-color:yellow;'>" +
txt.innerHTML.substring(index,index+40) +
"</span>"+txt.innerHTML.substring(index+40);
Что вы заметите, так это то, что последнее утверждение является операцией присваивания. В JavaScript результатом операции присваивания является значение присваивания. Другими словами, если мы скажем return x = 1
, мы оба установим значение x
в 1
и вернем значение 1
.
Это приводит нас к причине, по которой Chrome заменяет содержимое вашей страницы. Предоставляемый вами JavaScript возвращает содержимое элемента txt
(абзац, который вы решили выделить), и затем он обрабатывается как содержимое вашей новой страницы, так же, как при посещении data:text/plain,hello world
или javascript:"hello world"
в вашем браузере отобразит текст "hello world", даже если вы явно не посещали веб-сайт.
Чтобы исправить это, вы можете вернуть значение falsey
в JavaScript - это означает любое из следующего:
0
false
[]
null
undefined
Следовательно, добавление false;
в конце вашего JavaScript приведет к тому, что Chrome выполнит код, но не покажет полученный текст, и не позволит ему неожиданно изменить содержимое страницы.