2010-09-07 68 views
2

我正在使用jlinq庫將linq擴展爲json,因此我篩選了我的json數據。考慮我有一個json數據,在頁面加載100行時繪製一個yui數據表。我正在做一個客戶端過濾器,這將減少我的JSON數據,現在我正在重繪相同的數據表。什麼情況是它工作得很好,但一個惱人的閃爍效果...更新YUI時避免頁面閃爍DataTable

我叫下面的方法從的onkeyup事件過濾文本框,

function showusersfilter(txt) { 
    var jsondata = document.getElementById("ctl00_ContentPlaceHolder1_HfJsonString").value; 
    jsondata = jQuery.parseJSON(jsondata); 
    var results = jLinq.from(jsondata.Table) 
       .startsWith("name", txt) 
       .select(); 
    var jsfilter = { "Table": results }; 

    var myColumnDefs = [ 
     { key: "userid", label: "UserId", hidden: true }, 
     { key: "name", label: "Name", sortable: true, sortOptions: { defaultDir: YAHOO.widget.DataTable.CLASS_DESC} }, 
     { key: "designation", label: "Designation" }, 
     { key: "phone", label: "Phone" }, 
     { key: "email", label: "Email" }, 
     { key: "role", label: "Role", sortable: true, sortOptions: { defaultDir: YAHOO.widget.DataTable.CLASS_DESC} }, 
     { key: "empId", label: "EmpId" }, 
     { key: "reportingto", label: "Reporting To", sortable: true, sortOptions: { defaultDir: YAHOO.widget.DataTable.CLASS_DESC} }, 
     { key: "checkbox", label: "", formatter: "checkbox", width: 20 } 
    ]; 
    var jsonObj = jsfilter; 
    var target = "datatable"; 
    var hfId = "ctl00_ContentPlaceHolder1_HfId"; 
    generateDatatable(target, jsonObj, myColumnDefs, hfId); 
} 

我的文本框看起來

<asp:TextBox ID="TxtUserName" runat="server" CssClass="text_box_height_14_width_150" onkeyup="showusersfilter(this.value);"></asp:TextBox> 

和我生成的功能,

function generateDatatable(target, jsonObj, myColumnDefs, hfId) { 
    var root; 
    for (key in jsonObj) { 
     root = key; break; 
    } 
    var rootId = "id"; 
    if (jsonObj[root].length > 0) { 
     for (key in jsonObj[root][0]) { 
      rootId = key; break; 
     } 
    } 
    YAHOO.example.DynamicData = function() { 
     var myPaginator = new YAHOO.widget.Paginator({ 
      rowsPerPage: 25, 
      template: YAHOO.widget.Paginator.TEMPLATE_ROWS_PER_PAGE, 
      rowsPerPageOptions: [10, 25, 50, 100], 
      pageLinks: 10 
     }); 

     // DataSource instance 
     var myDataSource = new YAHOO.util.DataSource(jsonObj); 
     myDataSource.responseType = YAHOO.util.DataSource.TYPE_JSON; 
     myDataSource.responseSchema = { resultsList: root, fields: new Array() }; 
     myDataSource.responseSchema.fields[0] = rootId; 
     for (var i = 0; i < myColumnDefs.length; i++) { 
      myDataSource.responseSchema.fields[i + 1] = myColumnDefs[i].key; 
     } 
     // DataTable configuration 
     var myConfigs = { 
      sortedBy: { key: myDataSource.responseSchema.fields[1], dir: YAHOO.widget.DataTable.CLASS_ASC }, // Sets UI initial sort arrow 
      paginator: myPaginator 
     }; 
     // DataTable instance 
     var myDataTable = new YAHOO.widget.DataTable(target, myColumnDefs, myDataSource, myConfigs); 
     myDataTable.resizeHack = function() 
     { this.getTbodyEl().parentNode.style.width = "100%"; } 
     myDataTable.subscribe("rowMouseoverEvent", myDataTable.onEventHighlightRow); 
     myDataTable.subscribe("rowMouseoutEvent", myDataTable.onEventUnhighlightRow); 
     myDataTable.subscribe("rowClickEvent", myDataTable.onEventSelectRow); 
     myDataTable.subscribe("checkboxClickEvent", function(oArgs) { 
      var hidObj = document.getElementById(hfId); 
      var elCheckbox = oArgs.target; 
      var oRecord = this.getRecord(elCheckbox); 
      var id = oRecord.getData(rootId); 
      if (elCheckbox.checked) { 
       if (hidObj.value == "") { 
        hidObj.value = id; 
       } 
       else { 
        hidObj.value += "," + id; 
       } 
      } 
      else { 
       hidObj.value = removeIdFromArray("" + hfId, id); 
      } 
     }); 
     myPaginator.subscribe("changeRequest", function() { 

      if (document.getElementById(hfId).value != "") { 
       if (document.getElementById("ConfirmationPanel").style.display == 'block') { 
        document.getElementById("ConfirmationPanel").style.display = 'none'; 
       } 
       document.getElementById(hfId).value = ""; 
      } 
      return true; 
     }); 
     myDataTable.handleDataReturnPayload = function(oRequest, oResponse, oPayload) { 
      oPayload.totalRecords = oResponse.meta.totalRecords; 
      return oPayload; 
     } 
     return { 
      ds: myDataSource, 
      dt: myDataTable 
     }; 
    }(); 
} 

