2009-02-26 13 views
23

Dołączam strony korzystające z Ajax, ale muszę też uwzględnić ich odpowiednie pliki javascript, co wymaga jednoczesnego usunięcia poprzednich plików javascript z pamięci.Jak mogę dynamicznie rozładować plik javascript?

Jak mogę wyładować aktualnie załadowane pliki javascript (a także ich kod w pamięci), aby móc załadować pliki nowej strony? Będą bardziej niż prawdopodobne, konflikt, więc mając wiele niezależnych plików "javascript" załadowane pliki.

+0

Może wymagać niestandardowego załadunku i rozładunku. – Pacerier

Odpowiedz

11

To naprawdę brzmi, jakbyś musiał ponownie ocenić swój projekt. Musisz upuścić ajax, lub nie musisz mieć kolizji w nazwach metod.

Można przeglądać ten link: http://www.javascriptkit.com/javatutors/loadjavascriptcss2.shtml

co daje informacje o tym, jak usunąć JavaScript z DOM. Jednak nowoczesne przeglądarki pozostawiają kod w pamięci w przeglądarce.

+2

Facebook używa tej samej metody i utrzymywania kodu w czystości, więc nie mieszają się. Odpowiedni kod zorientowany obiektowo wykona dobrą robotę, więc nie dojdzie do konfliktu. – Basit

+0

Nowoczesne przeglądarki zbierają śmieci. Jeśli odniesienia do usuniętego kodu zostaną utracone, ostatecznie stanie się kandydatem do zbierania śmieci. –

+0

@ray: "nowoczesny" w stosunku do mojej odpowiedzi był 4 lata temu .. GC nie było wtedy zbyt dobrze zrobione; Szczerze mówiąc, nie wiem, czy dzisiaj robią coś lepszego. – NotMe

8

Nie, nie możesz tego zrobić. Po załadowaniu bloku JavaScript do przeglądarki i wykonaniu, zostaje on zapisany w pamięci przeglądarki pod zakresem odpowiedniego okna. Nie ma absolutnie żadnego sposobu, aby go wyładować (bez odświeżania strony/zamknięcia okna).

2

To całkiem możliwe. Możesz zastąpić skrypt lub element linku.

function createjscssfile(filename, filetype){ 
if (filetype=="js"){ //if filename is a external JavaScript file 
    var fileref=document.createElement('script') 
    fileref.setAttribute("type","text/javascript") 
    fileref.setAttribute("src", filename) 
} 

else if (filetype=="css"){ //if filename is an external CSS file 
    var fileref=document.createElement("link") 
    fileref.setAttribute("rel", "stylesheet") 
    fileref.setAttribute("type", "text/css") 
    fileref.setAttribute("href", filename) 
} 
    return fileref 
} 

function replacejscssfile(oldfilename, newfilename, filetype){ 
var targetelement=(filetype=="js")? "script" : (filetype=="css")? "link" : "none" //determine element type to create nodelist using 
var targetattr=(filetype=="js")? "src" : (filetype=="css")? "href" : "none" //determine corresponding attribute to test for 
var allsuspects=document.getElementsByTagName(targetelement) 
for (var i=allsuspects.length; i>=0; i--){ //search backwards within nodelist for matching elements to remove 
    if (allsuspects[i] && allsuspects[i].getAttribute(targetattr)!=null && allsuspects[i].getAttribute(targetattr).indexOf(oldfilename)!=-1){ 
     var newelement=createjscssfile(newfilename, filetype) 
     allsuspects[i].parentNode.replaceChild(newelement, allsuspects[i]) 
    } 
    } 
} 

należy wypełnić parametry pliku jako atrybut src i typu pliku jako „kd” lub „css”

myślę, że nie ma potrzeby wyjaśniać kod. Również opublikowałeś w 2009, ale hej. Może ktoś będzie tego potrzebował? :)

Wszystko zasługa: http://www.javascriptkit.com/javatutors/loadjavascriptcss2.shtml

można nauczyć się kilku sztuczek tam btw.

+14

Czy to usuwa kod z pamięci przeglądarki lub po prostu usuwa odwołanie w html do kodu? –

+1

@ cale_b Nie usuwa tego z pamięci przeglądarki, a zatem nie ma sensu tego robić. –

+3

Załaduj kolejny plik js z tymi samymi nazwami funkcyjnymi z pustym ciałem, które zastępuje pamięć. Przetestowany i jego działanie. –

6

można po prostu przestrzeni nazw kodu .. W ten sposób można uniknąć kolizji

var MyJavaScriptCode = {};

MyJavaScriptCode.bla = function() {};

+0

Należy również zachować ostrożność podczas eksportowania. Możesz uzyskać dużą kontrolę poprzez użycie wzorca modułu: 'window.someModule = (function() {/ * skompiluj tutaj komponenty twojego modułu */return {someComponent: myComponent, anotherComponent: myOtherComponent};}())'. Oczywiście powinieneś po prostu użyć RequireJS lub innej biblioteki, aby odciążyć niepotrzebne obawy. – Keen

Powiązane problemy