不正确的AJAX数据加载" infinity "滚动
Incorrect AJAX data loading with "infinite" scrolling
我目前正在编写一个脚本,当您触发它(通过单击链接)或滚动到页面底部时加载内容。我这样做是为了好玩,但它慢慢变成了一场噩梦……触发部分正常工作,而"滚动到底部"部分有时工作,有时不工作。它有时会加载一个帖子两次,有时重复的帖子集(我一次加载5),而不是显示下一个集,我的猜测是,这是因为它加载内容如此之快,那:
- 查询得到所有混合(AJAX调用/mysql查询/响应…?)或…
- DOM有某种问题(我猜这是调用这个的正确方式…)或…
- 这是另一个故障的原因,我目前无法想到,因为我的基本知识…
当你保持滚动条向下时,问题就出现了,所以它加载内容的速度非常快,这在Firefox中尤其严重,因为如果你已经在底部刷新页面,它会无限加载,直到没有更多的帖子,而且它的加载速度非常快。
我一整天都在尝试不同的方法…我找不到解决办法首先,我尝试设置一个标志,这样当每个AJAX调用结束时,它就会按加载的帖子数量增加某个变量,并且只有在帖子数量增加时才会再次执行调用,而且它必须有序地执行(在我的脑海中,这意味着AJAX调用成功)。然后我尝试设置一个超时,对于AJAX调用,然后对于包含该调用的函数,然后对于首先执行该函数的函数(滚动到底部),这种工作,但缺点是它没有为该超时做任何事情(因此,甚至没有显示"加载"html),并且情况发生的次数更少,但仍然发生。我还尝试在$.ajax()函数中设置超时,我认为这是一种不同的超时,因为它没有做我想要的……
最后,我试着让async为假,这是一件坏事,因为它挂起页面,直到它完成,因为它也被弃用;不用说,它也没有工作(我没有注意到任何明显的行为变化)。
我真的迷路了;我甚至不确定为什么会发生这种"故障"……
$.ajax({ //Removed some code in order to make it brief
url: 'load.php',
type: 'post',
dataType: 'json',
data: {offset: countContent, limit: displayNumber},
success: function(data)
{
if(data)
{
for(var i=0;i<display_n;i++)
{
var title = data[i][1];
var author = data[i][2];
var img = data[i][3];
var date = data[i][4];
var htmlStr =
'<div class="post" id="'+i+'"></div>';
$(element).append(htmlStr);
$(element).children('#'+i+':last').hide().fadeIn(200+(i*250));
}
}
else if(data == null){
//Do something when there are no more posts
}
},
error: function() {
// Error
}
});
和处理ajax调用的php
<?php
$offset = (int) $_POST['offset'];
$limit = (int) $_POST['limit'];
$db = 'mysql:host=localhost;dbname=posts;charset=utf8';
$u = 'username';
$p = 'password';
$con = new PDO($db,$u,$p);
$q = $con->prepare("SELECT id, title, author, img, date FROM articles
ORDER BY id DESC LIMIT :limit OFFSET :offset");
$q->bindParam(':offset',$offset,PDO::PARAM_INT);
$q->bindParam(':limit',$limit,PDO::PARAM_INT);
$q->execute();
$articles = $q->fetchAll(PDO::FETCH_NUM);
$con = null;
$array_count = count($articles);
if ($articles){
for ($i=0;$i<$array_count;$i++)
{
$articles[$i][4] = date("d F Y",strtotime($articles[$i]['4']));
}
echo json_encode($articles);
}
else
{
$articles = null; //sends null if the data is empty
echo json_encode($articles);
}
?>
是否有任何方法来"延迟"ajax调用之前另一个得到执行,使文章正确加载?还是等到ajax中的一切都按照计划加载,然后再去下一个?在这种情况下我能做什么?
我很抱歉,如果这篇文章有点大,我想我想说明一点,哈。非常感谢你的帮助,谢谢。编辑:这是我在下面发布的内容,以及解决方案:
我将运行的全局变量设置为false,并包装了整个AJAX调用if !运行条件,立即使该变量在进入循环后为True,并在参数"complete: "ajax函数或通过$. ajaxcomplete ()。我猜也可以使用.on()和。off()语句来绑定和取消绑定事件触发器,但我发现前面的方法要简单得多。
这允许AJAX调用在另一个调用开始之前完成,并正确显示内容。
我建议您在触发事件触发器后立即关闭它,并在填充dom后重新打开它。
- 铬:“;未捕获的语法错误:意外的标记:"
- 可以设置“;文件名"发生错误时显示的内联脚本标记的
- JS表单提交"无法使用Chrome数据保护程序加载此页面.尝试重新加载页面.调试信息:POST CISmtuK
- 检测电话窃听,即:<a href="电话:xxx">在UIWebview上
- 使用“+="操作人员
- //而不是在src=“”上使用http://"属性
- "未捕获的语法错误:意外的标记}"
- 可以<脚本类型=“;text/javascript”>window.location=“/"</
- "实例范围”;TypeScript类的getter/setter
- Javascript复选框函数:;缺少:在属性id之后"
- "“;变量未引用正确的对象
- "日期“;AJAX请求返回的类型值未定义
- 得到"TypeError:无法读取属性'filename'未定义的“;调用“npm start
- Soundcloud api"未捕获的类型错误:无法读取属性'uri'“未定义”;
- "工具提示"jQuery插件坏了
- "锻造;React中的表达式
- 图像可以从源<img src=""/>.TEXT可以在没有javascript的情况下从外部
- 如何提取“;href"最近列表项中的属性值
- CKEditor如何允许href="javascript:void(0)"在小部件中
- 插入“;img src"在javascript中