jQuery DataTable не определен

#javascript #php #jquery #html #jquery-datatables

#javascript #php #jquery #HTML #таблицы данных

Вопрос:

У меня есть две таблицы данных, определенные в $ (document).готово() следующим образом:

 oProdTable1 = $('#productstable1').dataTable( {...} );
oProdTable2 = $('#productstable2').dataTable( {...} );
  

За пределами $(document).ready(), я пытаюсь перезагрузить их. Когда я устанавливаю точку останова в следующей функции успеха, я обнаруживаю, что oProdTable1 определен, но oProdTable2 не определен:

 function addProduct(productLine) {

    $.ajax({
        type: "POST",
        url: 'ajax-add-product.php',
        data: { productLine: productLine},
        success: function(data) {
            oProdTable1.fnReloadAjax();
            oProdTable2.fnReloadAjax();
        }
    }); 
}
  

Я не могу найти разницу между определениями этих двух таблиц. Мне также интересно, почему oProdTable1 не нужно объявлять с помощью «var», но он определен. Есть идеи?

РЕДАКТИРОВАТЬ: Я должен отметить, что oProdTable1 отображается правильно, но oProdTable2 требует, чтобы я щелкал для сортировки по столбцу, чтобы отображались строки.

ПРАВКА 2: я попытался поместить addProduct () внутрь $(document).готово(). Значение oProdTable1 по-прежнему не определено, а значение oProdTable2 по-прежнему не определено. Я попытался поместить oProdTable2 перед oProdTable1, и теперь oProdTable1 даже не загружается, и обе таблицы не определены!

ПРАВКА 3: Каждая DataTable в коде после oProdTable2 не загружается и не определена. Я сравнил код oProdTable1 и oProdTable2 с помощью плагина Notepad compare и не могу найти каких-либо существенных различий, таких как отсутствие фигурных скобок, которые, как я думаю, могли вызвать это.

