2009-04-05 3 views
2

Я использую прототип для загрузки внешнего js-файла (на самом деле это php-файл) динамически. Как это:Динамическая загрузка js-файла с использованием Prototype?

function UpdateJS(file) 
{ 
    var url = 'main_js.php?file='+file; 
    var myAjax = new Ajax.Request(url, {method: 'get', onComplete: showResponseHeader}); 
} 
function showResponseHeader (originalRequest) 
{ 
    $('jscode').innerHTML = originalRequest.responseText; 
} 

Контейнер "jscode" определяется следующим образом:

<script type="text/javascript" id="jscode"></script> 

И это работает! Но если вызывается какой-то другой файл, все функции из предыдущего сохраняются. И я не хочу этого. Кто-нибудь знает, как «выгрузить» первый файл js при вызове второй?

(я также попытался использовать функцию Ajax.Updater, но результат тот же.)

Update: Оказывается, что есть большая проблема: она загружает только если функция «UpdateJS» находится в window.onload поэтому после этого ничего не загружает. Итак, обновление прототипов, возможно, не так хорошо подходит для этого ...

ответ

2

Там отличный учебник о том, как динамически выгрузить Javascript и CSS здесь:

http://www.javascriptkit.com/javatutors/loadjavascriptcss2.shtml

Код ниже заимствовано из приведенной выше ссылке, это чистое решение JS, а не прототип JS один, но должны сделать трюк:

function removejscssfile(filename, filetype){ 
var targetelement=(filetype=="js")? "script" : (filetype=="css")? "link" : "none" //determine element type to create nodelist from 
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(filename)!=-1) 
    allsuspects[i].parentNode.removeChild(allsuspects[i]) //remove element by calling parentNode.removeChild() 
} 
} 

removejscssfile("somescript.js", "js") //remove all occurences of "somescript.js" on page 
removejscssfile("somestyle.css", "css") //remove all occurences "somestyle.css" on page 

Если вы не нуждаетесь в CSS извлекая функциональность, я уверен, что вы можете взломать его.

+0

Я был читать об этом, а также проблема, кажется, что он удаляет узел сценария, но не на самом деле определенные свойства из памяти, и это была точка не так ли? –

+0

Нет, на самом деле это не так. Но да, я думал, что это проблема. Если мой новый .js-файл загружает функцию, которая имеет то же имя, что и в первом .js-файле, она будет использовать вторую, и это то, что я хотел. – domagojk

1

Я не думаю, что вы можете выгрузить набор свойств, определенных в пределах области действия файла. Обходным решением было бы определить функции, содержащиеся в каждом файле, в центральном объекте, который вы отменяете (или переопределяете), когда захотите избавиться от него.

0

Попробуйте следующее:

function UpdateJS(file) 
{ 
    $('jscode').innerHTML = ''; /*YOU NEED TO RESET THIS*/ 
    var url = 'main.js'; /*YOU CAN USE A JAVASCRIPT FILE*/ 
    var myAjax = new Ajax.Request(url, {method: 'get', onComplete: showResponseHeader}); 
} 
function showResponseHeader (originalRequest) 
{ 
    $('jscode').innerHTML = originalRequest.responseText; 
} 
Смежные вопросы