Javascript 使用Prototype动态加载js文件?
我使用prototype动态加载外部js文件(实际上是php文件)。 像这样:Javascript 使用Prototype动态加载js文件?,javascript,file,dynamic,prototypejs,Javascript,File,Dynamic,Prototypejs,我使用prototype动态加载外部js文件(实际上是php文件)。 像这样: function UpdateJS(file) { var url = 'main_js.php?file='+file; var myAjax = new Ajax.Request( url, {method: 'get', onComplete: showResponseHeader} ); } function showResponseHeader (originalRequest) { $
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文件时如何“卸载”第一个js文件吗
(我也尝试过使用Ajax.Updater函数,但结果是一样的。)
更新:
事实证明,还有一个更大的问题:它只在函数“UpdateJS”位于window.onload中时才加载,这就是为什么它在此之后不加载任何其他内容。
因此,这可能不是一个很好的方法…我认为您无法卸载在文件范围内定义的一组属性。一种解决方法是在一个中心对象中定义每个文件中包含的函数,您可以随时丢弃(或覆盖)它。这里有一个关于如何动态卸载Javascript和CSS的精彩教程: 下面的代码是从上面的链接中借来的,它是一个纯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删除功能,我相信您可以将其删除。尝试以下操作:
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;
}
我也读过,问题似乎是它删除了脚本节点,但实际上没有从内存中删除定义的属性,这就是重点,不是吗?不,实际上不是。但是是的,我认为这就是问题所在。如果我的新.js文件加载与第一个.js文件同名的函数,它将使用第二个函数,这就是我想要的。