【问题标题】:Infinite scrolling MySQL PHP jQuery无限滚动 MySQL PHP jQuery
【发布时间】:2014-11-13 15:19:54
【问题描述】:

下面的代码显示了 jQuery 和 php 的无限滚动功能。我有两个我似乎无法弄清楚的问题......

我的第一个问题:我知道,它被称为“无限”滚动。但可笑的是,向下滚动到页面底部时加载的内容实际上是“无限的”(重复本身,当我实际上不想要任何重复时)。我相信这与 jQuery 函数中的 if 语句有关。

这里是 jQuery 部分:

jQuery.fn.portfolio_addon = function(addon_options) {
"use strict";
//Set Variables
var addon_el = jQuery(this),
    addon_base = this,
    img_count = addon_options.items.length,
    img_per_load = addon_options.load_count,
    $newEls = '',
    loaded_object = '',
    $container = jQuery('.image-grid');

$(window).scroll(function() {
if($(window).scrollTop() + $(window).height() == $(document).height()) {


    $newEls = '';
    loaded_object = '';                                    
    var loaded_images = $container.find('.added').size();
    if ((img_count - loaded_images) > img_per_load) {
        var now_load = img_per_load;
    } else {
        var now_load = img_count - loaded_images;
    }

    if ((loaded_images + now_load) == img_count) jQuery(this).fadeOut();

    if (loaded_images < 1) {
        var i_start = 1;
    } else {
        var i_start = loaded_images+1;
    }

    if (now_load > 0) {         
        // load more elements
        for (var i = i_start-1; i < i_start+now_load-1; i++) {
            loaded_object = loaded_object + '<div data-category="'+ addon_options.items[i].category +' " class="blogpost_preview_fw element '+ addon_options.items[i].category +'"><div class="fw_preview_wrapper"><div class="gallery_item_wrapper"><a href="'+ addon_options.items[i].url +'" ><img src="'+ addon_options.items[i].src +'" alt="" class="fw_featured_image" width="540"><div class="gallery_fadder"></div><span class="third_party_'+addon_options.items[i].thirdparty +'"></span><span class="third_party_mobile_'+addon_options.items[i].thirdparty_mobile +'"></span><span class="description_tag"><span class="actual_description">'+ addon_options.items[i].title +'</span></span> <span class="price_tag"><span class="actual_price">€ '+ addon_options.items[i].price +'</a></div><a href="'+ addon_options.items[i].url +'"><div class="grid-port-cont"><h6>'+ addon_options.items[i].title +'</h6><hr class="trennlinie"><span>'+ addon_options.items[i].description +'</span><hr class="trennlinie"><span>Preis: EUR '+ addon_options.items[i].price +'</span>&nbsp;·&nbsp;<span>Ort: '+ addon_options.items[i].postcode +' '+ addon_options.items[i].city +'</span></div></a></div></div></div></div>';
        }

        $newEls = jQuery(loaded_object);
        $container.isotope('insert', $newEls, function() {
            $container.isotope('reLayout');                             
        });         
    }}
});
}

这是我的 php 的一部分:

<?php // load more on default
if($condition == true){


//connect to the database
//-select the database to use

$start1 = 40; // it starts at 40 because 40 items load when page loads
$limit1 = 20;

//-query the database table
$sql="SELECT * FROM table WHERE City LIKE '%".$featured."%' order by id limit $start1,$limit1";

//-run the query against the mysql query function
//-create while loop and loop through result set 
//-assign &numrows variable

?>
<script>
items_set = [
    {src : '<?php echo $row['imageURL']; ?>', 
        url : '<?php echo $row['URL']; ?>', 
        category: '<?php echo $row['DetailCategory']; ?>',
        title : '<?php echo $row['Name']; ?>',
        description : '<?php echo $row['Description']; ?>', 
        price : '<?php echo $row['Price']; ?>',
        postcode : '<?php echo $row['Postcode']; ?>', 
         city : '<?php echo $row['City']; ?>',
        thirdparty : '<?php echo $row['ThirdParty']; ?>',
        thirdparty_mobile : '<?php echo $row['Thirdparty']; ?>'}         
];
jQuery('#list').portfolio_addon({
    load_count : <?php echo $numrows;?>,
    items : items_set
}); 
</script>

<?php
}}
?>

这是我的第二个问题:我的数据库中正好有 49 个项目(行)。如代码所示,其中 40 个已在页面加载时显示。现在,当我向下滚动页面(触发加载功能)时,只显示 6 个新项目,而应该显示 9 个(应该使用我正在使用的查询调用所有 49 个)。不知何故,mysql-query 似乎根本没有任何效果。

非常感谢您的帮助!谢谢。

【问题讨论】:

  • 您直接将数据从 PHP 转储到 JS 上下文中。您面临着引入 JS 语法错误并杀死整个 JS 代码块的巨大风险。 从不直接转储。始终通过json_encode() 输出,因此您始终可以生成语法正确的 JS。
  • 它也是无限重复的,因为您没有在两次 fetch 调用之间更改 $start/$limit。您每次只是获取/显示 SAME 记录。您的滚动条必须每次都发送“获取页面 40-49”、“获取页面 50-59”、“获取页面 60-69”等...
  • @MarcB 这看起来像是一个“初稿”......所以他可能正在构建一个原型,看看如何让它工作;)
  • @MarcB:谢谢!它绝对只是一个原型,这里没有完成,但你是对的!我只是想知道如何只获取第 40-49 页,以便在这些页面加载后,滚动到底部时不再出现新内容...

标签: php jquery mysql


【解决方案1】:

我希望我做对了:

一遍又一遍地加载相同的内容。

我认为这个问题是由于:

loaded_object = loaded_object + 'lots of more content';

在你的循环中。 您加载的对象每次都将自己附加到新内容的前面,然后附加到 dom

你只想要你的:

loaded_object = 'lots of more content';

要加载..旧的东西已经在你的 DOM 中了,不需要成为“loaded_object”的一部分

编辑: 正如 MarcB 在您的问题下方评论的那样:您的 select 语句也在一遍又一遍地获取相同的数据

【讨论】:

  • 谢谢!只删除“loaded_object”是不行的,你是对的(@MarcB)。如果我只想加载这 9 个项目一次,而没有任何其他页面,你能告诉我它应该是什么样子吗?非常感谢!
  • 也许尝试重新考虑您的客户端和服务器策略...就像 Rajesh 在他的帖子中提到的那样,处理一些 ajax 请求可能很有用。您应该考虑创建一个 RESTful 服务,然后您的客户端与之交谈
【解决方案2】:

我认为,没有 ajax 请求。您需要发送一个 ajax 请求,其中包含已完成的帖子数和需要获取的帖子数的偏移量。

请发表你的意见

【讨论】:

  • 也许他正在使用 ?featured='something'... 请求 index.php... 加载图像并在每次页面加载时最多显示 20 个。在那种情况下,他不需要任何 ajax
  • 你能告诉我这个 ajax 请求的外观吗?谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-18
相关资源
最近更新 更多