jquery – “JScript – 脚本块”和内存泄漏 – 如何正确释放资源?

前端之家收集整理的这篇文章主要介绍了jquery – “JScript – 脚本块”和内存泄漏 – 如何正确释放资源?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我在项目的局部视图中放了一些 jquery选项卡.我注意到Visual Studio的“解决方案资源管理器”,在调试期间,每次单击新选项卡时都会生成一个新的动态JScript脚本块.

即使我把$(‘#mytabs .ui-tabs-hide’).children().remove();和$(“.ui-tabs-hide”).empty();里面显示标签的事件.
脚本块包含我置于选项卡调用的部分视图中的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(); 
    }

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

_Layout.cshtml

....
 <div id="body">  
    @Html.Partial("_TabsMenu");
 </div>
 ....

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

<div id="menutabs" class="content-wrapper">
    <ul >
        <li>@Html.ActionLink("Home","Index","Home")</li>
        <li>@Html.ActionLink("Test","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(); 
         }
     });
 });

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

Index.cshtml

@{Html.RenderPartial("_Index");}

_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',{name:'total',index:'total',{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",{id:"5",invdate:"2007-10-05",{id:"6",invdate:"2007-09-06",{id:"7",{id:"8",invdate:"2007-10-03",{id:"9",total:"430.00"}
    ];
       for(var i=0;i<=mydata.length;i++)
    jQuery("#list4").jqGrid('addRowData',i+1,mydata[i]);

更新

JScript – 脚本块1..N //这是我在每个JScript脚本块中看到的,在调试期间……我是testint jqgrid.这是一个demo from Trirand’s site.

<jQuery("#list4").jqGrid({
datatype: "local",mydata[i]);

解决方法

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

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

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

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

原文链接:https://www.f2er.com/jquery/178577.html

猜你在找的jQuery相关文章