2013-06-18 21 views
0

我想在過濾選項的div中實現無限滾動,以及在用戶停止在框中鍵入時過濾應該工作。jQuery插件函數中的綁定函數

HTML:

<div class="span2" style="margin-top: 50px;"> 
    <input id="Search" class="input-mysize" /> 

    <div id="listNav" style="height: 370px; border: 1px solid; overflow: auto; margin-right: 20px; width: 90%;"> 
    </div> 
</div> 

JS在HTML:

$(function() { 

    function onSuccess(row, container) { 
     container.append('<div style="border:1px solid; cursor: hand; cursor: pointer;" >' + 

           '<table border="0">' + 
            '<tr>' + 
            '<td id="Location' + row.Id + '">'+ 
              '<b>Name: </b>' + row.Name + '</br >' + '<b>Address: </b>' + row.Address + '' + 
            '</td>' + 
            '<td onclick="locationDetails(' + row.Id + ')"> > </td>' + 
            '</tr>' + 
           '</table>' + 
         '</div>'); 

     var tdId = "Location" + row.Id; 
     var element = $('#' + tdId); 
     $(element).click(function() { 
      google.maps.event.trigger(arrMarkers[row.Id], 'click'); 
     }); 
    }; 

    //... 
    $('#listNav').empty(); 
    $('#listNav').jScroller("/Dashboard/GetClients", { 
     numberOfRowsToRetrieve: 7, 
     onSuccessCallback: onSuccess, 
     onErrorCallback: function() { 
      alert("error"); 
     } 
    }); 

    //... 

    $('#Search').keyup(function(){ 
     clearTimeout(typingTimer); 
     if ($('#myInput').val) { 
      typingTimer = setTimeout(doneTyping, doneTypingInterval); 
     } 
    }); 

    function doneTyping() { 
     startInt = startInt + 5; 
     $('#listNav').empty(); 
     $('#listNav').unbind(); 
     $('#listNav').jScroller("/Dashboard/GetClients", { 
      numberOfRowsToRetrieve: 7, 
      start : startInt, 
      locationFilter: $('#Search').val(), 
      onSuccessCallback: onSuccess, 
      onErrorCallback: function() { 
       alert("error"); 
      } 
     }); 
    }; 
}); 

JS的其餘部分(根據jScroller插上):

(function ($) { 
"use strict"; 
jQuery.fn.jScroller = function (store, parameters) { 

    var defaults = { 
     numberOfRowsToRetrieve: 10, 
     locationFilter: '', 
     onSuccessCallback: function (row, container) { }, 
     onErrorCallback: function (thrownError) { window.alert('An error occurred while trying to retrive data from store'); }, 
     onTimeOutCallback: function() { }, 
     timeOut: 3 * 1000, 
     autoIncreaseTimeOut: 1000, 
     retryOnTimeOut: false, 
     loadingButtonText: 'Loading...', 
     loadMoreButtonText: 'Load more', 
     fullListText: 'There is no more items to show', 
     extraParams: null 
    }; 
    var options = jQuery.extend(defaults, parameters); 
    var list = jQuery(this), 
     end = false, 
     loadingByScroll = true; 

    var ajaxParameters; 

    if (options.extraParams === null) { 
     ajaxParameters = { 
      start: 0, 
      numberOfRowsToRetrieve: options.numberOfRowsToRetrieve, 
      locationFilter: options.locationFilter 
     }; 
    } 
    else { 
     ajaxParameters = { 
      start: 0, 
      numberOfRowsToRetrieve: options.numberOfRowsToRetrieve, 
      locationFilter: option.locationFilter, 
      extraParams: options.extraParams 
     }; 
    } 

    list.html(''); 

    function loadItems() { 
     preLoad(); 
     jQuery.ajax({ 
      url: store, 
      type: "POST", 
      data: ajaxParameters, 
      timeOut: options.timeOut, 
      success: function (response) { 
       list.find("#jscroll-loading").remove(); 
       if (response.Success === false) { 
        options.onErrorCallback(list, response.Message); 
        return; 
       } 
       for (var i = 0; i < response.data.length; i++) { 
        if (end === false) { 
         options.onSuccessCallback(response.data[i], list); 
        } 
       } 
       if (loadingByScroll === false) { 
        if (end === false) { 
         list.append('<div><a class="jscroll-loadmore">' + options.loadMoreButtonText + '</a></div>'); 
        } 
       } 

       ajaxParameters.start = ajaxParameters.start + options.numberOfRowsToRetrieve; 

       if (ajaxParameters.start >= response.total) { 
        end = true; 
        list.find('#jscroll-fulllist').remove(); 
        list.find(".jscroll-loadmore").parent("div").remove(); 
       } 
      }, 
      error: function (xhr, ajaxOptions, thrownError) { 
       if (thrownError === 'timeout') { 
        options.onTimeOutCallback(); 

        if (options.retryOnTimeOut) { 
         options.timeOut = options.timeOut + (1 * options.autoIncreaseTimeOut); 
         loadItems(); 
        } 
       } 
       else { 
        options.onErrorCallback(thrownError); 
       } 
      } 
     }); 
    } 

    function preLoad() { 
     if (list.find("#jscroll-loading").length === 0) { 
      list.find(".jscroll-loadmore").parent("div").remove(); 
      list.append('<a id="jscroll-loading">' + options.loadingButtonText + '</a>'); 
     } 
    } 

    //called when doneTyping is called and first time page loaded 
    jQuery(document).ready(function() { 
     loadItems(); 
    }); 


    //called when user scrolls down in a div 
    $('#listNav').bind('scroll', function() { 
     if ($(this).scrollTop() + $(this).innerHeight() >= $(this)[0].scrollHeight) { 
      loadItems(); 
     } 
    }); 

}; 
})(jQuery); 

這主要是工作,但在某些用戶停止打字時的情況

jQuery(document).ready(function() { 
    loadItems(); 
}); 

$('#listNav').bind('scroll', function() { 
    if ($(this).scrollTop() + $(this).innerHeight() >= $(this)[0].scrollHeight) { 
     loadItems(); 
    } 
}); 

都稱爲,而不只是第一個,增加不良HTML到div。大多數情況下只有jQuery(document).ready被調用,這就是我需要的

爲什麼每次調用doneTyping()時都會調用jQuery(document).ready()?我雖然它應該只在DOM準備就緒後第一次加載頁面。

+0

很奇怪。您的第一個片段和第二個片段都不會與用戶輸入有關。同一個'jQuery(document).ready()'不可能被多次調用。 –

+0

@Kevin B,函數doneTyping()在第四個片段。 – mishap

+0

我指的是開頭的文字。你說,當用戶停止輸入時,這兩個代碼段都會被調用。當用戶停止輸入時,它們都不應該被調用。 –

回答

-1

我假設您的HTML中的JS代碼以$(document).ready({})開頭,因此您不需要在插件中添加$(document).ready({})。只需撥打loadItems();而無需準備文件事件。

+0

而這將對代碼產生影響,實際上不應該是這個問題的建議答案。 – Archer

+0

@Archer所以你說在已經初始化的插件裏面添加'$(document).ready ...'是個好主意? : -/ –

+1

@MarceloPascual不,你的建議是一個很好的做法,***然而***,它與這個問題中提出的問題無關,並不會幫助解決它。 –