La fonction AJAX ne fonctionne pas par scroll

en utilisant AJAX fin de défilement. Le contenu ne charge que la première fois, mais ne charge pas par scroll.

Quel est le problème?

jQuery:

function loadFeed() {
    $.ajax({
        url: 'loadmore.php',
        dataType: 'html',
        success: function (data) {
            $("#posts").append('<div class="havanagila"></div>');
            $('#posts').html(data);
        }
    });
}

loadFeed();
$(window).scroll(function () {
    var windowScroll = $(window).scrollTop();
    var windowHeight = $(window).height();
    var documentHeight = $(document).height();

    if ((windowScroll + windowHeight) == documentHeight) {
        loadFeed();
    }
});

loadmore.php:

<?php 
session_start();

if ( isset( $_SESSION['login'] ) ) {

    $login    = $_SESSION['login'];
    $id=$_SESSION['id'];

    $username="root";
    $password="root";
    $hostname = "localhost";
    $dbname= "kotik";


    function testdb_connect ($hostname, $username, $password){
        $dbh = new PDO("mysql:host=$hostname;dbname=kotik", $username, $password);
        return $dbh;
    }


    try {
        $dbh = testdb_connect ($hostname, $username, $password);

    } catch(PDOException $e) {
        echo $e->getMessage();
    }

}

?>

<?php                                                              

$title_select_query= $dbh -> prepare("SELECT title FROM books WHERE id = :id ORDER BY date DESC");
$title_select_query ->execute(array(':id' => $id));
$title_select_query_result = $title_select_query->fetchColumn(); 
echo($title_select_query_result);

$title_select_query_result = $title_select_query->fetchColumn(); 
echo($title_select_query_result);

$title_select_query_result = $title_select_query->fetchColumn(); 
echo($title_select_query_result);

$title_select_query_result = $title_select_query->fetchColumn(); 
echo($title_select_query_result);

$title_select_query_result = $title_select_query->fetchColumn(); 
echo($title_select_query_result);

?>
25
demandé sur ptCoder 2015-05-02 14:48:21

8 réponses

parce que vous remplacez le contenu de $('#posts'), la hauteur du document ne change pas après la première demande ajax sur scroll => donc vous devez faire défiler vers le haut , puis faire défiler vers le bas à nouveau pour déclencher une autre demande ajax. Parce que je ne connais pas la mise en page attendue, je vais donner une simple démo de base HTMLjsfiddle demo

<div id="main" style="height:200px; overflow-y : auto;">
    <div id="posts">
    </div>
</div>

javascript

var loadmoore = true,
    loaded_posts =0 ;
function gent_sample_data(num_posts){
    var i,
        sample_data = '';
    for(i=0;i<num_posts;i++) {
        sample_data += "<p class'post'>title_select_query_result " + (loaded_posts + i) + "</p>"; 
    }
    return sample_data;
}

function loadFeed(){
     // generate sample data
    var sample_data = gent_sample_data(15);
    loaded_posts = loaded_posts + 15;
    $.ajax({
        url : '/echo/html/',
        dataType: 'html',
        type: 'post',
        data: {'html':sample_data},
        success: function(returnhtml){
            console.log(returnhtml);
             // option 1 - add result into "havanaglia" div
            // var $post = $('<div class="havanagila"></div>');
            // $post.html(returnhtml);
            // $("#posts").append($post);

            // option 2 - ad result after "havanaglia" div
            $("#posts").append('<div class="havanagila"></div>');
            $("#posts").append(returnhtml); 
            loadmoore = true;
        }    
    });
}
loadFeed();

$("#main").scroll(function () { 
    if (loadmoore && $("main").scrollTop() >= ($("main").height()-100) ) {
       loadmoore = false;
       loadFeed();
    }
});

pour votre cas, je suggère d'utiliser quelque chose comme ceci:

var loadmoore= true;
function loadFeed() {
    $.ajax({
        url: 'loadmore.php',
        dataType: 'html',
        success: function (data) {
            var $havanaglia = $('<div class="havanagila"></div>');
            $havanaglia.html(data);
            $("#posts").append($havanaglia);
            loadmoore = true;
        }
    });
}

loadFeed();

$(window).scroll(function () { 
    if (loadmoore && $(window).scrollTop() >= $(document).height() - $(window).height()-100) {
        loadmoore= false;
       loadFeed();
    }
});

pour empêcher d'obtenir les mêmes postes à partir de la base de données, je recommande d'Envoyer à php l'id / le nombre du dernier poste chargé pour obtenir des postes avec l'id / le nombre > dernier poste chargé

13
répondu vasilenicusor 2015-05-07 14:11:18

si vous voulez charger AJAX fonction pour chaque événement scroll, il n'est pas nécessaire de vérifier if condition. simplement écrire..

$(window).scroll(function(){
        loadFeed();
});

et si vous voulez appeler le AJAX fonction si le rouleau a atteint le bas, vous devez vérifier l'état comme...

$(window).scroll(function(){
    if ($(window).scrollTop() == $(document).height() - $(window).height()){
        loadFeed();
    }
});
6
répondu Jayson 2015-05-02 12:06:49

changement que vous loadFeed() fonction de ce

function loadFeed() {
    $.ajax({
        url: 'loadmore.php',
        dataType: 'html',
        success: function (data) {
            $("#posts").append('<div class="havanagila"></div>');
            $('#posts').html($('#posts').html()+data);
        }
    });
}

