javascript - Jquery $(this) 被 jqgrid gridunload 方法破坏了吗?

标签 javascript jquery jqgrid

我希望下面的代码卸载一个 javascipt jqgrid,然后加载另一个具有不同选项的网格,包括不同的列

//onload
(function($)
$.fn.myGridFn = function(options){
   $(this).jqGrid('GridUnload');
   $(this).jqGrid(options.gridoptions);


//....

$('#select').change(function(){ 
    switch($(this).val())
    {
      case 'grid1':
            $('#grid').myGridFn({gridoptions:{/*grid1 options*/}});
            break;
      case 'grid2':
            $('#grid').myGridFn({gridoptions:{/*grid2 options*/}});
            break;
    }
   });


})(jQuery);

//...
<table id="grid"></table>

我得到的是网格卸载,然后我必须更改选择元素中的选择并再次返回以加载新网格。

更新: 如果我用实际的元素选择器 $('#grid') 替换插件中的 $(this) - 它工作得很好,我不能在我的真实应用程序中这样做,因为该插件被其他几个表格元素和网格使用

最佳答案

为 future 的读者清理:

所以这是一种工作 fiddle :http://jsfiddle.net/s3MsW/10/

我说“有点”是因为底层代码是可疑的(jqGrid 本身)。但我们马上就会到达那里……第一件事:如果您为插件记录“this”,它实际上是 jQuery 对象,而不是节点。从理论上讲,我们可以用 this 替换原始代码中的 $(this) 并且一切都应该有效。

除了不。

您实际上可以使用 this 来卸载 Grid,但是该函数会将 this 作为引用保留下来,而不是指向呈现页面上的表格。有一些方法可以表明旧节点仍然存在(http://jsfiddle.net/s3MsW/8 是一个测试)但足以说明它不能再用于将新表呈现到页面本身。

除了缓存选择器字符串并从头重新选择干净的表(即创建一个新的 jQuery 对象)外,别无选择:

$.fn.myGridFn = function(options){
   var theId = this.selector;
   this.jqGrid('GridUnload'); // reference works for now
   $(theId).jqGrid(options); // reference is broken, so re-select with cached ID
}

如果您认真对待内存使用,您可能想要销毁 this(幽灵节点),但保留它可能没有真正的危害。

关于javascript - Jquery $(this) 被 jqgrid gridunload 方法破坏了吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10004452/

相关文章:

jquery-ui - 如何使排序图标在 jqgrid 的所有列标题中可见,而不管排序状态如何

javascript - express中的中间件和app.use是什么?

javascript - 如何在使用 ScrollView 的 native react 中实现 scrollspy?

javascript - 无法使用ajax渲染img标签

javascript - 从 jqgrid 删除行时禁用/隐藏确认对话框

jquery - 如何在每个第三表行中设置某些 td 的样式?

javascript - Ajax 提交按钮不起作用

javascript - Bootstrap 3 模态滚动到 anchor 链接

javascript - 如何制作类似警报的同步警报/确认对话框

php - 添加收到新订单时的声音