删除/重新加载已加载的脚本

时间:2012-02-09 19:58:41

标签: javascript ajax jquery

我正在通过ajax加载页面。整个页面包括<html> <head> <body>。 所以我需要调用所有应该在页面加载时调用的脚本。但浏览器记得其中一些已经加载到这个窗口,他不会再次执行它们。

如何删除所有已加载的脚本?

或者更好的是,如何加载整个页面,但是有一些旧对象在前一页的后台工作?例如上传和其他通信。

代码:      this.load = function(adr)       {
        this.iris();

    $.ajax({
          type: 'GET', 
          url:  adr,   
          dataType: 'html',
          success: function(data) 
          {    
            $("body").html(html);  
          }
    });

编辑: 对不起,伙计们,我写错了可能,因为你的答案很好,但解决别的问题,我可以自己解决。所以我会试着以不同的方式说出来。

  • 我无法将初始化保存到函数或其他任何内容

    为什么 - 因为我正在使用一些模板,每个模板都有插件中的JS(for forms,callendar ..)文件。 每个插件在加载的脚本上立即通过匿名函数初始化。

因此,当我通过ajax加载HTML时,它不会在这个新的HTML上初始化。 (例如,找不到并且不会添加监听器)。

3 个答案:

答案 0 :(得分:3)

执行脚本时,即使替换整个DOM,也无法取消执行该脚本并将其保留在范围内。

因此,如果您创建对象window.a = new A();并将DOM替换为$('body').html(html);,则该对象仍可以window.a进行访问。

更新

我想你的脚本定义包含在<head>中,你可以在一个地方调用它们。

<!DOCTYPE html>
<html>
<head>
  <script src="script1.js"></script>
  <script src="script2.js"></script>
</head>
<body>
  ... content ...

  <script>
window.onload = function () {
  // initialization code here
};
  </script>
</body>
</html>

将初始化<script>放在头部,同时将function存储在变量中。然后,当您加载新内容时,只需替换<body>的内容并调用该函数。

<!DOCTYPE html>
<html>
<head>
  <script src="script1.js"></script>
  <script src="script2.js"></script>

  <script>
var a = function () {
  // initialization code here
};

var load = function (adr) {
  $.ajax({
    type: 'GET', 
    url:  adr,   
    dataType: 'html',
    success: function (data) {
      data = data.exec(/<body[^>]*?>(.*)<\/body>/i);
      $("body").html(data);

      a(); // call the function after each load
    }
  });
};
  </script>
</head>
<body onload="a()">
  ... content ...
</body>
</html>

答案 1 :(得分:1)

“未执行”脚本的唯一方法是首先将其设计为这样。

这并不是特别难,但它需要一些知识 - 没有神奇的开关可以打开它。

例如......

<强>的index.html

<script src="script1.js"></script>
<script src="script2.js"></script>
<script> alert(pie); </script>

<强> script1.js

var pie = 'Hello world!';

<强> script2.js

var pie = 'Hello cruel world!';

简而言之,一个重要的先决条件是将所有代码保存在一个入口点中,以后可以轻松覆盖/删除。

答案 2 :(得分:0)

不是将初始化代码直接放在脚本中以便立即执行,而是将其放入函数中,然后根据需要调用该函数。

包括这一次:

function initialize() {
    alert('(Re)initializing');
}

然后,无论何时“重新加载”该页面,只需再次呼叫initialize()