巧用JavaScript语言特性解耦页面间调用
一个很小的技巧,留下一笔,供日后查看。
业务场景:
一个页面A,打开一个新窗口页面B,执行业务操作,B执行完后,回调A页面方法,并关闭自身。
最原始方法:
最直接的方法莫过于在B页面直接调用A页面的某一个方法,示例代码如下:
A页面打开B页面的方法如下:
function showIndustry() {
var title = "行业选择";
layer.open({
title: title,
type: ,
area: ['768px', '550px'],
fixed: false, //不固定
maxmin: true,
content: ctxPath + 'sgjXzzfCommon/industryView'
});
}
B页面保存方法如下:
function saveInfo() {
var a = $("#selectId").val();
var b = $("#selectName").val();
parent.initIndustrySelect(a, b);
closeLayer();
}
这样写完全满足需要,但是如果B页面是一个公共的页面,供很多页面调用的话,那么这种写法就存在如下2个问题:
1.写页面的人很多,不可能把回调函数都命名为相同的方法名称,让B页面回调。这样会增加页面间调用出错的可能性。
2.B页面根据不同的父页面,编写各种if else语句或者switch语句,用来判断应该回调那些页面的函数,增加了代码量和出错的概率。
为此,如果能有一种方法让B根据调用者的意图来回调,又不增加额外的代码,那么简直就是极好的。于是,有了如下的办法:
新方法:
A页面打开B页面时,增加一个参数callbackFun,用于告诉B页面回调函数名称叫什么,然后B页面在完成自身操作后,直接回调这个函数。
function showIndustry() {
var title = "行业选择";
layer.open({
title: title,
type: ,
area: ['768px', '550px'],
fixed: false, //不固定
maxmin: true,
content: ctxPath + 'sgjXzzfCommon/industryView?callbackFun=initIndustrySelect'
});
}
function initIndustrySelect(obj) {
if (obj!= null) {
currentForm.find("input[name=industry]").first().val(obj.id);
currentForm.find("input[name=industryName]").first().val(obj.name);
}
}
B页面的回调方法如下:
function saveInfo() {
if (currentForm.valid() == false) {
return;
}
$("#btnSubmit").prop("disabled", true);
currentForm.ajaxSubmit({
type: 'post',
url: ctxPath + "sgjXzzfCommon/add",
success: function (data) {
$("#btnSubmit").prop("disabled", false);
if (data.success == true) {
callback(data.data);
closeLayer("保存成功");
}
else {
layer.alert("提交失败:" + data.error);
}
},
error: function (data) {
$("#btnSubmit").prop("disabled", false);
layer.alert("提交失败:" + data.statusText);
}
});
}
function callback(obj) {
var fun = /*[[${callbackFun}]]*/;
if (fun!=null && fun.length > ) {
var callbackFun = parent[fun];
if (typeof callbackFun != "undefined") {
callbackFun(obj);
} else {
callbackFun = parent.frames[][fun];
callbackFun(obj);
}
}
}
如此,A、B页面直接通过callbackFun参数实现回调,解决了页面回调耦合性强的问题。
巧用JavaScript语言特性解耦页面间调用的更多相关文章
- javascript中父、子页面间调用
本文主要转自:http://www.360doc.com/content/11/0525/17/6161903_119333834.shtml http://zh ...
- 前端学习 第三弹: JavaScript语言的特性与发展
前端学习 第三弹: JavaScript语言的特性与发展 javascript的缺点 1.没有命名空间,没有多文件的规范,同名函数相互覆盖 导致js的模块化很差 2.标准库很小 3.null和unde ...
- 理解Javascript的动态语言特性
原文:理解Javascript的动态语言特性 理解Javascript的动态语言特性 Javascript是一种解释性语言,而并非编译性,它不能编译成二进制文件. 理解动态执行与闭包的概念 动态执行: ...
- JS数组 编程练习 使用Javascript语言,把以下数组 在页面显示如下图所示的图案
编程练习 使用Javascript语言,把以下数组 var arr = ['*','##',"***","&&","****&quo ...
- JAVASCRIPT实现的WEB页面跳转以及页面间传值方法
在WEB页面中,我们实现页面跳转的方法通常是用LINK,BUTTON LINK ,IMG LINK等等,由用户点击某处,然后直接由浏览器帮我们跳转. 但有时候,需要当某事件触发时,我们先做一些操作,然 ...
- JavaScript之iframe页面间通信
[1] iframe父子页面间通信 1.相互调用对方的方法 |> 子级页面调用父级页面 window.parent.父级页面方法(args) |> 父级页面调用子级页面 document. ...
- Javascript面向对象特性实现封装、继承、接口详细案例——进级高手篇
Javascript面向对象特性实现(封装.继承.接口) Javascript作为弱类型语言,和Java.php等服务端脚本语言相比,拥有极强的灵活性.对于小型的web需求,在编写javascript ...
- javascript语言精粹摘要
JavaScript中五种基本类型:string,number,boolean,null,undefined.还有一个对象类型object. javascript只有一个数字类型.它在内部被表示为64 ...
- Pro ASP.NET MVC –第四章 语言特性精华
C#语言有很多特性,并不是所有的程序员都了解本书我们将会使用的C#语言特性.因此,在本章,我们将了解一下作为一个好的MVC程序员需要了解C#语言的特性. 每个特性我们都只是简要介绍.如果你想深入了解L ...
随机推荐
- 使用Ant打包工具
由于使用java,javac,jar等工具进行编译打包,即繁琐低效又容易出错,因此Ant出现了.Ant的出现就是专门为了打包编译java代码的,使用之前得稍微学一下.Ant的运行起来主要是依靠配置文件 ...
- h5转pb的两个坑
1.需要加上如下设置,否则转换前后输出可能不一致,这个主要针对dropout.BN层训练测试不一致 from keras import backend as K K.set_learning_phas ...
- 【BZOJ3534】【Luogu P3317】 [SDOI2014]重建 变元矩阵树,高斯消元
题解看这里,主要想说一下以前没见过的变元矩阵树还有前几个题见到的几个小细节. 邻接矩阵是可以带权值的.求所有生成树边权和的时候我们有一个基尔霍夫矩阵,是度数矩阵减去邻接矩阵.而所谓变元矩阵树实际上就是 ...
- 第二天·初识HTML
一·什么是HTML HTML(HyperText Markup Language)是超文本标记语言,"超文本"的意思就是指页面内可以包含图片.链接,甚至音乐.程序等非文字元素.不仅 ...
- ython CGI编程Ⅱ
HTTP头部 hello.py文件内容中的" Content-type:text/html"即为HTTP头部的https://www.xuanhe.net/一部分,它会发送给浏览器 ...
- 什么是JavaScript循环结构?
㈠什么是循环结构 ⑴什么是循环? 反复一遍又一遍的做着相同(相似)的事情 ⑵循环中的两大要素 ①循环条件:什么时候开始,什么时候结束 ②循环操作:循环体,循环过程中,干了什么 ㈡循环结构—while循 ...
- 字符串之format整理
format 用法 本文根据官方文档及自己理解整理,只整理出自己可以理解的部分,h因个人水平有限,难免有所错误和纰漏,欢迎批评指正. 格式{ [field_name] ["!" c ...
- unittest详解(一) unittest初识
unittest是python内置的一个单元测试框架,在学习怎么使用它之前,我们先来了解它的一些概念和原理. Test Case:测试用例,一个TestCase的实例就是一个测试用例.什么是测试用例呢 ...
- 如何在一个页面使用多个router-view显示不同的内容
todo https://www.jianshu.com/p/92f61bf9db81
- conda install -c anaconda
有些包在conda默认的channels中不包含,比如cudatoolkit-8.0,cudnn等,这时只需要在conda install指令后加上-c anaconda即可.比如要下载cudatoo ...