web-dev-qa-db-fra.com

Appliquer un Greasemonkey/Tampermonkey/userscript à un iframe?

Le titre est à peu près la question:

Est-il possible d'ajouter un script Greasemonkey à un site web iframed?

Si c'est le cas, comment?

Je vous remercie.

13
UpIX

Dans Greasemonkey (et Tampermonkey et la plupart des moteurs d’utilisateur), un script est automatiquement déclenché sur un iframe s’il est conforme à @include _, @exclude et/ou @match directives.
Et une question courante est comment empêcher Greasemonkey de tirer sur des iframes .

Donc, si votre script a une correspondance comme:

@match https://fiddle.jshell.net/*

Il se déclencherait sur les pages "sortie" de jsFiddle, qu'elles apparaissent ou non dans un iframe.


Si vous voulez tirer sur un contenu JUST iframed:

Ensuite, vous devriez vérifier la propriété window.self.
Par exemple, supposons que vous ayez une page cible du type:

<body>
    <h1>I'm some webpage, either same-domain or not.</h1>
    <iframe src="//domain_B.com/somePath/somePage.htm">
...

Ensuite, vous pouvez utiliser un script comme:

// ==UserScript==
// @name    _Fires specially on domain_B.com iframes
// @match   *://domain_B.com/somePath/*
// ==/UserScript==

if (window.top === window.self) {
    //--- Script is on domain_B.com when/if it is the MAIN PAGE.
}
else {
    //--- Script is on domain_B.com when/if it is IN AN IFRAME.
    // DO YOUR STUFF HERE.
}

Important:

Avec la sortie de Greasemonkey 4, la gestion des iframes est gravement handicapée } (et bien d’autres choses sont cassées, en plus).
Il fonctionne toujours correctement avec Tampermonkey, Violentmonkey et à peu près tous les autres moteurs d’utilisateur.
Il est fortement recommandé ( y compris par Greasemonkey lui-même _) de ne pas utiliser Greasemonkey 4 ou une version ultérieure.

15
Brock Adams

Notez que si vous créez une extension chrome pour votre script utilisateur, vous devez également ajouter "all_frames": true à votre manifeste, sinon votre extension ne fonctionnera pas avec les iframes. 

Exemple:

"content_scripts": [
    {
      "matches": ["*://*/*"],
      "all_frames": true,
      "js":["dont.js"],
      "run_at":"document_start"
    }
  ]
0
Navin