说明 1:sqlite 数据库中保存有一些新闻条目,表结构为 rowid | title | url | mark,分别表示 id、标题、链接、已读标志,其中已读标志 0 表示未读,1 为已读;
说明 2:用 php 从数据库中读取 mark=0 的条目,用 while 循环拼凑为
<li><a href="url1" id="go" itemid="rowid1">title1</a></li>
<li><a href="url2" id="go" itemid="rowid2">title2</a></li>
说明 3:我的需求是:点击某条新闻链接后,更新数据库中该条目的 mark=1
说明 4:东拼西凑了一个脚本
<script src="path/to/jquery.min.js"></script>
<script type="text/javascript">
$(document).ready(function(){
$("a#go").click(function(){
var itemid = $(this).attr("itemid");
$.ajax({
url: "go.php",
type: "post",
data: {id: itemid}
});
});
});
</script>
其中 go.php 是 update 数据库
$id = $_REQUEST["id"];
$sql = 'UPDATE "table" SET "mark" = 1 WHERE "rowid" = '.$id;
现在的问题是:点击链接后,有一定的概率不能更新 mark,即数据库中仍然标记为未读
求指教,非常感谢。
修改了几处代码,目前看起来是正常了。感谢回复的各位。
1、修改新闻条目列表
<li><a href="url1" itemid="rowid1">title1</a></li>
<li><a href="url2" itemid="rowid2">title2</a></li>
2、修改ajax
$("a").click(function(){
var itemid = $(this).attr("itemid");
var itemurl = $(this).attr("href");
$.ajax({
url: "go.php",
type: "post",
async: false,
data: {"id": itemid}
});
window.location.href = itemurl;
return false;
});
1
manhere 2018-03-13 08:07:24 +08:00 via Android
一个页面里不要有重复的 id
|
2
MeteorCat 2018-03-13 08:09:16 +08:00 via Android
什么时候 html 标签能够多个同名 id 了?
|
3
lhx2008 2018-03-13 08:13:22 +08:00 via Android
重复标签用 class,否则用 id 只会绑定到第一个元素上面
|
4
DT27 2018-03-13 08:15:49 +08:00
楼上说的对,但是跟楼主出现的问题没什么关系好像。
点击的时候看下浏览器发开者工具里的控制台还有网络面板,看看请求有没有什么问题,是没请求,还是请求失败。 另外 ajax 里的 success 跟 error 加上便于调试。 |
6
Troevil 2018-03-13 09:02:17 +08:00
你点击链接之后,ajax 请求是异步的,可能还未发出去,但是页面跳转出去了啊,当次请求就被扔掉了当然会出现更新失败了
|
7
littleylv 2018-03-13 09:11:56 +08:00
6 楼说的对。可能 ajax 还没发送成功,a 链接就跳转了。稳妥一点的话,就在 ajax 返回后再用 js 手动跳转,但这样感觉不是很合理
|
8
jasonyang9 2018-03-13 09:15:30 +08:00
$.ajax 加一个 async: true 试试
|
9
chairuosen 2018-03-13 09:26:48 +08:00
还有一个逻辑层的问题,已读状态和取文章是一件事,你分两个渠道来做就有不同步的风险。应该是在取文章的时候在服务端把已读标记置为 1。
|
10
summerwar 2018-03-13 10:48:41 +08:00
如果打开的新闻链接是本站内的,那么就在阅读页面 ajax 将状态调整为已读; 如果是外部站点,就先拦截跳转,等更新完状态之后,在 ajax 里跳转至外部页面地址
|
11
jasonyang9 2018-03-13 11:11:33 +08:00
@jasonyang9 写反了,那是 async: false
|