c'est le changement que vous avez à faire $('#posts').html($('#posts').html()+data);

6
répondu Varun Naharia 2015-05-07 11:34:28

si je me souviens bien, je souffrais du même problème pour quelque chose de semblable. Ce que j'ai fait était d'arrêter l'écouteur de parchemin et de le redémarrer après le succès D'AJAX.

voici le code qui pourrait vous aider:

function loadFeed() {
    $.ajax({
        url: 'loadmore.php',
        dataType: 'html',
        success: function (data) {
            $("#posts").append('<div class="havanagila"></div>');
            $('#posts').html(data);
            $(window).on('scroll', function() {checkScroll()}); // Run the function again upon success
        }
    });
}

var checkScroll = function() {
  if ($('#SomeElementAlwaysAtTheBottomOfThePage')[0]) {
    var el = $('#SomeElementAlwaysAtTheBottomOfThePage');
    var bottom_of_object = el.offset().top + el.outerHeight();
    var bottom_of_window = $(window).scrollTop() + $(window).height();

    if (bottom_of_window >= bottom_of_object) { // If we're at the bottom...
      $(window).unbind('scroll'); // Stop the scroll function
      loadFeed(); // Load the AJAX
    }
  }
}

$(window).on('scroll', function() {checkScroll()}); // Start the function off
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="posts"></div>
<div id="SomeElementAlwaysAtTheBottomOfThePage"></div>
5
répondu Jamie Barker 2015-05-05 16:14:39

Il semble que vous écrasait le contenu intérieur de l'élément #posts par html() fonction. $("#posts").append('<div class="havanagila"></div>'); $('#posts').html(data);

je pense que vous voulez $("#posts").append($('<div class="havanagila"></div>').html(data));

et à propos de votre déclaration si if ((windowScroll + windowHeight) == documentHeight), votre fonction ajax est appelée seulement si vous faites défiler du haut vers le bas de la page (sur Chrome).

2
répondu Han 2015-05-09 15:50:19

Le code javascript suivant est utilisé pour charger 4 enregistrements lorsque la barre de défilement frappé au bas de l'écran. Cela signifie que lorsque la première fois 4 enregistrements seront récupérés, la deuxième fois 4 enregistrements seront récupérés et ces tous les enregistrements seront affichés sur l'écran. Ce code nous aide à réduire le délai de chargement au moment du chargement de la page.

$(window).scroll(function() {
   if($(window).scrollTop() + $(window).height() == $(document).height()) {
       //alert("bottom!");
       loadNext();
   }
});
var n1=0;
var n2=4;

function loadFirst()
{
    var n1=0;
    var n2=4;   
}
function loadNext()
{
    n1=n1+4;
    n2=n2+4;
    //alert(n1);    
    //alert(n2);
    if (window.XMLHttpRequest)
  {// code for IE7+, Firefox, Chrome, Opera, Safari
  xmlhttp=new XMLHttpRequest();
  }
else
  {// code for IE6, IE5
  xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
  }
xmlhttp.onreadystatechange=function()
  {
  if (xmlhttp.readyState==4 && xmlhttp.status==200)
    {
    document.getElementById("testidiv").innerHTML=document.getElementById("testidiv").innerHTML+xmlhttp.responseText;
    }
  }
xmlhttp.open("GET","next_testimonial_action.php?a=" + n1 + "&b=" + n2,true);
xmlhttp.send();

}


</script>

"next_testimonial_action.le php?a= " + n1 + "&b= "+ n2" est la page php qui contient la logique pour récupérer les données de db, et n1, n2 sont la limite les enregistrements pour être récupérée. Si vous avez besoin du fichier php, vous pouvez demander un commentaire. Je vous remercie

- - - - Important - - - - "vous devez appeler la fonction loadFirst () à bodyOnload ou document.prêt() jquery"

2
répondu JESTIN6699 2015-05-12 07:15:36

le Tout bien pour moi,

Il Suffit De Changer $(window).scroll(function () {......

$(document).on( 'scroll','window', function(){
              //or $(document).on( 'scroll','id of div containing scroll',
   var windowScroll = $(window).scrollTop();
   var windowHeight = $(window).height();
   var documentHeight = $(document).height();

    if ((windowScroll + windowHeight) == documentHeight) {
         loadFeed();
       }
});
0
répondu Abdul Manan 2015-05-12 11:34:32

function loadFeed() {
    $.ajax({
        url: 'loadmore.php',
        dataType: 'html',
        success: function (data) {
            $("#posts").append('<div class="havanagila"></div>');
            $('#posts').html(data);
            $(window).on('scroll', function() {checkScroll()}); // Run the function again upon success
        }
    });
}

var checkScroll = function() {
  if ($('#SomeElementAlwaysAtTheBottomOfThePage')[0]) {
    var el = $('#SomeElementAlwaysAtTheBottomOfThePage');
    var bottom_of_object = el.offset().top + el.outerHeight();
    var bottom_of_window = $(window).scrollTop() + $(window).height();

    if (bottom_of_window >= bottom_of_object) { // If we're at the bottom...
      $(window).unbind('scroll'); // Stop the scroll function
      loadFeed(); // Load the AJAX
    }
  }
}

$(window).on('scroll', function() {checkScroll()}); // Start the function off
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="posts"></div>
<div id="SomeElementAlwaysAtTheBottomOfThePage"></div>
-2
répondu Karthikeyan S 2015-05-06 09:03:07