我可以组合这两个jQuery块吗?

时间:2012-08-26 16:38:55

标签: jquery

我的代码中有这些块:

$.fn.dataTableExt.afnSortData['dom-text'] = function (oSettings, iColumn) {
    var aData = [];
    $('td:eq(' + iColumn + ') input', oSettings.oApi._fnGetTrNodes(oSettings)).each(function () {
        aData.push(this.value);
    });
    return aData;
}

$.fn.dataTableExt.afnSortData['dom-data-rk'] = function (oSettings, iColumn) {
    var aData = [];
    $('td:eq(' + iColumn + ')', oSettings.oApi._fnGetTrNodes(oSettings)).each(function () {
        aData.push($(this).attr('data-rk'));
    });
    return aData;
}

这是什么意思:$ .fn.dataTableExt我不熟悉$ .fn。

我也可以将这两个结合起来吗?

3 个答案:

答案 0 :(得分:1)

dom-textdom-data-rk属性不同,因此您无法将它们100%合并到同一个块中。此外,功能实现略有不同:

  • 'td:eq(...) input''td:eq(...)'
  • aData.push(this.value) vs aData.push($(this).attr('data-rk')

使用jQuery.extend:

$.extend($.fn.dataTableExt.afnSortData, {
  'dom-text': function(oSettings, iColumn) { ... },
  'dom-data-rk': function(oSettings, iColumn) { ... }
});

答案 1 :(得分:1)

您可以做的是将$.each与包含差异的对象一起使用。然后,每个函数的通用代码路径可以是相同的。但是,鉴于这些功能已经很简洁并且存在一些差异,实际上并没有更简洁的解决方案:

$.each({
  'dom-text': {
    selector: function(i) { return 'td:eq(' + i + ') input'; },
    item: function(elem) { return elem.value; }
  },
  'dom-data-rk': {
    selector: function(i) { return 'td:eq(' + i + ')'; },
    item: function(elem) { return $(elem).data('rk'); }
  }
}, function(key, descriptor) {
  $.fn.dataTableExt.afnSortData[key] = function(oSettings, iColumn) {
    var aData = [];

    $(oSettings.oApi._fnGetTrNodes(oSettings))
      .find(descriptor.selector(iColumn))
      .each(function () {
          aData.push(descriptor.item(this));
      });

    return aData;
  };
});

答案 2 :(得分:0)

由于它们具有不同的输入和输出,因此将它们组合起来不是一个好主意。从我所看到的,第一个获取指定列的输入值,并将它们添加到数组。第二个获取属性名称data-rk并将它们添加到数组中。

如果你真的必须将它们组合起来,你可以将输出添加到不同的列表,但是你必须使用IFs语句来检查它的排序类型,这将是一种......