1

コンテキストメニュープラグインを使用してテーブルに行を追加する次のコードがあるため、下の行を追加するセルを右クリックできます。

(function($){
    function scanTable( $table ) {
        var m = [];
        $table.children( "tr" ).each( function( y, row ) {
            $( row ).children( "td, th" ).each( function( x, cell ) {
                var $cell = $( cell ),
                    cspan = $cell.attr( "colspan" ) | 0,
                    rspan = $cell.attr( "rowspan" ) | 0,
                    tx, ty;
                cspan = cspan ? cspan : 1;
                rspan = rspan ? rspan : 1;
                for( ; m[y] && m[y][x]; ++x );  //skip already occupied cells in current row
                for( tx = x; tx < x + cspan; ++tx ) {  //mark matrix elements occupied by current cell with true
                    for( ty = y; ty < y + rspan; ++ty ) {
                        if( !m[ty] ) {  //fill missing rows
                            m[ty] = [];
                        }
                        m[ty][tx] = true;
                    }
                }
                var pos = { top: y, left: x };
                $cell.data( "cellPos", pos );
            } );
        } );
    };

    /* plugin */
    $.fn.cellPos = function( rescan ) {
        var $cell = this.first(),
            pos = $cell.data( "cellPos" );
        if( !pos || rescan ) {
            var $table = $cell.closest( "table, thead, tbody, tfoot" );
            scanTable( $table );
        }
        pos = $cell.data( "cellPos" );
        return pos;
    }
})(jQuery);

appendMe();

function appendMe() {
    $('table.test td').find("em").remove()
    $('table.test td').removeAttr("realCellEq").append(function(){
        return "<em> " + $(this).cellPos().left + "</em>"
    }).attr("realCellEq", function() {
        return $(this).cellPos().left
    });
}

$(function () {
    $.contextMenu({
        selector: 'table.test td',
        items: {
            "addRowBelow": {
                name: "Add Row Below",
                callback: function (key, options) {
                    $(this).parents("tr").after("<tr class='freshAdd'></tr>");
                    $(this).parents("tr").find("td").each( function() {
                        var thisRowSpan = ($(this).attr("rowspan")) ? $(this).attr("rowspan") : 1;
                        if(thisRowSpan > 1) {
                            $(this).attr("rowspan", (parseInt($(this).attr("rowspan"),10)+1));
                        } else {
                            $(this).clone().appendTo("tr.freshAdd");
                        }
                    });
                    $("tr.freshAdd").find("td").html("");
                    $("tr.freshAdd").removeClass("freshAdd");
                    appendMe(); 
                }
            }
        }
    });
});

問題は、行スパンを考慮するために何をする必要があるかを理解できないことです。

これが私が何を意味するかを説明するためのjsfiddleです。

http://jsfiddle.net/many_tentacles/sqjak/1/

4

2 に答える 2

0

新しく追加されたセルを使用して新しいセルを追加できない理由は、これらの新しく追加されたセルには、context-menu-activeセルを追加するために作成した関数を禁止するというクラスが含まれているためです。

callback内部で次のような小さな変更を行う必要があります。

$(".context-menu-active").removeClass('context-menu-active');

これにより、新しく追加されたセルからクラスが削除されるため、再び使用できるようになります。

更新されたフィドルを見てください: http://jsfiddle.net/Q5PgG/

于 2013-09-23T12:32:21.880 に答える