Внедрение jQuery с помощью букмарклета не работает на странице - PullRequest
3 голосов
/ 20 октября 2019

Я пытался использовать этот букмарклет:

javascript:void((function(doc){if(typeof jQuery=='undefined'){var script_jQuery=document.createElement('script');script_jQuery.setAttribute('src','https://code.jquery.com/jquery-latest.min.js');document.body.appendChild(script_jQuery);console.log('jQuery included ^_^');}else{console.log('jQuery already included ...');}})(document));

для внедрения jQuery на эту страницу:

https://cn.bing.com/dict/?mkt=zh-cn&q=test

Я открыл страницу, затем открыл консоль разработчика (я используюChrome), переключился на вкладку сети, затем нажал на букмарклет, я заметил, что Chrome не запрашивал https://code.jquery.com/jquery-latest.min.js,, вместо этого он запрашивал следующий URL:

https://cn.bing.com/fd/ls/l?IG=EE977A4E38924F57B34A1371C04323C1&Type=Event.ClientInst&DATA=[{%22T%22:%22CI.AntiMalware%22,%22FID%22:%22CI%22,%22Name%22:%22AC%22,%22Text%22:%22S%3Ahttps%3A//code.jquery.com/jquery-latest.min.js%22}]

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

1 Ответ

2 голосов
/ 20 октября 2019

На этом конкретном сайте есть обезьяна appendChild, как вы можете видеть, если вы запускаете

document.body.appendChild.toString()

в консоль: она дает вам

function(n){return t(n,"AC")?u.apply(this,arguments):null}

взамен [native code], что означает, что нативная функция была перезаписана.

Обратите внимание, что исправленный объект-прототип Element.prototype, но appendChild изначально существует в Node.prototype, который остается не исправленным:

Node.prototype.appendChild.toString()
// gives function appendChild() { [native code] }

Вместо этого вы можете .call непропатченный appendChild:

(function(doc) {
  if (typeof jQuery == 'undefined') {
    var script_jQuery = document.createElement('script');
    script_jQuery.setAttribute('src', 'https://code.jquery.com/jquery-latest.min.js');
    Node.prototype.appendChild.call(
      document.body,
      script_jQuery
    );
    console.log('jQuery included ^_^');
  } else {
    console.log('jQuery already included ...');
  }
})(document)

, и тогда он будет успешно добавлен. (typeof jQuery затем оценивается как function, а не undefined, и вы видите, что на вкладке сети запрашивается правильный URL)


Если сайт исправил его правильно и сделалвсе ссылки на Node.prototype.appendChild недоступны, единственным решением было бы запустить собственный Javascript до запуска Javascript страницы, что можно сделать с помощью менеджера пользовательских сценариев, таких как Tampermonkey , @run-at document-startи использование мгновенного внедрения сценария для сохранения ссылки на Node.prototype.appendChild до ее перезаписи.

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