編輯:

我甚至使用上仍閃爍發生keyup事件的延遲,

var timer; 
    function chk_me(){ 
     clearTimeout(timer); 
     timer = setTimeout(function validate(){ showusersfilter(document.getElementById("ctl00_ContentPlaceHolder1_TxtUserName").value);}, 1000); 
    } 

回答

1

爲什麼每次過濾數據時都要創建一個新的dataTable?你不需要這個任務。 只需提供該過濾的數據到它的dataTable通過使用其數據源sendRequest將方法

我創建這個JSONObject的要模擬濾波數據

var jsonObject = { 
    "root":[ 
     {id:"5", userid:"1", name:"ar", designation:"1programmer", phone:"15484-8547", email:"[email protected]", role:"1developer", empId:"1789", reportingto:"116"}, 
     {id:"5", userid:"2", name:"br", designation:"2programmer", phone:"25484-8547", email:"[email protected]", role:"2developer", empId:"2789", reportingto:"216"}, 
     {id:"5", userid:"3", name:"cr", designation:"3programmer", phone:"35484-8547", email:"[email protected]", role:"3developer", empId:"3789", reportingto:"316"}, 
     {id:"5", userid:"4", name:"dr", designation:"4programmer", phone:"45484-8547", email:"[email protected]", role:"4developer", empId:"4789", reportingto:"416"}, 
     {id:"5", userid:"5", name:"er", designation:"5programmer", phone:"55484-8547", email:"[email protected]", role:"5developer", empId:"5789", reportingto:"516"} 
    ], 
    "another":[ 
     {id:"5", userid:"5", name:"er", designation:"5programmer", phone:"55484-8547", email:"[email protected]", role:"5developer", empId:"5789", reportingto:"516"}, 
     {id:"5", userid:"4", name:"dr", designation:"4programmer", phone:"45484-8547", email:"[email protected]", role:"4developer", empId:"4789", reportingto:"416"}, 
     {id:"5", userid:"3", name:"cr", designation:"3programmer", phone:"35484-8547", email:"[email protected]", role:"3developer", empId:"3789", reportingto:"316"}, 
     {id:"5", userid:"2", name:"br", designation:"2programmer", phone:"25484-8547", email:"[email protected]", role:"2developer", empId:"2789", reportingto:"216"}, 
     {id:"5", userid:"1", name:"ar", designation:"1programmer", phone:"15484-8547", email:"[email protected]", role:"1developer", empId:"1789", reportingto:"116"} 
    ] 
}; 

當初始化

