我正在尝试将我的同类系统升级到更实用的系统。
目前我有它像<a href="https://mysite/dash.php?like=<? echo $postid; ?>">Like</a>
然后在PHP中有这样的东西:如果设置了$_GET['like'],则获取用户的ID和帖子ID并调用一个名为like_status($post_id,$user_id);
的函数
但是,我一直在研究这样的事情:
显示在状态上的主要部分:
<script src="https://mysite/stuff/jquery.min.js"></script>
<script src="https://mysite/stuff/js/global.js"></script>
<input type="hidden" id="postid" value="<? echo $postid; ?>">
<input type="hidden" id="userid" value="<? echo $session_user_id; ?>">
<span id="like-button" style="color:red;">Like</span>
Javascript/jQuery:
$('span#like-button').on('click', function(){
var postid = $('input#postid').val();
var userid = $('input#userid').val();
if (postid != ''){
$.post('https://mysite/stuff/ajax/like.php', {postid: postid, userid: userid}, function(data){
document.getElementById('like-button').innerHTML = data;
});
}
});
最后,我喜欢.php脚本:
<?php
if(isset($_POST['postid']) === true && empty($_POST['userid']) === false){
include $_SERVER['DOCUMENT_ROOT'].'/stuff/init.php';
if(is_liked($_POST['postid'],$_POST['userid']) === true){
unlike_status($_POST['postid'],$_POST['userid']);
echo 'Like';
} else {
like_status($_POST['postid'],$_POST['userid']);
echo 'Unlike';
}
}
?>
我的不喜欢/类似功能工作正常。我现在有一个类似工作的系统,但它每次都会让用户刷新和所有内容,而且非常不方便。我想使用此方法自动更新喜欢按钮,而无需刷新页面或任何东西。这样,用户可以喜欢页面上的多个内容,而不必每次都刷新页面。我也认为它更安全,因为 $_GET['like'] 可以更改为任何 id,即使用户不是其他用户的朋友,或者状态不存在。
我的问题:
好的,所以每当我单击"喜欢"按钮时,什么都不会发生。我也在单独的页面中尝试了这个(将类型从隐藏更改为文本,并手动输入数据),但它也没有用。似乎javascript没有执行。我已经在谷歌浏览器中打开了控制台,当我单击该按钮时,没有任何反应。类似内容不会发布到数据库,按钮也不会更新。
谁能解释我做错了什么?可能为我指出解决此问题的正确方向?
更新
我尝试将Javascript/HTML组合在一个页面中以拥有动态变量。
以下是每个状态显示的内容:
<script src="https://mysite/stuff/jquery.min.js"></script>
<script type="Javascript">
$(document.body).on('click','#like-button', function(
var postid<? echo $status_id; ?> = $('input#postid<? echo $status_id; ?>').val();
var userid<? echo $status_id; ?> = $('input#userid<? echo $status_id; ?>').val();
$.post('https://mysite/stuff/ajax/like.php', {postid: postid<? echo $status_id; ?>, userid: userid<? echo $status_id; ?>}, function(data){
document.getElementById('like-button').innerHTML = data;
});
));
</script>
<input type="hidden" id="postid<? echo $status_id; ?>" value="<? echo $status_id; ?>">
<input type="hidden" id="userid<? echo $status_id; ?>" value="<? echo $session_user_id; ?>">
<span id="like-button" style="color:red;"><? if(isliked($status_id,$session_user_id) === true){ ?>Unlike<? } else { ?>Like<?}?></span>
我仍然无法让它执行脚本。
您始终可以使用 $('#fomrm_id').serialize()
,在 POST data
中一次获取所有表单字段。它会刷新页面,因为您必须return false;
添加到jQuery.click
事件的末尾。
如果这些元素是动态创建的(或者就像在创建它们之前执行脚本一样),您需要设置适当的.on
事件,这个事件不好,因为它绑定到可能不存在的元素。
应该是:
$(document.body).on('click','#like-button', function(){..});
- 这会将其绑定到 document body
,它始终存在,但如果匹配,则会在第二个参数中检查选择器。
这不是我想做的,但它已经足够好了。我设法让喜欢按钮在不刷新等的情况下工作/更新。感谢大家的帮助,如果不是你的建议,我永远不会发现这一点。
<input type="hidden" id="postid" value="<? echo $status_id; ?>"><br>
<input type="hidden" id="userid" value="<? echo $session_user_id; ?>"><br>
<span id="like-button" style="color:red;"><? if(isliked($status_id,$session_user_id) === true){ ?>Unlike<? } else { ?>Like<? } ?></span>
<script>
$('span#like-button').on('click', function(){
var postid = $('input#postid').val();
var userid = $('input#userid').val();
<? if(isliked($status_id,$session_user_id) === true){ ?>
$.get('https://mysite/dash', {unlike: postid, userid: userid}, function(data){
document.getElementById('like-button').innerHTML = 'Like';
});
<? } else { ?>
$.get('https://mysite/dash', {like: postid, userid: userid}, function(data){
document.getElementById('like-button').innerHTML = 'Unike';
});
<? } ?>
});
</script>