Chrome Address Bar Javascript производит другой эффект, чем консоль - PullRequest
0 голосов
/ 18 июня 2019

Пытаясь что-то новое, я пытался выделить текст на этой странице викия , используя javascript в адресной строке (т.е. используя "javascript: [code]").

При запускеСледующий пример кода через консоль 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);

Примечание: если вы хотите попробовать это, вам придетсявручную введите javascript: в адресную строку перед вставкой кода, так как Chrome автоматически удаляет его.

Мне интересно, почему это так, а также если есть способ остановитьадресная строка от удаления остальной части страницы.Кто-нибудь может предложить понимание?

Спасибо.

1 Ответ

0 голосов
/ 18 июня 2019

Быстрое решение проблемы, с которой вы столкнулись, это добавление 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 выполнит код, но не покажет полученный текст, и не позволит ему неожиданно изменить содержимое страницы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...