【问题标题】:Load more from database not working when changing content type to JSON将内容类型更改为 JSON 时无法从数据库加载更多内容
【发布时间】:2013-12-31 01:03:49
【问题描述】:

一旦没有更多结果可显示,我正在尝试停止显示“加载更多”按钮。

所以,我的计划是,一旦单击加载更多按钮并在数据库上运行查询,我将进行行计数,然后如果该数字小于 LIMIT 子句中要求的数字,那么我将返回该信息.

所以目前我的 js 脚本是这样的:

$(document).ready(function(){
    var pageIndex = 1;
    $('#loadmorebuilds-div').click(function() {
        $('#buildcontainer').imagesLoaded( function(){
        $.ajax({
           url: 'includes/loadmorebuilds.php?type=follow&pageIndex=' + pageIndex,
           success: function(html) {
              var el = jQuery(html);
              jQuery("#buildcontainer").append(el).masonry( 'reload' );
              $("#loadmorebuilds-div").stop();
              pageIndex++;
              $("#buildcontainer").masonry()
           }

        });

    });

});
});

这很好用,但我想在我的 loadmorebuilds.php 页面中放一个 JSON 返回。

所以计划是做例如

// check if the results count is less than requested
if ($checkforlast < 8) {
    $return['noMore'] = true;
    echo json_encode($return);
}

然后我会将我的 js 更改为如下所示:

$(document).ready(function(){
    var pageIndex = 1;
    $('#loadmorebuilds-div').click(function() {
        $('#buildcontainer').imagesLoaded( function(){
        $.ajax({
           url: 'includes/loadmorebuilds.php?type=follow&pageIndex=' + pageIndex,
           success: function(html) {
              var el = jQuery(html);
              jQuery("#buildcontainer").append(el).masonry( 'reload' );
              $("#loadmorebuilds-div").stop().fadeOut();
              pageIndex++;
              $("#buildcontainer").masonry()

              if (response.correctKey === true) {
                DO SOMETHING TO REMOVE BUTTON
              }

           }

        });

    });

});
});

当我更改内容类型时出现问题:

header('Content-Type: application/json');

因为那会改变我发回的数据的方式(我认为?)。更改内容类型不会显示任何新内容,并且单击加载更多按钮时不会发生任何事情。

如果结果少于请求且不更改内容类型,是否有另一种方法可以将数据发送回 ajax 调用?

希望这是有道理的!

【问题讨论】:

  • 在运行时做出内容类型决定似乎是一种过于复杂的方法。为什么不直接返回字符串 'noMore' 并在追加之前在成功回调中测试该值?
  • 因为你在字符串解析和替换中权衡了内容类型声明——他们必须在显示之前从 HTML 中去除“noMore”。返回数据是正确的方法。
  • 为什么不尝试添加 dataType: "json", 到 ajax 请求?
  • @Neil 感谢您的回复,也许是因为它迟到了,但是您是否有机会详细说明我将如何处理?就像我在 php 页面中发送什么,然后我如何在成功回调中检查它?

标签: javascript php jquery ajax json


【解决方案1】:

我同意@palpatim 的观点,即字符串解析可能不是最好的方法。但是这个解决方案也可以工作,并且不需要您在客户端上从 json 构建您的 html:

$(document).ready(function(){
  var pageIndex = 1;
  $('#loadmorebuilds-div').click(function() {
    $('#buildcontainer').imagesLoaded( function(){
      $.ajax({
        url: 'includes/loadmorebuilds.php?type=follow&pageIndex=' + pageIndex,
        success: function(html) {
          var el = jQuery(html),
              rowCount = el.find('tr').length;

          jQuery("#buildcontainer").append(el).masonry( 'reload' );
          $("#loadmorebuilds-div").stop().fadeOut();
          pageIndex++;
          $("#buildcontainer").masonry();

          if (rowCount < 8) {
            DO SOMETHING TO REMOVE BUTTON
          }
       }
    });
});
});

我在这里使用 'tr' 来表示您用来在标记中保存每个结果的元素。

【讨论】:

  • 抱歉没有完全理解!这是一个很大的学习过程。 $el.find 是做什么的?那会找到指定元素的值吗?所以我尝试在 loadmore.php 中放置例如
    ECHO THE COUNT
    这确实会在每次加载更多结果时显示计数。但是我试过这个: rowCount = $el.find('#countvar').length;但是什么也没有发生,如果我把那行放在你放在代码中的那一行,它似乎也会破坏它并且不会加载更多结果。
  • 您能否发布您发送的实际标记作为响应?
  • 删除了 el.find 并刚刚完成了 $('rowcount').length 并且它可以工作。非常感谢您的帮助!
【解决方案2】:

如果您要返回 JSON,那么您不能期望像以前那样简单地将 JSON 附加到 DOM。考虑您的成功处理程序:

success: function(html) {
  var el = jQuery(html);
  jQuery("#buildcontainer").append(el).masonry( 'reload' );
  $("#loadmorebuilds-div").stop().fadeOut();
  pageIndex++;
  $("#buildcontainer").masonry()

  if (response.correctKey === true) {
    DO SOMETHING TO REMOVE BUTTON
  }

}

将成功处理程序的参数从html 更改为json 甚至更好的data, textStatus, jqXHR。还可以考虑使用 jQuery 的 getJSON() 方法作为简写。 http://api.jquery.com/jquery.getjson/

然后您可以使用data 来适当地填充您的演示文稿,并使用data.noMore 检查noMore 属性。

【讨论】:

  • 但是这个解决方案将模板层移动到客户端,这不一定是一个简单的练习。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-02-03
  • 1970-01-01
  • 2011-03-07
  • 1970-01-01
  • 1970-01-01
  • 2016-12-07
  • 2023-03-14
相关资源
最近更新 更多