2013-10-15 5 views
5

के आधार पर सामग्री के पन्नों मैं तो जैसे सरल डेटा ग्रिड है:लोड और हटाने स्क्रॉल दिशा और ऊंचाई

<div class="uiGridContent"> 
    <table> 
     <tbody id="page-1"> 
      <tr> 
       <td>Cell 1</td> 
       <td>Cell 2</td> 
       <td>Cell 3</td> 
      </tr> 
     </tbody> 
    </table> 
</div> 

* ध्यान दें कि मैं ऊपर और नीचे uiGridContent divs में एक शीर्ष लेख और अलग तालिकाओं में पाद लेख है div। इस उदाहरण के लिए इसकी आवश्यकता नहीं है।

var nextPage = 1, lastScrollTop = 0, st; 

$('.uiGridContent').scroll(function(){ 

    var st = $(this).scrollTop(); 

    // We're scrolling down 
    if (st > lastScrollTop){ 

     if($('.uiGridContent').scrollTop() + $('.uiGridContent').innerHeight() >= $('.uiGridContent')[0].scrollHeight && nextPage < 10) { 

      $.ajax({ 
       url: '<?php echo $appurl; ?>?page=' + nextPage, 
       success: function(data) { 
        nextPage = nextPage + 1; 
        var content = $(data).find('.uiGrid tbody').html(); 

        $('.uiGridContent tbody').last().after('<tbody id="page-'+nextPage+'">'+content+'</tbody>'); 

       }, 
       error: function(data) { 

        alert(data); 

       } 
      }); 

     } 

     lastScrollTop = st; 


    // We're scrolling up 
    } else { 

     if($('.uiGridContent').scrollTop() + $('.uiGridContent').innerHeight() >= $('.uiGridContent tbody').last().height()) { 

      var pageToRemove = $('.uiGridContent tbody').last(); 

      if(pageToRemove.attr('id') != 'page-1') { 
       pageToRemove.remove(); nextPage = nextPage - 1; 

      } else { 
       $('.uiGridContent').scrollTo(0,0); 
      } 

     } 

     lastScrollTop = st; 

    } 

}); 

विचार किया जा रहा है कि उपयोगकर्ता स्क्रॉल तालिका नीचे के रूप में, यह अगले पृष्ठ में लोड होगा जब वे gridcontent div में पिछले tbody के नीचे पहुंच जाते हैं। जो ठीक काम करता है!

समस्या स्क्रॉलिंग बैक अप के साथ निहित है। जहां योजना इसे बनाना है ताकि उपयोगकर्ता आखिरी टैब्स के पीछे बैक अप हो जाए, जब तक कि वे केवल एक शेष शेष (इस मामले में मूल) के साथ समाप्त न हो जाएं। वास्तव में क्या होता है जैसे ही वे स्क्रॉल करना शुरू करते हैं, यह पहले को छोड़कर उन सभी को हटा देता है, या कभी-कभी स्क्रॉल अप को याद करता है और उपयोगकर्ता को अन्य सभी tbodys को हटाए बिना शीर्ष पर ले जाता है।

कोई विचार? मुझे लगता है कि समस्या अगर कथन के साथ है:

if($('.uiGridContent').scrollTop() + $('.uiGridContent').innerHeight() >= $('.uiGridContent tbody').last().height()) { 

स्क्रॉल अप अनुभाग के तहत।

if ($('.uiGridContent').scrollTop() + $('.uiGridContent').innerHeight() >= $('.uiGridContent tbody').last().height())

यह क्या है या नहीं .uiGridContent की scrollTop प्लस यह .innerHeight() की ऊंचाई से अधिक है है पूछ रहा है:

उत्तर

2

हाँ, तुम सही हो, समस्या यह है कि हालत if बयान में प्रयोग किया जाता है अंतिम tbody तत्व। यह पूछने के समान है कि क्या स्क्रोल करने योग्य फलक का निचला tbody तत्व की ऊंचाई से नीचे है यदि यह .uiGridContent के शीर्ष पर स्थित था। यह वही नहीं है जो आप चाहते हैं।

आप क्या पूछना चाहते हैं कि स्क्रॉल करने योग्य फलक का निचला भाग tbody तत्व के शीर्ष से ऊपर है या नहीं। जब से तुम केवल पिछले एक के बारे में परवाह है, तो आप उपयोग कर सकते हैं:

if ($('.uiGridContent').scrollTop() + $('.uiGridContent').innerHeight() <= ($this[0].scrollHeight - $('.uiGridContent tbody').last().height()))

हालांकि आप वास्तव में चाहते हैं $(...) करने के लिए उन दोहराया कॉल कैशिंग जा करने के लिए के रूप में मैं इस डेमो में है:

http://jsfiddle.net/anmkU/3/

और आप scrollBottom (सामग्री के निचले भाग और दृश्यमान क्षेत्र के नीचे की दूरी के बीच की दूरी) के विचार को कैश करना चाहते हैं, क्योंकि आप इसका उपयोग कर रहे हैं, और यह शायद आर की मदद करता है व्यवहार्यता:

http://jsfiddle.net/anmkU/5/

संबंधित मुद्दे