使用jQuery延迟加载插件和tablesorter插件与addParser方法?

时间:2011-12-18 08:54:18

标签: jquery lazy-loading tablesorter

我正在使用jQuery Lazy plugin来延迟加载JS和CSS资源。我也使用TableSorter jQuery plugin来使表格可排序。现在这两个工作没有问题,当我只是在Lazy插件中定义Tablesorter然后像这样使用Tablesorter:

$('#table_id').tablesorter();

以上内容按预期工作,按需加载Tablesorter库,HTML表格变为可排序。但是,我需要向tablesorter添加自定义解析器,如下所示:

$.tablesorter.addParser({ 
  id: 'my_parser', 
  is: function(s) { 
    return false; 
  }, 
  format: function(s) { 
    var result = s.match(/([0-9]+)/);
    if (result == null) return 0;
    return parseInt(result[0]);
  }, 
  type: 'numeric' 
}); 

以上addParser代码的问题是,我得到错误“$ .tablesorter没有方法'addParser'”。如果已经加载了TableSorter插件,它就没有区别。懒惰插件用自己的函数覆盖$ .tablesorter,并且不允许这个调用之王 - 我猜想。

behaviour can be seen here in this jsFiddle的示例。

任何人都可以帮助我吗?我非常感谢任何帮助或想法。提前谢谢。

2 个答案:

答案 0 :(得分:2)

只是为了证明我的观点yepnope.js可以很容易地做你需要的事情(例如,如果周围有任何可排序的表格,则有条件地加载tablesorter插件):

$(function () {
 yepnope({
    test    : $("table.sortable").length,
    yep     : "/resources/jquery.tablesorter.js",
    complete: function () {
      $.tablesorter.addParser({
        // whatever;
      });
      $("table.sortable").tablesorter();
    }
  });
});

答案 1 :(得分:1)

您收到此错误是正常的。 Lazy插件的工作方式是为您在选项中提供的name创建代理。

所以实际上$.tablesorter是(在控制台中查看):

$.tablesorter:
function proxy() {
    var self = this;
        arg = arguments;

        if( $.lazy.archive[src].status === 'loaded' ) {

            $.each(this,function(){
                $(this)[name].apply(self,arg);
            });

        } else if ( $.lazy.archive[src].status === 'loading' ) {
            $.lazy.archive[src].que.push({'name':name,'self':self,'arguments':arg});

        ...

如果插件已加载到$.lazy.archive,它会将其应用于您调用tablesorter()的元素,否则它会首先加载该插件,然后对其进行操作。

因此,您没有插件通常提供的原始命名空间,在您的上下文中,您不能使用$.tablesorter.addParser