2011-04-25 144 views
0

我有一个插件,实质上是对服务器端的表进行排序,并将内容放回到容器中。我有一个绑定函数,它将一个单击事件添加到表格单元格中,以调用父表单提交。我觉得这不是解决这个问题的最好方法。有任何想法吗?jQuery:有一个更有效的方法来做到这一点,不是吗?

$.fn.myplugin = function() { 
    return this.each(function() { 
    var parentform = $(this).parents("form"); 
    var tableidentifier = $(this).attr("id"); 

    var bindclicks = function() { 
     parentform.find("table#" + tableidentifier + " thead tr th").click(function() { 
     // Some code to change the sort column- boring! 
     parentform.submit(); 
     }); 
    } 

    bindclicks(); 

    parentform.submit(function() { 
     $.post(parentform.attr("action"), parentform.serialize(), function(res) { 
     parentform.find("table#" + tableidentifier).replaceWith($(res)); 
     bindclicks(); 
     }) 
     return false; 
    }); 
    }); 
} 

我首先调用bindclicks()函数来设置单击处理了,然后因为我做replaceWith()我再次调用它来重新绑定的事件。它的工作原理,但我很好奇..

回答

3

您可以使用.delegate(),因此您无需每次重新绑定您的点击处理程序。

$.fn.myplugin = function() { 
    return this.each(function() { 
     var parentform = $(this).parents("form"); 
     var tableidentifier = $(this).attr("id"); 

     parentform.delegate("table#" + tableidentifier + " thead tr th", "click", function() { 
      parentform.submit(); 
     }); 

     parentform.submit(function() { 
      $.post(parentform.attr("action"), parentform.serialize(), function(res) { 
       parentform.find("table#" + tableidentifier).replaceWith($(res)); 
      }) 
      return false; 
     }); 
    }); 
} 

只用剪断,它表示,这应该工作,因为要更换<table/>和委派的事件被绑定到<form/>

+0

+1,'代表'是要走的路 – 2011-04-25 19:11:32

+0

酷!从来没有使用委托功能 - 非常非常方便。 – Wells 2011-04-25 19:15:30

0

的这个代替:

var bindclicks = function() { 
     parentform.find("table#" + tableidentifier + " thead tr th").click(function() { 
      parentform.submit(); 
     }); 
    } 

    bindclicks(); 

试试这个:

$("table#" + tableidentifier + " thead tr th", parentForm) 
    .bind('click', function() { 
     parentForm.submit(); 
    }); 

如果使用live而不是bind,它会绑定单击处理到任何新创建的元素。

+0

就没有我需要张贴同样的代码在'$表单提交后的.post'回调? – Wells 2011-04-25 19:05:00

相关问题