Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/467.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用Prototype动态加载js文件?_Javascript_File_Dynamic_Prototypejs - Fatal编程技术网

Javascript 使用Prototype动态加载js文件?

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) { $

我使用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) 
{
  $('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文件同名的函数,它将使用第二个函数,这就是我想要的。