EDIT4: Вот код для oProdTable2, который кажется проблематичным:

 oProdTable2 = $('#productstable2').dataTable( {
    "aaSorting": [[ 1, "asc" ]],
    "aoColumnDefs":[
    {"aTargets":[0],"bSearchable":false,"bVisible": false},
    {"aTargets":[1],"sWidth":"60px"},
    {"aTargets":[2],"sWidth":"200px"},
    {"aTargets":[3],"sWidth":"300px"},
    {"aTargets":[4],"sWidth":"60px"},
    {"aTargets":[5],"sWidth":"60px"},
    {"aTargets":[6],"sWidth":"60px"},
    {"aTargets":[7],"sWidth":"60px"},
    {"aTargets":[8],"sWidth":"60px"},
    {"aTargets":[9],"sWidth":"60px"},
    {"aTargets":[10],"sWidth":"60px"},
    {"aTargets":[11],"sWidth":"60px"},

    { "sClass": "usa", "aTargets": [ 4, 5 ] },
    { "sClass": "can", "aTargets": [ 6, 7 ] },
    { "sClass": "lat", "aTargets": [ 8, 9 ] },
    ],
    "iDisplayLength": 100, //sets item limit for table
    "bJQueryUI": true,
    "bProcessing": true,
    "bServerSide": true,
    "bSortCellsTop": true,
    //"bStateSave": true,
    "bSortClasses": false,
    "sDom": 'T<"clear">C<"fg-toolbar ui-widget-header ui-corner-tl ui-corner-tr ui-helper-clearfix"lfr>t<"fg-toolbar ui-widget-header ui-corner-bl ui-corner-br ui-helper-clearfix"ip>',
    "oTableTools": {
        "sRowSelect": "single",
        "sSwfPath": "/swf/copy_cvs_xls_pdf.swf",
        "aButtons": 
        [   
            //"Add Product" button

            {
                "sExtends":    "text",
                "sButtonText": "Add Product",                  
                "fnClick": function ( nButton, oConfig, oFlash ) {

                    addProduct("2");
                }
            },  
            {
                    "sExtends":    "collection",
                    "sButtonText": "Export",
                    "aButtons":    [    "copy","print","csv", "xls", "pdf" ]
            }
         ]

    },
    'sAjaxSource': 'ajax-getproductstable.php',

    "fnServerParams": function ( aoData ) {

       aoData.push( { "name": "productLine", "value": "2" } );

    },      
    "fnInitComplete": function() {
            var oSettings = $('#productstable2').dataTable().fnSettings();
            for ( var i=0 ; i<oSettings.aoPreSearchCols.length ; i   ){
                if(oSettings.aoPreSearchCols[i].sSearch.length>0){
                $("thead input")[i-1].value = oSettings.aoPreSearchCols[i].sSearch;
                $("thead input")[i-1].className = "activefilter";   }
            }
    },
    "fnRowCallback": function( nRow, aData, iDisplayIndex, iDisplayIndexFull ) {

        var id = aData[0];


        $(this.fnGetTds(nRow)[1]).addClass("editable").addClass("ref"); 
        $(this.fnGetTds(nRow)[2]).addClass("edit_area").addClass("name");           
        $(this.fnGetTds(nRow)[3]).addClass("edit_area").addClass("description");            
        $(this.fnGetTds(nRow)[4]).addClass("editable").addClass("price_rtl_usa");           
        $(this.fnGetTds(nRow)[5]).addClass("editable").addClass("price_dlr_usa");           
        $(this.fnGetTds(nRow)[6]).addClass("editable").addClass("price_rtl_can");       
        $(this.fnGetTds(nRow)[7]).addClass("editable").addClass("price_dlr_can");
        $(this.fnGetTds(nRow)[8]).addClass("editable").addClass("price_rtl_lat");       
        $(this.fnGetTds(nRow)[9]).addClass("editable").addClass("price_dlr_lat");       
        $(this.fnGetTds(nRow)[10]).addClass("editable").addClass("ins_val_rtl_usa");
        $(this.fnGetTds(nRow)[11]).addClass("editable").addClass("ins_val_dlr_usa");
        $(this.fnGetTds(nRow)[12]).addClass("editable").addClass("ins_val_rtl_can");
        $(this.fnGetTds(nRow)[13]).addClass("editable").addClass("ins_val_dlr_can");
        $(this.fnGetTds(nRow)[14]).addClass("editable").addClass("net_l");
        $(this.fnGetTds(nRow)[15]).addClass("editable").addClass("net_w");
        $(this.fnGetTds(nRow)[16]).addClass("editable").addClass("net_h");
        $(this.fnGetTds(nRow)[17]).addClass("editable").addClass("net_weight");
        $(this.fnGetTds(nRow)[18]).addClass("editable").addClass("packed_l");
        $(this.fnGetTds(nRow)[19]).addClass("editable").addClass("packed_w");
        $(this.fnGetTds(nRow)[20]).addClass("editable").addClass("packed_h");
        $(this.fnGetTds(nRow)[21]).addClass("editable").addClass("packed_weight");
        $(this.fnGetTds(nRow)[22]).addClass("editable").addClass("customs_cost");
        $(this.fnGetTds(nRow)[23]).addClass("editable").addClass("customs_desc");
        $(this.fnGetTds(nRow)[24]).addClass("editable").addClass("customs_code");
        $(this.fnGetTds(nRow)[25]).addClass("editable").addClass("customs_origin");
        $(this.fnGetTds(nRow)[26]).addClass("edit_area").addClass("note");


        $(nRow).attr("id", id);



        return nRow;
    },
    "fnDrawCallback": function () {


        // CODE FOR EDITABLE INLINES        
        $(".edit_area_w").editable('ajax-edit-product-inline.php', {
            type : 'mce',
            submit : 'OK',
            indicator : "Saving...",
            tooltip : 'Click to edit...',
            width : '500px',
            height : '100px',
            "callback": function( sValue, y ) { 
                $(this).removeClass('empty_edit');
                $("#productstable tr").removeClass("just_edited");
                $(this).parent().addClass("just_edited");
                var aPos = oProdTable2.fnGetPosition( this );
                var update = oProdTable2.fnUpdate( sValue, aPos[0], aPos[2], true, true);
            },
            "submitdata": function ( value, settings ) {
                return {
                    "row_id": this.parentNode.getAttribute('id'),
                    "column": oProdTable2.fnGetPosition( this )[2]
                };
            }
        });

        $('.editable').editable('ajax-edit-product-inline.php', {
            event     : "dblclick",
            "callback": function( sValue, y ) { 
                $(this).removeClass('empty_edit');
                $("#productstable tr").removeClass("just_edited");
                $(this).parent().addClass("just_edited");
                var aPos = oProdTable2.fnGetPosition( this );
                var update = oProdTable2.fnUpdate( sValue, aPos[0], aPos[2], true, true);
            },
            "submitdata": function ( value, settings ) {
                return {
                    "row_id": this.parentNode.getAttribute('id'),
                    "column": oProdTable2.fnGetPosition( this )[2]
                };
            },
            "height": "14px"
        } );

        $('.edit_area').editable('ajax-edit-product-inline.php', {
            event     : "dblclick",
            type      : "textarea",
            cancel    : 'Cancel',
            submit    : 'OK',
            indicator : '<img src="img/indicator.gif">',
            "callback": function( sValue, y ) { 
                $(this).removeClass('empty_edit');
                $("#productstable tr").removeClass("just_edited");
                $(this).parent().addClass("just_edited");
                var aPos = oProdTable2.fnGetPosition( this );
                oProdTable2.fnUpdate( sValue, aPos[0], aPos[2]);

            },
            "submitdata": function ( value, settings ) {
                return {
                    "row_id": this.parentNode.getAttribute('id'),
                    "column": oProdTable2.fnGetPosition( this )[2]
                };
            },

        } );

        $('.edit_select').editable('ajax-edit-product-inline.php', { 
            event     : "dblclick",
            loaddata: function ( value, settings ) {
                return {
                    "pid": $(this).parent().attr("id")
                };
            },
            loadurl : 'ajax-part-selects.php',
            loadtype: "GET",
            type   : 'select',
            submit : 'OK',
            "callback": function( sValue, y ) { 
                $(this).removeClass('empty_edit');
                $("#productstable tr").removeClass("just_edited");
                $(this).parent().addClass("just_edited");
                var aPos = oProdTable2.fnGetPosition( this );
                oProdTable2.fnUpdate( sValue, aPos[0], aPos[2]);

            },
            "submitdata": function ( value, settings ) {
                return {
                    "row_id": this.parentNode.getAttribute('id'),
                    "column": oProdTable2.fnGetPosition( this )[2]
                };
            },
        });



    }
} );

