"JScript - 脚本块"和内存泄漏 - 如何正确释放资源?

Lar*_*rry 8 asp.net-mvc jquery memory-leaks jquery-ui jquery-ui-tabs

我在项目的局部视图中放了一些jquery选项卡.我注意到Visual Studio的"解决方案资源管理器",在调试期间,每次单击新选项卡时都会生成一个新动态JScript - script block.

出现这种情况,即使我把$('#mytabs .ui-tabs-hide').children().remove();$(".ui-tabs-hide").empty();show标签的事件.脚本块包含我放在由标签调用的部分视图中的javascript,因此每次单击以前单击的选项卡时,都会出现一个新的JScript块:很明显这会导致稳定性或内存泄漏问题...例如,I已经注意到我加载两次选项卡后,某些计时器和绑定无法正常工作.

我不知道问题是由调用包含脚本的部分视图的方式引起的.请注意我如何设置控制器操作(示例中的索引).

这是我的环境:jquery 1.6.4 - jquery-ui 1.8.16 - IE 8.0.7601 我无法成功调试其他浏览器,因为Visual Studio似乎没有附加他们的进程而且没有显示动态数据......

CONTROLLER

这是选项卡调用的动作示例

  public ActionResult Index()
    {
         if (Request.IsAjaxRequest())
            return PartialView("_Index");

        return View(); 
    }
Run Code Online (Sandbox Code Playgroud)

以下是我的观点和脚本的一些部分:

_Layout.cshtml

 ....
 <div id="body">  
    @Html.Partial("_TabsMenu");
 </div>
 ....
Run Code Online (Sandbox Code Playgroud)

_TabsMenu.cshtml(包含标签菜单的部分视图)

 <div id="menutabs" class="content-wrapper">
    <ul >
        <li>@Html.ActionLink("Home", "Index", "Home")</li>
        <li>@Html.ActionLink("Test", "Index", "Test")</li>
         ...
    </ul>
 </div>

 <script type="text/javascript">
 $(function () {
     $('#menutabs').tabs({
         cache: false,
         show: function (event, ui) {
             $('#menutabs .ui-tabs-hide').children().remove(); // the content is removed , but the script is still in memory
             $(".ui-tabs-hide").empty(); // the content is removed, but the script is still in memory
         },
         select: function (event, ui) {
             $(window).unbind(); 
         }
     });
 });
Run Code Online (Sandbox Code Playgroud)

(我甚至试图把脚本放在div id里面,pheraps很傻,但是我想看看DOM里面的脚本是否被删除了......但是什么都没有)

Index.cshtml

  @{Html.RenderPartial("_Index");}
Run Code Online (Sandbox Code Playgroud)

_Index.cshtml(包含问题的重复jscript对象的局部视图)

   <table id="list4"></table>
   <jQuery("#list4").jqGrid({
datatype: "local",
height: 250,
colNames:['Inv No','Date', 'Client', 'Amount','Tax','Total','Notes'],
colModel:[
    {name:'id',index:'id', width:60, sorttype:"int"},
    {name:'invdate',index:'invdate', width:90, sorttype:"date"},
    {name:'name',index:'name', width:100},
    {name:'amount',index:'amount', width:80, align:"right",sorttype:"float"},
    {name:'tax',index:'tax', width:80, align:"right",sorttype:"float"},     
    {name:'total',index:'total', width:80,align:"right",sorttype:"float"},      
    {name:'note',index:'note', width:150, sortable:false}       
],
multiselect: true,
caption: "Manipulating Array Data"});
            var mydata = [
    {id:"1",invdate:"2007-10-01",name:"test",note:"note",amount:"200.00",tax:"10.00",total:"210.00"},
    {id:"2",invdate:"2007-10-02",name:"test2",note:"note2",amount:"300.00",tax:"20.00",total:"320.00"},
    {id:"3",invdate:"2007-09-01",name:"test3",note:"note3",amount:"400.00",tax:"30.00",total:"430.00"},
    {id:"4",invdate:"2007-10-04",name:"test",note:"note",amount:"200.00",tax:"10.00",total:"210.00"},
    {id:"5",invdate:"2007-10-05",name:"test2",note:"note2",amount:"300.00",tax:"20.00",total:"320.00"},
    {id:"6",invdate:"2007-09-06",name:"test3",note:"note3",amount:"400.00",tax:"30.00",total:"430.00"},
    {id:"7",invdate:"2007-10-04",name:"test",note:"note",amount:"200.00",tax:"10.00",total:"210.00"},
    {id:"8",invdate:"2007-10-03",name:"test2",note:"note2",amount:"300.00",tax:"20.00",total:"320.00"},
    {id:"9",invdate:"2007-09-01",name:"test3",note:"note3",amount:"400.00",tax:"30.00",total:"430.00"}
    ];
       for(var i=0;i<=mydata.length;i++)
    jQuery("#list4").jqGrid('addRowData',i+1,mydata[i]);
