php隐式提交iframe,Laravel中通过IFrame来模拟页面异步提交
在传统的Laravel后台管理页面的开发中,一般都会包含列表页面,新建页面,编辑页面,详情页面,以及相应的对保存,更新,删除等请求的处理。
在类Restful的风格下,我们一般都会这么做:Controller中包含
PHP
public function index(){}
public function create(){}
public function store(Request $request){}
public function edit($id){}
public function update(Request $request, $id){}
public function destroy($id){}
1
2
3
4
5
6
publicfunctionindex(){}
publicfunctioncreate(){}
publicfunctionstore(Request$request){}
publicfunctionedit($id){}
publicfunctionupdate(Request$request,$id){}
publicfunctiondestroy($id){}
然后相应的创建
index.blade.php, show.blade.php, create.blade.php,edit.blade.php。
在实际使用中会遇到如下的问题:
从列表页跳转至编辑页面,保存后返回列表页,无法记住之前列表的查询参数
返回列表页 不能记住滚动条的位置
通过Flash包显示消息后,默认应该只显示一次,但是点击浏览器返回,仍然会显示
页面之间都是通过页面跳转的方式,用户体验不佳
所以我们尝试使用IFrame的方式来改进上述问题,同时避免引入过多js代码,方便于后端开发人员
项目位于:http://git.bulo.cn:3000/lxr/laravel-iframe
主要代码:
弹出层使用layui的layer,对IFrame的支持较好 文档:https://www.layui.com/doc/modules/layer.html
后台的css框架基于AdminLTE https://adminlte.io
用户提示使用laracasts/flash
主要布局分为2个: main.blade.php 和 layer.balde.php 其中main.balde.php和之前的一样 ,layer.blalde.php 用于弹出层
main.blade.php中的关键JS代码如下,用于显示操作完成后的消息通知。
JavaScript
// 在父页面显示通知消息,供IFrame层调用
function layerNotify(params) {
$.notify(params);
}
@foreach (session('flash_notification', collect())->toArray() as $message)
$.notify({
message: '{{ $message['message'] }}'
},{
type: 'success',
delay: 3000,
timer: 500,
placement: {
from: "top",
align: "center"
},
});
@endforeach
{{ session()->forget('flash_notification') }}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// 在父页面显示通知消息,供IFrame层调用
functionlayerNotify(params){
$.notify(params);
}
@foreach(session('flash_notification',collect())->toArray()as$message)
$.notify({
message:'{{ $message['message'] }}'
},{
type:'success',
delay:3000,
timer:500,
placement:{
from:"top",
align:"center"
},
});
@endforeach
{{session()->forget('flash_notification')}}
列表页的JS代码,用于打开弹出层,关键代码在yes回调,在点击弹出层的确定按钮后,获取iframe页的表单,然后提交
JavaScript
$('.btn-create, .btn-edit').on('click', function (e) {
e.preventDefault();
var page = $(this).attr('href');
layer.open({
title: $(this).data('title') ? $(this).data('title') : '页面标题',
area: ['500px', '60%'],
type: 2,
btn: ['确定', '取消'],
content: page,
yes: function (index, layero) {
var iframeWin = window[layero.find('iframe')[0]['name']];
iframeWin.submit();
},
});
});
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$('.btn-create, .btn-edit').on('click',function(e){
e.preventDefault();
varpage=$(this).attr('href');
layer.open({
title:$(this).data('title')?$(this).data('title'):'页面标题',
area:['500px','60%'],
type:2,
btn:['确定','取消'],
content:page,
yes:function(index,layero){
variframeWin=window[layero.find('iframe')[0]['name']];
iframeWin.submit();
},
});
});
控制器的store和update方法的返回需要处理一下,返回一个特殊的view,在该view中关闭当前弹出层,然后刷新父页面
PHP
public function store(PermissionRequest $request)
{
$permission = new Permission();
$permission->name = $request->name;
$permission->display_name = $request->display_name;
$permission->description = $request->description;
$permission->save();
flash('权限新建成功')->success();
return view('common.layer_result');
}
1
2
3
4
5
6
7
8
9
10
publicfunctionstore(PermissionRequest$request)
{
$permission=newPermission();
$permission->name=$request->name;
$permission->display_name=$request->display_name;
$permission->description=$request->description;
$permission->save();
flash('权限新建成功')->success();
returnview('common.layer_result');
}
PHP
@push('scripts')
//假设这是iframe页
var index = parent.layer.getFrameIndex(window.name); //先得到当前iframe层的索引
parent.layer.close(index); //再执行关闭
parent.location.reload();
@endpush
1
2
3
4
5
6
7
8
@push('scripts')
//假设这是iframe页
varindex=parent.layer.getFrameIndex(window.name);//先得到当前iframe层的索引
parent.layer.close(index);//再执行关闭
parent.location.reload();
@endpush
本文由
陆, 向荣创作,除注明转载/出处外,均为本站原创,转载前请务必署名
最后编辑时间为: 2019-07-08 12:00 星期一
php隐式提交iframe,Laravel中通过IFrame来模拟页面异步提交相关推荐
- laravel ajax ip,怎么在Laravel中利用AJAX动态刷新部分页面
怎么在Laravel中利用AJAX动态刷新部分页面 发布时间:2021-02-17 13:12:43 来源:亿速云 阅读:119 作者:Leah 怎么在Laravel中利用AJAX动态刷新部分页面?很 ...
- php 隐式路由,关于Laravel 7 的简单隐式路由模型绑定
搜索热词 Laravel 的下一个主要发行版本 ,你可以直接在路由定义中自定义隐式路由模型绑定: Route::get('/posts/{post:slug}',function (Post $pos ...
- sql隐式转换_SQL Server中的隐式转换
sql隐式转换 This article will provide an overview of SQL Server implicit conversion including data type ...
- mysql 隐式主键_MySQL中复合主键性能的缺点
我们有一个表,该表具有由三个字段组成的复合主键(在MySQL 5.1中是这样). 该表上每秒有近200个插入和200个选择,并且表的大小约为100万行,并且还在不断增加. 我的问题是:"复合 ...
- c# 无法将类型隐式转换_C#中的隐式类型数组
c# 无法将类型隐式转换 C#隐式类型数组 (C# Implicitly Typed Arrays) Like implicitly typed variables, we can also decl ...
- oracle date 隐式转换,PL/SQL中的数据类型隐式转换规则
1) During INSERT and UPDATE operations, Oracle converts the value to the datatype of the affected co ...
- 隐式类型转换——C语言中的整型提升
整型提升概念: C语言中的整型算术运算总是至少以缺省整型类型的精度来进行的. 为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型,这种转换称为整型提升. 整型提升的意义 三点说明 ...
- mysql savepoint是什么_Mysql中的隐式COMMIT以及Savepoints的作用
Mysql默认是自动提交的,如果要开启使用事务,首先要关闭自动提交后START TRANSACTION 或者 BEGIN 来开始一个事务,使用ROLLBACK/COMMIT来结束一个事务.但即使如此, ...
- mysql 隐式提交事务_MySQL的SQL语句 -事务性语句和锁定语句(2)- 致使隐式提交的语句...
致使隐式提交的语句html 本节中列出的语句(以及它们的任何同义词)隐式结束当前会话中活动的任何事务,就像在执行语句以前执行了 COMMIT 同样.mysql 大多数这些语句在执行后也会致使隐式提交. ...
最新文章
- DIV+CSS 命名规范
- 执行上下文(Exection Contexts)
- 各大计算机公司 笔试及面试 题目 - 人民搜索
- oracle数据库主键自增序列_Oracle数据库序列详解
- c语言程序停止正常工作,C语言 由于出现问题,程序停止正常工作。如果帮我解决这个问题即可获得悬赏...
- 信息学奥赛C++语言:杨辉三角形
- 【自动驾驶】一文读懂自动驾驶汽车产业链上下游
- 初识ProtoBuf(3.18.1)
- 嘻哈 软件技术知识与项目管理知识
- 【优化算法】鸽群优化算法(PIO)【含Matlab源码 1077期】
- skyline软件_正射影像、倾斜摄影测量相关软件汇总
- 国外最顶级的人工智能网站资源
- python输出两个元素空格隔开_python实现将一串字符每两个一组,中间用空格隔开...
- 服装ERP软件首要的好处都有哪些?
- Eterm协议中文汉字编码
- SVPWM空间矢量脉冲宽度调制技术控制电机
- 请你详细说说类加载流程,类加载机制及自定义类加载器
- 1688商品详情api接口
- 开放科研:数据科学场景下如何让研究更加开放?
- 如何面对困难的经典语录