【问题标题】:jQuery clear DOM previously loaded scriptsjQuery 清除 DOM 之前加载的脚本
【发布时间】:2011-10-15 17:08:36
【问题描述】:

大家好,我正在做一个项目,我使用 jQuery 将页面加载到 div 中,每个页面都有自己的 jQuery 脚本,我的问题是之前加载的脚本没有从 DOM 中清除,这会产生更大的问题我的项目。

例如,我在一个页面中有一组计时器,它会自动保存数据,但是当我更改页面时,计时器仍在运行并弄乱了内容。

我像这样管理不断变化的页面:

$(document).ready(function() {

   $('li').click(function (event) {

      $('.progressbarone').hide();
      var theitem = this.id;
      //isf ajax to load with addon
      var thefile = "isf_ajax.php?addon="+this.id;
      var progress = '<span class="progressbarone"><img src="'
         + THEMEURL
         + '/gfx/images/progessbar1.gif" width="20" height="16" /></span>';

      // pre actions
      $('.'+ theitem +'_item')
         .append(progress)
         .children(':last')
         .hide()
         .fadeIn(1000);
      $('li').removeClass('active');
      $(this).addClass('active');

      // load the page
      $('#childpage').remove();
      $('#officetable').html('<div id="childpage">loading</div>');
      $('#childpage').load(thefile, function() {

         // after load actions
         $('.progressbarone').fadeOut(2000);
      });
   });
});

如您所见,我有两个 div,一个称为 office table,用于处理子页面,而子页面包含更改页面的内容。但是如您所见,我使用了 remove();功能也一样,之后我将子页面放置到 officetable 并发布了文件的内容,但它仍然没有删除我之前加载的脚本。

谢谢你们。

【问题讨论】:

    标签: jquery dom load


    【解决方案1】:

    将脚本附加到页面后,它们就会运行。尽管您从 DOM 中删除了脚本标签,但变量仍将保留。我的意思是计时器、函数、代码中声明的任何类型的变量。

    因此,您可能希望清除不再需要的先前状态。

    function doTheCleanup(){
        clearTimeout(globalTimerVariable);
        delete someGloablVar;
        //and so on
    }
    

    【讨论】:

    • 我要试试这个,谢谢,我会告诉你结果。
    • 稍作修改就解决了,谢谢,我也是 SOF 的新手,有没有其他评分系统,所以我可以给你评分。
    • @user997057 很高兴它帮助了你!如果您有多个计时器或变量,我建议将它们组织起来(即在一个对象中等)。
    • 实际上我只有一个计时器来保存 tinymce 编辑器的数据所以我实际上完全删除了计时器(但是当我测试它时你的解决方案正在工作)我现在保存了它按钮保存点击事件的内容,同时我还安装了一个 mce 插件,它在 x 秒后自动保存数据,我设置为每 60 秒后保存 24 小时。我想这就是我想要的。而不是每 60 秒执行一次 ajax -> sql,而编辑器上可能没有更多的变化来处理 mysql 和 ajax 的额外能源浪费,对吧?
    【解决方案2】:

    如果您的脚本已经执行了删除 DOM 元素,则不会删除它们。使用 JavaScript 转到任何页面,打开 firebug 或控制台并输入 $("script").remove()。一切都在运行。

    这里有一些提示:

    1. 不要在每次 ajax 调用中重新包含脚本。
    2. 如果你 有需要处理的事件使用 jQuery.live()
    3. 只设置任何 计时器一次,而不是每次 ajax 调用。

    听起来你正在构建一个单页网络应用程序,你可能想看看使用类似backbone.js 的东西来组织你的代码并帮助你遵循一些更好的模式。查看本教程:

    http://addyosmani.com/blog/building-spas-jquerys-best-friends/

    祝你好运

    【讨论】:

    • 没错,我正在构建一个 SPWP,除了这个计时器之外,我没有任何抱怨。我正在将 jquery live 用于模块,并且我不会在每个 jquery 调用中重新包含脚本。我完成这个项目太远了,所以我不能回到第 0 步开始使用backbone.js,虽然它是一件好事,我希望我在开始这个项目之前就看到它。
    • 对不起,我误解了这个问题!你在哪里做你的计时器?正如另一张海报所说,您可以像这样保存 setInterval 的结果。 var timer = setInterval(myFunction(){});并假设该变量在范围内,您可以稍后调用 clearInterval(timer)。祝你好运!
    • 是的,我会像他建议的那样去做完成后给你一个演示链接。
    【解决方案3】:

    也许如果您删除了进度条跨度?另外,您可以考虑使用 $.deferred -> .done

    【讨论】:

    • 这不会停止之前加载的脚本,我试过了,我想它只是用于在一个动作实际成功执行后回调其他函数或一组函数
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-06
    相关资源
    最近更新 更多