(function() { 
    var Yutil  = YAHOO.util, 
     Ywidget = YAHOO.widget 

     DataTable = Ywidget.DataTable, 
     Paginator = Ywidget.Paginator, 
     DataSource = Yutil.DataSource; 

    YAHOO.namespace("_3657287"); // QUESTION ID - SEE URL 

    var _3657287 = YAHOO._3657287; 

    /** 
     * paginator 
     */ 
    var paginator = new Paginator({ 
     rowsPerPage:25, 
     template:Paginator.TEMPLATE_ROWS_PER_PAGE, 
     rowsPerPageOptions:[10, 25, 50, 100], 
     pageLinks:10 
    }); 

    /** 
     * dataSource 
     * 
     * As you have static data, I pass an empty "jsonObject" to its constructor 
     */ 
    var dataSource = new DataSource({root:[]}); 
    dataSource.responseType = DataSource.TYPE_JSON; 
    dataSource.responseSchema = {resultsList:"root", fields:[]}; 

    var columnSettings = [ 
     {key:"userid", label:"UserId"}, 
     {key:"name", label:"Name"}, 
     {key:"designation", label:"Designation"}, 
     {key:"phone", label:"Phone"}, 
     {key:"email", label:"Email"}, 
     {key:"role", label:"Role"}, 
     {key:"empId", label:"EmpId"}, 
     {key:"reportingto", label:"Reporting To"} 
    ]; 

    dataSource.responseSchema.fields[0] = "id"; 
    for (var i = 0; i < columnSettings.length; i++) { 
     dataSource.responseSchema.fields[i + 1] = columnSettings[i].key; 
    } 

    /** 
     * Notice initialLoad equal To false (I suppose your dataTable IS NOT pre-populated) 
     */ 
    var dataTableSettings = { 
     paginator:paginator, 
     initialLoad:false 
    }; 

    /** 
     * dataTable 
     * 
     * Notice IT IS STORED in the namespace YAHOO._3657287 
     */ 
    _3657287.dataTable = new DataTable("container", columnSettings, dataSource, dataTableSettings); 
})(); 

現在,當你想要過濾您的數據,請按以下步驟操作(注意sendRequest方法)

var i = 0; 
YAHOO.util.Event.addListener("reload", "keyup", function(e) { 
    YAHOO._3657287.dataTable.getDataSource().sendRequest(null, { 
     success:function(request, response, payload) { 

      /** 
       * initializeTable method clear any data stored by The datatable 
       */ 
      this.initializeTable(); 

      if(i === 0) { 
       this.getRecordSet().setRecords(jsonObject["root"], 0); 

       i++; 
      } else { 
       this.getRecordSet().setRecords(jsonObject["another"], 0); 

       i--; 
      } 

      this.render(); 
     }, 
     scope:YAHOO._3657287.dataTable, 
     argument:null 
    }); 
}); 

你可以看到here它工作正常

但如果效果再次出現(請注意,我只是用相關的部分 - 也沒有特殊的功能也不別的東西)就可以發生的原因

  • KeyUp事件
  • dataTable的渲染

你可以設置變量如下

var isProcessing = false; 

YAHOO.util.Event.addListener("reload", "keyup", function(e) { 
    if(isProcessing) { 
     return; 
    } 

    isProcessing = true; 

    YAHOO._3657287.dataTable.getDataSource().sendRequest(null, { 
     success:function(request, response, payload) { 
      // as shown above 

      isProcessing = false; 
     } 
    }); 
} 

另請參見herehere

+0

工作完美.. – 2010-09-15 03:43:29

0

的問題可能與線路:由於您調整

myDataTable.resizeHack = function() 
     { this.getTbodyEl().parentNode.style.width = "100%"; } 

表格的寬度,假設表格需要在屏幕上重新繪製導致閃爍是合理的。

+0

任何建議,以避免它... – 2010-09-14 04:20:59

+0

如果你刪除線,閃爍消失? – 2010-09-14 05:41:21

+0

它沒有逃脫。任何其他建議。但閃爍已經減少,仍然有少量閃爍正在發生。 – 2010-09-14 07:19:05