Run Code Online (Sandbox Code Playgroud)

更新

JScript - 脚本块1..N //这是我在每个JScript脚本块中看到的,在调试期间...我是testint jqgrid.这是Trirand网站演示.

     <jQuery("#list4").jqGrid({
datatype: "local",
height: 250,
colNames:['Inv No','Date', 'Client', 'Amount','Tax','Total','Notes'],
colModel:[
    {name:'id',index:'id', width:60, sorttype:"int"},
    {name:'invdate',index:'invdate', width:90, sorttype:"date"},
    {name:'name',index:'name', width:100},
    {name:'amount',index:'amount', width:80, align:"right",sorttype:"float"},
    {name:'tax',index:'tax', width:80, align:"right",sorttype:"float"},     
    {name:'total',index:'total', width:80,align:"right",sorttype:"float"},      
    {name:'note',index:'note', width:150, sortable:false}       
],
multiselect: true,
caption: "Manipulating Array Data"});
            var mydata = [
    {id:"1",invdate:"2007-10-01",name:"test",note:"note",amount:"200.00",tax:"10.00",total:"210.00"},
    {id:"2",invdate:"2007-10-02",name:"test2",note:"note2",amount:"300.00",tax:"20.00",total:"320.00"},
    {id:"3",invdate:"2007-09-01",name:"test3",note:"note3",amount:"400.00",tax:"30.00",total:"430.00"},
    {id:"4",invdate:"2007-10-04",name:"test",note:"note",amount:"200.00",tax:"10.00",total:"210.00"},
    {id:"5",invdate:"2007-10-05",name:"test2",note:"note2",amount:"300.00",tax:"20.00",total:"320.00"},
    {id:"6",invdate:"2007-09-06",name:"test3",note:"note3",amount:"400.00",tax:"30.00",total:"430.00"},
    {id:"7",invdate:"2007-10-04",name:"test",note:"note",amount:"200.00",tax:"10.00",total:"210.00"},
    {id:"8",invdate:"2007-10-03",name:"test2",note:"note2",amount:"300.00",tax:"20.00",total:"320.00"},
    {id:"9",invdate:"2007-09-01",name:"test3",note:"note3",amount:"400.00",tax:"30.00",total:"430.00"}
    ];
       for(var i=0;i<=mydata.length;i++)
    jQuery("#list4").jqGrid('addRowData',i+1,mydata[i]);                
Run Code Online (Sandbox Code Playgroud)

bha*_*lin 8

由浏览器解析的脚本不在DOM中,并且您无法"删除"它 - 变量仍然被定义,事件仍被绑定,方法仍然存在.如果您将javascript放入重复加载的部分视图中,您将重复获取该javascript.

你需要做的是让你的javascript更具弹性.如果您将事件绑定到动态区域之外的元素 - 请不要.你会多次绑定它们.将该代码移动到仅加载一次的位置.尝试将javascript保持在动态区域中,这样它只处理动态区域中的元素.

您还可以使用简单的if检查,使用更具范围的jquery选择器等来防止多个定义.

如果没有重复块中的内容的详细信息,我可以提供的内容并不多.