在Laravel中实现使用AJAX动态刷新部分页面


Posted in PHP onOctober 15, 2019

AJAX相信大家都不陌生,有很多不同的Javascript Frameworks可以用来快速实现AJAX功能。那么今天我们一起来看一下如何在使用了PHP Frameworks的网站中使用AJAX来刷新页面的一小部分。

这里我使用的是jQuery + Laravel(当然如果使用了其他框架,基本的概念也是不变的)。如图,假设我们制作了一个页面来管理客户的茶叶消耗:

在Laravel中实现使用AJAX动态刷新部分页面

我们想制作一个模块来动态为每一个新的茶叶消耗增加一个消耗选择区,即点击新增消耗后,会动态增加一个新的茶叶消耗区域:

在Laravel中实现使用AJAX动态刷新部分页面

另外,当点击删除该消耗时,该消耗区域会动态删除。

要实现这样的功能,我们的基本思路如下(MVC Pattern):

使用AJAX POST call来调用Controller的函数

Controller返回我们所需的View中的HTML代码片段

调用AJAX callback函数动态将HTML代码片段插入到页面中

那么首先我们先创建我们的js文件,在这里我新建了一个叫my-ajax-add-tea-consumption.js的文件,并放在了/public/js文件夹中。我们在view模板中使用<script></script>调用:

<!DOCTYPE html>
<html lang="en">
...
<body>
...
 <input type="hidden" name="order_id" value="{{ $order->id }}">
 <div class="tea-consumption">
  <div class="card" id="tea-card-{{ $tea_consumption->id }}>
   <div class="card-header">
    <span>茶叶消耗</span>
    <button type="button">删除该消耗</button>
    <input type="hidden" value="{{ $tea_consumption->id }}">
   </div>
   <div class="card-block">
    <!-- 其他inputs -->
   </div>
  </div>
 </div>
 <button type="button" name="btn-add">新增消耗</button>

 <script src="/js/my-ajax-add-tea-consumption.js"></script>

</body>
</html>

由于 Laravel的Middleware会自动检查CSRF,所以如果使用POST,DELETE等方法的时候我们需要全局设置一下AJAX的header,这样在每次发送AJAX的时候,都会自动发送相应的csrf token,只有Laravel检查与相应session中的token匹配后,才会调用相应的Controller函数。所以在我们首先在view中增加一个meta tag:

<meta name="csrf-token" content="{{ csrf_token() }}">

然后在我们的my-ajax-add-tea-consumption.js中,加上:

$.ajaxSetup({
 headers: {
  'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
 }
});

这样就可以了。然后我们开始添加ajax函数(首先是增加模块):

$('button[name="btn-add"]').click( function() {
 //route format: /orders/{id}/add-tea-consumption
 $.post('/orders/' + $('input[name="order_id"]').val()  + '/add-tea-consumption'), function( html ) {
  $('.tea-consumption').append( html );
 });
});

看起来很简单吧,但是要注意的几个地方有:

Button的type一定要写为button,而缺省的话默认type=”submit”,这样一旦button被点击页面就会跳转。

post的url我们填的是laravel中的route(稍后在routes中我们还会叙述)

callback function中的数据html是由controller函数中使用某个view所返回的html代码

好了,那么现在我们的$.post() call会后台访问/orders/{id}/add-tea-consumption这样形式的路径,所以我们在\routes\web.php中加上我们的路径名和处理方式:

route::post('/orders/{id}/add-tea-consumption', 'RoomOrdersController@add_tea_consumption');

即我们希望由RoomOrdersController这个控制器中的add_tea_consumption函数来处理我们的ajax请求。那么我们一起来看一下这个函数到底有些什么内容:

<?php   //RoomOrdersController.php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\RoomOrder;
use App\RoomTeaConsumption;

class RoomOrdersController extends Controller
{
 ...

 /**
 * Return view fragments in html form
 *
 * @param $order_id
 * @return \Illuminate\Http\Response
 */
 public function add_tea_consumption ( $order_id ) {
  $consumption = RoomTeaConsumption::create([
   'room_order_id' => $order_id
   /* more fields omitted */
  ]);

  return view('partials.tea_consumption')->with([
   'tea_consumption' => $consumption
   /* more fields omitted */
  ]);
 }
}

其实跟平时我们controller中的函数并没有什么区别,因为我们需要返回的本来就是html代码,而调用view()的时候,Laravel已经帮我们生成好了。

这样一来,当ajax call成功返回时,$('.tea-consumption').append( html );就会将view生成的html代码插入我们指定的DOM中,从而动态刷新页面。

值得注意的是,如果你发现你的ajax call返回internal 500错误,那么首先请检查你的csrf是否已经设置好,如果确认没有问题,那么请检查你的view template文件,只要其中有错误,那么就无法返回html,从而造成错误。

要删除模块,其实是差不多的,但是要注意的是,我们的listener不能使用.click()来注入,因为当模块被删除后,.click()注入的listener就会失效,我们需要使用parent的.on()函数:

('.tea-consumption').on('click', '#my-button', function() {
 $.ajax({
  method: 'DELETE',
  url: '/teas/consumption/' + $('this').next('input').val() + '/delete',
  success: function( id ) {
   var sel = $('#tea-card-' + id);
   sel.remove();
  }
 });
});

AJAX需要细心,因为错误比较难debug,所以在开发的时候一定要注意,出现问题了多查阅一下相关API。

以上这篇在Laravel中实现使用AJAX动态刷新部分页面就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
php部分常见问题总结
Mar 27 PHP
php面向对象全攻略 (二) 实例化对象 使用对象成员
Sep 30 PHP
php中CI操作多个数据库的代码
Jul 05 PHP
php读取文件内容的三种可行方法示例介绍
Feb 08 PHP
php的webservice的wsdl的XML无法显示问题的解决方法
Mar 11 PHP
php运行提示:Fatal error Allowed memory size内存不足的解决方法
Dec 17 PHP
php使用cookie保存登录用户名的方法
Jan 26 PHP
PHP实现通过Luhn算法校验信用卡卡号是否有效
Mar 23 PHP
php通过curl模拟登陆DZ论坛
May 11 PHP
PHP判断一个数组是另一个数组子集的方法详解
Jul 31 PHP
thinkPHP5框架闭包函数与子查询传参用法示例
Aug 02 PHP
PHP中使用mpdf 导出PDF文件的实现方法
Oct 22 PHP
Yii框架的redis命令使用方法简单示例
Oct 15 #PHP
解决在laravel中leftjoin带条件查询没有返回右表为NULL的问题
Oct 15 #PHP
解决Laravel5.5下的toArray问题
Oct 15 #PHP
laravel通过a标签从视图向控制器实现传值
Oct 15 #PHP
laravel在中间件内生成参数并且传递到控制器中的2种姿势
Oct 15 #PHP
laravel 实现划分admin和home 模块分组
Oct 15 #PHP
laravel 根据不同组织加载不同视图的实现
Oct 14 #PHP
You might like
PHP脚本的10个技巧(1)
2006/10/09 PHP
php echo, print, print_r, sprintf, var_dump, var_expor的使用区别
2013/06/20 PHP
php下获取http状态的实现代码
2014/05/09 PHP
Symfony2实现在controller中获取url的方法
2016/03/18 PHP
PHP中类与对象功能、用法实例解读
2020/03/27 PHP
表单元素与非表单元素刷新区别详细解析
2013/11/06 Javascript
Jquery ajax执行顺序 返回自定义错误信息(实例讲解)
2013/11/06 Javascript
js实现创建删除html元素小结
2015/09/30 Javascript
react.js 翻页插件实例代码
2017/01/19 Javascript
jquery网页加载进度条的实现
2017/06/01 jQuery
Node 自动化部署的方法
2017/10/17 Javascript
微信小程序实现点击按钮修改字体颜色功能【附demo源码下载】
2017/12/05 Javascript
vue项目base64字符串转图片的实现代码
2018/07/13 Javascript
Bootbox将后台JSON数据填充Form表单的实例代码
2018/09/10 Javascript
使用vue2.6实现抖音【时间轮盘】屏保效果附源码
2019/04/24 Javascript
node中IO以及定时器优先级详解
2019/05/10 Javascript
通过jQuery学习js类型判断的技巧
2019/05/27 jQuery
简单了解TypeScript中如何继承 Error 类
2019/06/21 Javascript
纯js+css实现在线时钟
2020/08/18 Javascript
vue实现登录、注册、退出、跳转等功能
2020/12/23 Vue.js
JavaScript仿京东轮播图效果
2021/02/25 Javascript
[46:02]DOTA2上海特级锦标赛D组资格赛#2 Liquid VS VP第二局
2016/02/28 DOTA
python网络编程学习笔记(四):域名系统
2014/06/09 Python
python下MySQLdb用法实例分析
2015/06/08 Python
python 中split 和 strip的实例详解
2017/07/12 Python
python中map()函数的使用方法示例
2017/09/29 Python
win10下Python3.6安装、配置以及pip安装包教程
2017/10/01 Python
Python3实现爬取指定百度贴吧页面并保存页面数据生成本地文档的方法
2018/04/22 Python
python使用flask与js进行前后台交互的例子
2019/07/19 Python
Python定时任务工具之APScheduler使用方式
2019/07/24 Python
使用 HTML5 Canvas 制作水波纹效果点击图片就会触发
2014/09/15 HTML / CSS
建筑总经理岗位职责
2014/02/02 职场文书
2014年党务工作总结
2014/11/25 职场文书
个人事迹材料怎么写
2014/12/30 职场文书
2019财务管理制度最新范本!
2019/07/09 职场文书
分析Python list操作为什么会错误
2021/11/17 Python