Frage

Ist es möglich, Remote-JavaScript-Dateien aus der Adressleiste zu laden?

Ich habe versucht, diese in die Adressleiste zu setzen:

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

Ich verwende dies nicht für schlechte Dinge. Ich teste gerade meine Seite, das ist alles. Wenn Sie zum Schutz Ihrer Website wollen müssen Sie lernen, sie zu attackieren zuerst, nicht wahr?

War es hilfreich?

Lösung

Ich denke, sollten Sie in der Lage sein, folgendes zu tun:

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

Hier ist ein sehr nützliches Beispiel (füge diese in der Adressleiste):

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-Überlauf verhornte

In der Tat ist dies, wie cornify.com wird den Remote-Skripte in ihrer Bookmarklet einschließlich.


UPDATE:

Wie @ Ben in der anderen Antwort darauf hingewiesen , ist es nicht so einfach, eine Funktion in Ihrem Remote-Skript definiert zu nennen. Ben schlägt eine Lösung für dieses Problem, aber es gibt auch eine andere Lösung, die man, dass Cornify verwenden. Wenn Sie http://cornify.com/js/cornify_run.js Besuche werden Sie sehen, dass es nur einen Funktionsaufruf in dieser Datei. Sie könnten Ihren funcname() Anruf in einer separaten JavaScript-Datei platzieren, wie Cornify tun, weil Skriptblocks garantiert werden in der Reihenfolge ausgeführt werden sie eingesetzt werden. Dann würden Sie beide Skripte beinhalten müssen, wie im folgenden Beispiel:

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);
})();

Wenn die file_run.js einfach einen Anruf zu funcname() enthält.

Andere Tipps

Nicht direkt eine Antwort, aber hilfreich dennoch.

Hier ist ein Skript zur Last in einer Javascript-Datei, wenn sie in einem Lesezeichen verwendet:

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);

Es gibt keinen direkten Weg, dies zu tun, aber ein gemeinsames Hack ist ein paar Zeilen JavaScript, daß Einsätze ein Tag in die aktuelle Seite laufen, auf die URL des Skripts seine src-Attribut Einstellung, die Sie ausführen möchten:

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

Wenn Sie eine Funktion definiert in der Remote-Datei ausgeführt werden sollen (à la funcname() in Ihrer Frage), das ist ein wenig komplizierter. Dies liegt daran, das Laden von Skripten über einen Tag asynchron ausgeführt wird und so Datei höchstwahrscheinlich nicht beendet Laden sofort das Hinzufügen des Elements auf das DOM. Die einzige Möglichkeit, die ich denken kann, um dieses zu bekommen ist eine Funktion, bevor Sie fügen Sie das Element zu definieren, die Sie dann am Ende der enthaltenen Quelldatei aufrufen:

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

Sie würden dann einen Anruf an doStuff am Ende der Datei enthalten sind:

if(doStuff) doStuff();

Das Endergebnis sieht wie folgt aus:

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);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top