2009-02-26 3 views
23

Ajax를 사용하는 페이지를 포함하고 있지만 각각의 자바 스크립트 파일을 포함시켜야합니다.이 파일은 메모리에서 이전 자바 스크립트 파일을 동시에 제거해야합니다.동적으로 자바 스크립트 파일을 언로드 할 수 있습니까?

새 페이지의 파일을로드 할 수 있도록 현재로드 된 자바 스크립트 파일 (메모리의 코드는 물론)을 언로드 할 수 있습니까? 그것들은 여러 갈래의 충돌 가능성이 있으므로 여러 개의 독립적 인 파일의 javascript 파일이로드됩니다.

+0

맞춤로드/언로드가 필요할 수 있습니다. – Pacerier

답변

11

디자인을 재평가해야하는 것처럼 들립니다. 어쨌든 아약스를 삭제해야하거나 메소드 이름에 충돌이 없어야합니다. http://www.javascriptkit.com/javatutors/loadjavascriptcss2.shtml

는 DOM에서 자바 스크립트를 제거하는 방법에 대한 정보를 제공합니다

당신은이 링크를 검토 할 수 있습니다. 그러나 최신 브라우저는 코드를 브라우저의 메모리에 남겨 둡니다.

+2

facebook은 같은 방법을 사용하고 코드를 깨끗하게 유지하므로 혼합되지 않습니다. 적절한 객체 지향 코드는 훌륭한 작업을 수행하므로 아무런 충돌이 발생하지 않습니다. – Basit

+0

최신 브라우저 가비지 수집. 제거 된 코드에 대한 참조가 손실되면 결국 가비지 수집 대상이됩니다. –

+0

@ray : 4 년 전의 답변과 관련하여 "현대적"입니다. GC가 그다지 잘 수행되지 않았습니다. 솔직히 그들이 오늘 더 잘하고 있는지 나는 모른다. – NotMe

8

아니요, 그렇게 할 수 없습니다. 자바 스크립트 블록이 브라우저에로드되고 실행되면 해당 창 범위 아래 브라우저 메모리에 저장됩니다. 페이지를 새로 고치거나 창을 닫지 않고 페이지를 언로드 할 수있는 방법은 없습니다.

2

사실 꽤 가능합니다. 스크립트 또는 링크 요소를 바꿀 수 있습니다.

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]) 
    } 
    } 
} 

당신은 "JS"또는 "CSS"나는 코드를 설명 할 필요가 없습니다 생각

등의 src 속성 및 파일 형식으로 파일 이름 매개 변수를 작성해야합니다. 또한 2009 년에 게시했지만 어이. 어쩌면 누군가는 그것을 필요로 할 것입니까? :)

모든 신용은 간다 : 당신은 BTW 거기에 몇 가지 트릭을 배울 수 http://www.javascriptkit.com/javatutors/loadjavascriptcss2.shtml

.

+14

이것은 브라우저 메모리에서 코드를 제거합니까, 아니면 html의 참조를 코드에서 제거합니까? –

+1

@cale_b 이렇게해도 브라우저의 메모리에서 제거되지 않으므로 그렇게 할 수 없습니다. –

+3

동일한 기능 이름을 가진 다른 js 파일을 메모리를 대체하는 빈 본문으로로드하십시오. 테스트를 거쳐 그 작업. –

6

당신은 ... 당신이 충돌을 방지 그런 식으로 코드를 네임 스페이스 수

var에 MyJavaScriptCode = {};

MyJavaScriptCode.bla = function() {};

+0

또한 내보낼 항목을주의하십시오. 'window.someModule = (function() {/ * 여기에 모듈 구성 요소를 작성하십시오 */return {someComponent : myComponent, anotherComponent : myOtherComponent};}())'모듈 패턴을 사용하여 많은 제어권을 얻을 수 있습니다. 물론 불필요한 걱정을 덜어주기 위해 RequireJS 나 다른 라이브러리를 사용해야합니다. – Keen

관련 문제