ajax抓取网页内容(一个视图页面执行一个给评论点赞的功能,发现问题的根源)
优采云 发布时间: 2022-03-14 02:18ajax抓取网页内容(一个视图页面执行一个给评论点赞的功能,发现问题的根源)
有这样一个例子,在thinkPHP视图页面上执行点赞评论功能。为了增强用户体验,一般使用ajax异步请求在后台处理同类数据。页面成功后,就可以执行本地更新的数据了。前台一般使用jquery,通过执行jquery的ajax方法来完成任务请求更加简单方便。
简要描述出现问题的场景
tinkPHP在应用路由后在视图页面执行ajax,并没有正常返回数据。以下代码描述了将评论 ID 获取到 ajax 请求的过程。根据后台处理规则,cmthot 方法会将一个更新后的 post-like 数据(数据)返回给前台。
function uphot(o){
var cmtid=$(o).attr("cmtid");//获取评论ID
$.ajax({
type:"post",
dataType:"json",
data:{cmtid:cmtid},
url:"{:url('cmthot')}",//请求地址
success:function(data){
$('#hot'+cmtid).html(' '+data);
},
});
}
就是这样,和like数据没有正常返回,报错。通过alert(data)可以看到这样的场景。
再来看看后台处理部分
public function updatehot()
{
if(request()->isAjax()){
$cmtid=input('cmtid');
$cmthot=model('comment')->cmthot($cmtid);
return $cmthot;
}else{
$this->error('非法请求');
}
}
上述代码中,通过控制器将ajax获取的评论ID扔到模型中(模型代码不会贴出来)进行处理,并将新增的点赞返回给前台。前台(前面的代码)通过 .html 重写新数据。
发现问题的根源来自于路由
为了调试,我把ajax改成链接直接提交了。返回的结果都是正常的,即后端控制器和模型都正常,没有错误。问题应该仍然在ajax上。
因为这种操作方式,我经常在网站的后台使用,一般不会报错,所以又去后台对比一下同样的功能。后台类似的功能都是正常的。
为了找出问题的原因,我比较了网站的正反两面的区别。唯一明显的是前台为了用户体验使用路由,简化了url。后台使用iframe框架,url固定为frame页面的地址,所以当时没有使用路由。
方便找到差异然后出错。第一段代码中请求的地址不存在,因为它是路由的。此处需要添加路由地址,所以只需添加一个斜杠即可。url:"{:url('/cmthot')}",
最后是因为一个斜线,返回了一个html的页面,所以要小心。