我的第一个jquery ajax页面(初学者)
my first jquery ajax page (beginner)
我是js和jquery的新手。我正在做的页面是一个留言板。首先,页面显示10条最新消息,然后我的jquery函数用于自动更新板,每2秒提取新数据。最近的消息显示在顶部。旧的消息应该从页面中删除。
请注意,这是该页面的简化版本。我试图在将其实现到实际页面之前找出逻辑。因此,显示的不是消息,而是id等。
<?php
include ("../../db.php");
?>
<!DOCTYPE html>
<html>
<head>
<script type="text/javascript" src="../jquery/jquery.js"></script>
</head>
<body>
<script>
function update() {
$("#notice_div").html('Loading..');
$.ajax({
type: 'GET',
url: '2include.php?lastid='+ latestid + '',
timeout: 2000,
success: function(data) {
$("#cont_div").html(data);
$("#cont_div").clone().prependTo($("#newdiv")); // adding the pulled data to newdiv
$("#notice_div").html('');
window.setTimeout(update, 2000);
// animate
$("#newdiv").slideDown(1000,function(){ });
},
error: function (XMLHttpRequest, textStatus, errorThrown) {
$("#notice_div").html('Timeout contacting server..');
window.setTimeout(update, 60000);
}
});
}
$(document).ready(function() {
update();
});
</script>
<div id="cont_div"></div>
<div id="newdiv"></div>
<?
$count = 1; // first message is the newest
$get = $DB->query("SELECT * FROM board ORDER BY id DESC LIMIT 10", __FILE__, __LINE__);
while ($msg = $DB->fetch_array($get))
{
echo "<div id='msgid' style='background-color:yellow'>".$msg['id']."</div>";
if($count == 1){
$latestid = $msg['id']; // newest message - passing to js
}
$count++;
} ?>
<script>
var latestid = <?=$latestid?>;
</script>
</body>
</html>
2 include.php -
<?
include ("../../db.php");
$la = $_GET['lastid'];
$count = 1; // first message is the newest on load
$get = $DB->query("SELECT * FROM board WHERE id>'$la' ORDER BY id DESC LIMIT 5", __FILE__, __LINE__);
while ($msg = $DB->fetch_array($get))
{
echo "<div id='msgid' style='background-color:red'>".$msg['id']."";
if($count == 1){
$latestid = $msg['id']; // newest message
}
$count++;
?>
<script>
var latestid = <?=$latestid?>; // after pulling the newest message we overwrite latestid with the newest msg id
</script>
<? } ?>
在第一个页面加载后插入3行后的结果:
https://i.stack.imgur.com/rPf8N.jpg(抱歉还不能发布图片)
顶部的红色是cont_div,每次提取新数据时出现,持续2秒。
- 你觉得我的代码怎么样?我对jquery很陌生,对javascript也不是很好。这段代码花了我7个多小时来构建。
- 动画不工作(新消息应该随着滑下动画出现)
- cont_div显示在页面上(图片上红色的那个)。尝试将内容放在变量中或使div不可见-都不起作用。如果我把它设置为不可见,样式会被复制到new_div,它也会不可见。
- 一页只显示10条消息。我还不知道如何从页面上删除旧消息。
我会像呼叫中心一样对待您的问题,并按您收到的顺序回答您的问题:
你觉得我的代码怎么样?
总的来说,您的Javascript代码非常干净且组织良好。我通常将Javascript代码放在外部文件中,而不是直接放在HTML中,但这就是我对Javascript的所有建议。我发现的一件小事是,如果你不想要回调,你不必指定回调。这是完全有效的JQuery:
$("#newdiv").slideDown(1000);
你的PHP代码有点不太有条理,但你确实说过你为了在这里发布而精简了它,所以我不会评论格式细节。然而,我注意到的一件事是,这一行存在安全风险:
$la = $_GET['lastid'];
设置lastid
为1'; DROP TABLE board;--
会怎样?为了防止这种情况,永远不要在查询中直接使用用户输入。因为这个值是一个ID,你可以说$la = intval($_GET['lastid']);
,这将强制值为一个整数(字符串将变成0)。
动画不工作
在HTML中,id
应该是唯一的。如果您希望多个元素具有相同的值,则应该使用class
。在JQuery中,用#
匹配id,用.
匹配类。浏览器很可能会混淆,因为有多个id为newdiv
的div
。此外,除非显式隐藏,否则默认情况下会显示所有HTML元素。结果是,您告诉浏览器滑下已经显示的元素,这就是为什么它什么都不做。我建议给newdiv
添加一些CSS,使它默认隐藏(display: none;
)。
cont_div显示在页面上(图中最上面的红色)。尝试将内容放在变量中或使div不可见-都不起作用。
在您的$.ajax
调用中,我建议添加dataType: "json"
,而不是在AJAX函数中返回原始HTML。如果您希望返回状态信息(如果在访问数据库时出现错误怎么办?),这种方法会更好地工作,并且将帮助您将内容与信息分开。这样,您就可以用普通的HTML设计整个网页,然后根据从服务器返回的数据在Javascript中添加/删除HTML元素。我喜欢将所有AJAX调用视为来自第三方的潜在API调用。如果其他人要访问该脚本,他们是否也想要您的HTML,或者只是信息?
有关JSON的更多信息,请查看这个快速教程:http://secretgeek.net/json_3mins.asp。您可能还不知道,但是您已经在$.ajax
调用中创建了一个JSON对象。
一个页面上只能显示10条消息。
就像编程世界中的所有事情一样,有很多方法可以做到这一点。一种方法是始终将新消息添加到列表的顶部,然后使用JQuery的gt
选择器(http://api.jquery.com/gt-selector/)删除旧消息。例如,可以将这一行添加到success
函数中,该函数将删除所有索引(在父类中的位置)大于5的msgid
类div
标记:
$("div.msgid:gt(5)").remove();
顺便说一下,欢迎来到网络世界!继续玩下去,继续提出问题。
Zach Rattner的回答包含了一些非常好的细节,另一条建议是看看jQuery模板,这里有很好的教程:http://www.webistrate.com/jquery-creating-templates-for-your-html-content/
所以在第二个include中,你应该更新它以返回JSON数据。jQuery模板可以处理输出新内容,而不必克隆div等。然后,您可以删除设置最新id的Javascript代码,因为您将在新项目的JSON数组中拥有它。- 如何使用jQuery自动打开页面上的所有链接
- 使用agility.js进行页面布局和合成
- 当包含另一个asp文件时,是否也包含所有引用的样式和脚本页面
- 无法在通过jQuery的ajax加载的页面中执行javascript
- 使用javascript将动态表从一个html页面打印到另一个html页
- JavaScript执行暂时挂起页面
- 使用Dnamics CRM 2011中的JavaScript读取子网格的所有记录,而不考虑活动页面
- 在chrome.tabs.onCreated之后加载HTML页面
- 如何在vs2002中调试html页面
- 单击F5时如何停止页面加载
- 跟踪在页面加载时应用内联样式的JavaScript
- 使用angular重定向到html页面
- 我应该如何从xml文件构建一个javascript页面
- HTML5页面底部棒
- 如何通过php页面将数据库值检索到jquery自动完成框中
- Html页面上的多个Base64图像和平滑加载
- 无法将数据从firebase获取到我的html页面
- 角度图表;t显示在我的页面中
- 我的第一个jquery ajax页面(初学者)
- jQuery,初学者你好世界页面