Domanda

E 'possibile caricare i file JavaScript remoti dalla barra degli indirizzi?

Ho cercato di mettere questo nella barra degli indirizzi:

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

Non sto usando questo per le cose cattive. Sto solo testando il mio sito, questo è tutto. Se si voleva proteggere il vostro sito è necessario imparare ad attaccare per primo, giusto?

È stato utile?

Soluzione

Credo che si dovrebbe essere in grado di fare quanto segue:

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

Ecco un esempio molto utile (incolla questo nella barra degli indirizzi):

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 cornified

In realtà, questo è il modo cornify.com è compreso gli script remoti nella loro bookmarklet.


UPDATE:

@ Ben notato nel altra risposta , non è così semplice per chiamare una funzione definita nello script remoto. Ben suggerisce una soluzione a questo problema, ma c'è anche un'altra soluzione, quella che cornify utilizzano. Se si estrae http://cornify.com/js/cornify_run.js vedrete che c'è solo una funzione di chiamata in quel file. Si potrebbe inserire il vostro chiamata funcname() in un file JavaScript separato, come cornify stanno facendo, perché blocchi di script sono garantiti per essere eseguiti nell'ordine in cui sono inseriti. Allora dovreste comprendere sia gli script, come nel seguente esempio:

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

Quando la file_run.js comprende semplicemente una chiamata a funcname().

Altri suggerimenti

Non direttamente una risposta, ma utile comunque.

Ecco uno script per caricare un file javascript quando viene utilizzato in un segnalibro:

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

Non c'è un modo diretto di fare questo, però un hack comune è quello di eseguire poche righe di JavaScript che inserisce una tag nella pagina corrente, impostando il suo attributo src all'URL dello script che si desidera eseguire:

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

Se si desidera eseguire una funzione definita nel file remoto (à la funcname() in questione), che è un po 'più complicato. Questo perché il caricamento di script tramite un tag è gestito in modo asincrono e così di file molto probabilmente ha caricamento non finito immediatamente aggiungendo l'elemento al DOM. L'unico modo che posso pensare di ottenere intorno a questo è quello di definire una funzione prima di inserire l'elemento, che poi chiama alla fine del file sorgente incluso:

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

Si sarebbe quindi includere una chiamata a doStuff alla fine del file incluso:

if(doStuff) doStuff();

L'aspetto del risultato finale qualcosa di simile:

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