クロスブラウザーUserJSを作成します。 例1:Yandexロゴの変更

Firefox、Opera、Safari、ChromeはUserJSをサポートしています。 すべてが異なります。 これらのブラウザー用のスクリプトの作成方法に関する一連の記事を書く予定です。 一日一回。

本日、YandexロゴをGoogleに変更します。 このような役に立たないスクリプト。

Googleロゴ付きYandex

yandex-with-google-logo.user.js

  // == UserScript ==
 // yandex.ruの@name Googleロゴ
 // @include http://www.yandex.ru/*
 // == / UserScript ==

 var logo = document.querySelector( "img [src $ = 'logo.png']");
 if(ロゴ){
   logo.src = 'http://www.google.com/intl/en_ALL/images/logo.gif';
   logo.removeAttribute( 'height');
 }



このUserJSは、Firefox、Opera、Safari、Chromeの最新バージョンで動作します。 しかし、Operaにはニュアンスがあります:ロゴ変数はWebページから利用可能になりました。

ロゴ// [オブジェクトHTMLImageElement]ロゴ//未定義


ロゴ変数が既にページで定義されている場合、スクリプトはそれを上書きします。 これは、コードを匿名関数でラップすることで回避できます。 yandex-with-google-logo2.user.js

  // ==ユーザースクリプト==
 // yandex.ruの@name Googleロゴ
 // @include http://www.yandex.ru/*
 // == / Userscript ==

  (関数(){ 
  var logo = document.querySelector( "img [src $ = 'logo.png']");
   if(ロゴ){
     logo.src = 'http://www.google.com/intl/en_ALL/images/logo.gif';
     logo.removeAttribute( 'height');
   } 
  })(); 


なぜOperaだけで変数がグローバルになったのですか? Operaでは、UserJSのウィンドウ==ページウィンドウ。

Greasemonkeyでは、windowはXPCNativeWrapperです。 このオブジェクトは、Webページのウィンドウの外にあり、Webページのスクリプトにアクセスできないかのようです。 Webページウィンドウへのアクセスは、window.wrappedJSObject(別名unsafeWindow )を介して行われます。

窓

Safari Greasekitでは、window UserJS == window pages、およびOperaで。 ただし、スクリプトはすでに匿名関数でラップされているかのように、変数はローカルのままです。

続き: 例2:アラート()を再定義します

Source: https://habr.com/ru/post/J73901/


All Articles