Question

Est-il possible de charger à distance les fichiers JavaScript dans la barre d'adresse?

J'ai essayé de mettre cela dans la barre d'adresse:

javascript:src='http://depot.com/file.js';funcname();

Je ne suis pas en utilisant cela pour les mauvaises choses. Je teste juste mon site, c'est tout. Si vous voulez protéger votre site, vous devez apprendre à attaquer en premier lieu, non?

Était-ce utile?

La solution

Je suppose que vous devriez être en mesure de faire ce qui suit:

javascript:(function () {
  var newScript = document.createElement('script');
  newScript.type = 'text/javascript';
  newScript.src = 'http://depot.com/file.js';
  document.getElementsByTagName('body')[0].appendChild(newScript);
})();

Voici un exemple très utile (coller dans votre barre d'adresse):

javascript:(function () {
  var newScript = document.createElement('script');
  newScript.type = 'text/javascript';
  newScript.src = 'http://cornify.com/js/cornify.js';
  document.getElementsByTagName('body')[0].appendChild(newScript);

  for (var i = 0; i < 5; i++) {
    newScript = document.createElement('script');
    newScript.type = 'text/javascript';
    newScript.src = 'http://cornify.com/js/cornify_run.js';
    document.getElementsByTagName('body')[0].appendChild(newScript);
  }
})();

Voila:

Stack Overflow cornées

En fait, voici comment cornify.com est y compris les scripts à distance dans leur bookmarklet.


Mise à jour:

@Ben noté dans l'autre réponse , ce n'est pas facile d'appeler une fonction définie dans votre script distant. Ben suggère une solution à ce problème, mais il y a aussi une autre solution, celle qui Cornify utilisent. Si vous consultez http://cornify.com/js/cornify_run.js vous verrez qu'il n'y a qu'un seul appel de fonction dans ce fichier. Vous pouvez placer votre appel funcname() dans un fichier JavaScript distinct, comme Cornify font, parce que les blocs de script sont garanties à exécuter dans l'ordre dans lequel ils sont insérés. Ensuite, vous auriez à inclure les deux scripts, comme dans l'exemple suivant:

javascript:(function () {
  var newScript = document.createElement('script');
  newScript.type = 'text/javascript';
  newScript.src = 'http://depot.com/file.js';
  document.getElementsByTagName('body')[0].appendChild(newScript);

  newScript = document.createElement('script');
  newScript.type = 'text/javascript';
  newScript.src = 'http://depot.com/file_run.js';
  document.getElementsByTagName('body')[0].appendChild(newScript);
})();

Si le file_run.js comprend simplement un appel à funcname().

Autres conseils

Pas directement une réponse, mais néanmoins utile.

Voici un script à charger dans un fichier javascript lorsqu'il est utilisé dans un signet:

javascript:var%20e=document.createElement('script');e.setAttribute('language','javascript');e.setAttribute('src','http://github.com/balupton/ajaxy-bookmark/raw/master/script.js');document.body.appendChild(e);void(0);

Il n'y a aucun moyen direct de faire cela, mais un hack commun est d'exécuter quelques lignes de JavaScript qui insère une balise dans la page courante, définissant son attribut src à l'URL du script que vous souhaitez exécuter:

javascript:var s=document.createElement("script");s.src="http://depot.com/file.js";s.type="text/javascript";document.getElementsByTagName("body")[0].appendChild(s);

Si vous voulez exécuter une fonction définie dans le fichier distant (à la funcname() dans votre question), qui est un peu plus compliqué. En effet, le chargement des scripts via une balise est exécutée de manière asynchrone et si le fichier a probablement pas terminé le chargement immédiatement ajouter l'élément au DOM. La seule façon que je peux penser à se déplacer est de définir une fonction avant d'insérer l'élément, que vous appelez ensuite à la fin du fichier source inclus:

function doStuff() {
    // run code that depends on the included JS file
};
// include the external script, as per the snippet above

Vous seriez alors inclure un appel à doStuff à la fin du fichier inclus:

if(doStuff) doStuff();

Le résultat final ressemble à quelque chose comme ceci:

javascript:function doStuff(){funcname()};var s=document.createElement("script");s.src="http://depot.com/file.js";s.type="text/javascript";document.getElementsByTagName("body")[0].appendChild(s);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top