$("#productstable2  .floating_filters input").keyup( function () {
    // Filter on the column (the index) of this element
    oProdTable2.fnFilter( this.value, $(".floating_filters input").index(this) 1 );
    $(this).addClass("activefilter");
} );


$("#productstable2 .floating_filters input").each( function (i) {

    asInitVals[i] = this.value;
} );

$("#productstable2 .floating_filters input").focus( function () {

    if ( $(this).hasClass("search_init"))
    {
        this.className = "";
        this.value = "";
    }
} );

$("#productstable2 .floating_filters input").blur( function (i) {

    if ( this.value == "" )
    {
        $(this).removeClass("activefilter");
        $(this).addClass("search_init");
        this.value = asInitVals[$(".floating_filters input").index(this)];

    }
} );
  

Комментарии:

1. Вы пытаетесь перезагрузить таблицы до запуска document ready? Возможно, это условие гонки, если это так.

2. Нет, таблицы видны на странице при вызове функции.

3. не уверен, почему вы вызываете их извне события ready, но, возможно, было бы лучше определить эту функцию внутри события ready? вы уверены, что они видны, выполните оповещение (1);

4. У вас есть несколько $ (document). готовые функции()? Можете ли вы показать нам полный код JavaScript для этой страницы?

5. ну, попробуйте сохранить, oProdTable2 прежде чем oProdTable1 я предполагаю, что вы получите oProdTable1 , значение не определено. Если это так, то fnReloadAjax() является злодеем . дайте мне знать

Ответ №1:

Я, наконец, нашел решение! Проблема была даже не в коде javascript, а в html. В таблице с идентификатором «productstable2» было на один «td» меньше, чем «th». Мне просто нужно было добавить дополнительный <td></td> в список «td»s.