2010-09-18 11 views
8

Czy można załadować zdalne pliki JavaScript z paska adresu?Załaduj zdalne pliki JavaScript za pomocą paska adresu

staram się umieścić to w pasku adresu:

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

nie używam to do złych rzeczy. Po prostu testuję moją stronę, to wszystko. Jeśli chcesz chronić swoją stronę, musisz najpierw nauczyć się jej atakować, prawda?

+0

w pasku adresu ... co masz na myśli? –

+1

Myślę, że używasz tego do złych rzeczy ... "nie bądź zły" :) – Topera

+2

Co jest złego w dodawaniu kilku unicronów? :) –

Odpowiedz

9

Chyba powinieneś być w stanie wykonać następujące czynności:

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

Oto bardzo użyteczny przykład (wkleić w pasku adresu):

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

W rzeczywistości tak jest cornify.com zdalne skrypty w ich bookmarklet.


UPDATE:

Jak @Ben noted in the other answer, to nie jest takie proste, aby wywołać funkcję zdalnego zdefiniowane w skrypcie. Ben sugeruje jedno rozwiązanie tego problemu, ale istnieje również inne rozwiązanie, które używa rogów. Jeśli sprawdzisz http://cornify.com/js/cornify_run.js zobaczysz, że w tym pliku jest tylko jedno wywołanie funkcji. Możesz umieścić swoje wywołanie funcname() w osobnym pliku JavaScript, co robisz rufie, ponieważ bloki skryptów są gwarantowane do wykonania w kolejności, w jakiej są wstawiane. Wtedy trzeba by zawierać zarówno skrypty, jak w poniższym przykładzie:

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

Jeżeli file_run.js prostu zawiera wezwanie do funcname().

+0

dziękuję bardzo :) – kapitanluffy

+1

+1 za zgrabną grafikę. – balupton

+0

tak plik file_run.js zawiera funcname (params) w prawo? – kapitanluffy

2

Nie ma bezpośredniego sposobu na zrobienie tego, jednak zwykłym hackiem jest uruchomienie kilku linii kodu JavaScript, które wstawia znacznik do bieżącej strony, ustawiając jego atrybut src na adres URL skryptu, który chcesz uruchomić:

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

Jeśli chcesz uruchomić funkcję zdefiniowaną w pliku zdalnego (à la funcname() w swoim pytaniu), to nieco bardziej skomplikowane. Dzieje się tak dlatego, że ładowanie skryptów za pomocą tagu jest uruchamiane asynchronicznie, więc plik najprawdopodobniej nie zakończył ładowania natychmiast, dodając element do DOM. Jedynym sposobem mogę myśleć o poruszanie się po to, aby zdefiniować jakąś funkcję przed włożeniem elementu, który następnie zadzwonić pod koniec dołączonego pliku źródłowego:

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

Byłbyś wtedy zawierać wezwanie do doStuff na koniec dołączonego pliku:

if(doStuff) doStuff(); 

efekt końcowy wygląda mniej więcej tak:

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

+1 za wspomnienie asynchronicznego problemu podczas wywoływania 'funcname()' ... Zasugerowałem inne rozwiązanie w mojej odpowiedzi (zapożyczone z cewki). –

2

bezpośrednio nie odpowiedź, ale pomocny jednak.

Oto skrypt, aby załadować plik JavaScript użyte w zakładce:

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); 
Powiązane problemy