Duck Punching / Monkey Patching打破了Tablesorter

时间:2014-02-07 17:48:03

标签: javascript jquery csv tablesorter monkeypatching

我有一个文本框,输入逗号分隔/分隔值,我必须确保它具有唯一条目。解决了使用Paul Irish's Duck Punching example #2并将其绑定到该文本框的onblur。

输入文本框的值会分成表格。由于表格可能非常冗长,我发现Mottie's Tablesorter能够很好地工作。

问题是,Duck Punching代码打破了Tablesorter。 Tablesorter的样式传递得很好,但表实际上并没有排序。但是,当我评论Duck Punching代码时,Tablesorter奇迹般地起作用。

我的编码技巧并不能让我弄清楚为什么这两者是冲突的。非常感谢任何帮助。

我没有修改Tablesorter代码或添加任何特殊的排序元素......只是按照现在的基本示例。这是Duck Punching代码,我只修改了包含我需要有唯一条目的文本框的var。

 function ValidateTextBox1()
{    
(function($){
var arr = document.getElementById("TextBox1").value.split(',');
    var _old = $.unique;

    $.unique = function(arr){

        // do the default behavior only if we got an array of elements
        if (!!arr[0].nodeType){
            return _old.apply(this,arguments);
        } else {
            // reduce the array to contain no dupes via grep/inArray
            return $.grep(arr,function(v,k){
                return $.inArray(v,arr) === k;
            });
        }
    };
})(jQuery);

 }

上面的函数位于一个单独的js文件中,该文件通过onblur为TextBox1调用。

然后,我有一个按钮,它运行以下内容:

function GenerateTable()
{  

var Entry1 = document.getElementById("TextBox1").value
var Entry2 = document.getElementById("TextBox2").value
var content = "<table id=myTable class=tablesorter ><thead><tr><th>Entry 1 Values</th><th>Entry 2 Value</th></tr></thead><tbody>"
var lines = Entry1.split(","),
i;
for (i = 0; i < lines.length; i++)
    content += "<tr><td>" + (Entry1.split(",")[i]) + "</td><td>" + Entry2 + "</td></tr>";
    content += "</tbody></table>"


$("#here_table").append(content);
$(function(){
  $("#myTable").tablesorter({
      theme: 'default'
 });
});

}

该函数将在特定DIV中生成/附加表。

如果我留下TextBox1的验证码,该表将生成但不可排序(尽管它确实设法仍然拉动主题)。

如果删除验证码,表格将生成并可排序。

1 个答案:

答案 0 :(得分:1)

上面的validateText框函数将无法按预期工作。在这种情况下,甚至不需要“打鸭”。

以下是我将如何修复脚本(demo):

HTML

<textarea id="textbox1">6,1,7,5,3,4,3,2,4</textarea><br>
<textarea id="textbox2">column 2</textarea><br>
<button>Build Table</button>
<div id="here_table"></div>

脚本(需要jQuery 1.7 +)

(function($) {

    // bind to button
    $(function () {
        $('button').on('click', function () {
            // disable button to prevent multiple updates
            $(this).prop('disabled', true);
            generateTable();
        });
    });

    function unique(arr) {
        return $.grep(arr, function (v, k) {
            return $.inArray(v, arr) === k;
        });
    }

    function generateTable() {
        var i,
            $wrap = $('#here_table'),
            // get text box value, remove unwanted
            // spaces/tabs/carriage returns & create an array
            val = $('#textbox1').val().split(/\s*,\s*/),
            // get unique values for Entry1
            entry1 = unique( val ),
            entry2 = $('#textbox2').val(),
            content = "";
        // build tbody rows
        for (i = 0; i < entry1.length; i++) {
            content += "<tr><td>" + (entry1[i] || '?') + "</td><td>" + entry2 + "</td></tr>";
        }
        // update or create table
        if ($wrap.find('table').length) {
            // table exists, just update the data
            $wrap.find('tbody').remove();
            $wrap.find('table')
                .append(content)
                .trigger('update');
        } else {
            // table doesn't exist, build it from scratch
            $wrap
                .html('<table id=myTable class=tablesorter><thead><tr>' +
                    '<th>Entry 1 Values</th>' +
                    '<th>Entry 2 Value</th>' +
                    '</tr></thead><tbody>' + content + '</tbody></table>')
                .find('table')
                .tablesorter({
                    theme: 'blue'
                });
        }
        // enable the button to allow updating the table
        $('button').prop('disabled', false);
    }

})(jQuery);

我尝试添加一些注释,以便更清楚地说明每个步骤的作用。请随时要求澄清。