结论:

闭包可以当作强类型语言如C++、Java的全局变量使用,非常巧妙

需求:

ssm项目,使用pagehelper分页,在写前一页、后一页、第一页、最后一页等页面跳转时,遇到了问题,如果查询全部的数据,访问控制器返回全部数据,跳转页面时没有问题,如果是条件查询,就会出现问题:如何在跳转页面时把相应的查询参数带上,毕竟无条件查询可以不带参数,但是如果条件查询不带参数就会乱套。

项目初始代码

最开始所有页面全部使用url进行跳转,其中queryCourseBynameandtime是条件查询,三个条件可以随机组合,也可以全为空,queryAllCourse为查询所有数据,

存在上面的问题,那么如何解决呢?

表单:

<form class="layui-form layui-col-md12 x-so" action="${pageContext.request.contextPath}/queryCourseBynameandtime">
<%--按照name进行查询--%>
<input class="layui-input" placeholder="开始日" name="start" id="start">
<input class="layui-input" placeholder="截止日" name="end" id="end">
<input type="text" name="coursename" placeholder="请输入课程名" autocomplete="off" class="layui-input">
<button class="layui-btn" lay-submit="" lay-filter="sreach"><i class="layui-icon">&#xe615;</i></button>
<label>是否模糊查询</label>
<input type="radio" value="true" name="fuzzquery">
</form>

跳转页面:

<a href="${pageContext.request.contextPath}/queryAllCourse?pn=1">首页</a>
<a href="${pageContext.request.contextPath}/queryAllCourse?pn=${pageInfo.pageNum-1}">上一页</a>
<a href="${pageContext.request.contextPath}/queryAllCourse?pn=${pageInfo.pageNum+1}">下一页</a>
<a href="${pageContext.request.contextPath}/queryAllCourse?pn=${pageInfo.pages}">尾页</a>

尝试一:js全局变量保存拼接的url

在学习了部分JQuery后,我觉得利用JQuery和字符串拼接可以解决这个问题
情景一

  • 步骤一:填写查询条件
  • 步骤二:点击查询,触发onclick,调用封装的js函数,对参数进行保存,拼接成url,其url访问queryCourseBynameandtime
  • 步骤三:利用js进行页面跳转,摒弃form的action方式(因为其的url是不可以变化的)
  • 步骤四:利用js将“首页、上一页”等取代a标签的跳转功能,根据已保存的全局变量url,传入pn参数进行跳转

情景二

  • 步骤一:不填写查询条件,查询全部数据
  • 步骤二:不触发onclick,调用封装的js函数,对全局url进行初始化,设置为queryAllCourse
  • 步骤单:利用js将“首页、上一页”等取代a标签的跳转功能,根据已保存的全局变量url,传入pn参数进行跳转

实验代码

表单:

<form class="layui-form layui-col-md12 x-so">
<%--按照name进行查询--%>
<input class="layui-input" placeholder="开始日" name="start" id="start">
<input class="layui-input" placeholder="截止日" name="end" id="end">
<input type="text" name="coursename" placeholder="请输入课程名" autocomplete="off" class="layui-input" id="cname">
<button class="layui-btn" type="button" lay-submit="" lay-filter="sreach" id="submit"><i class="layui-icon">&#xe615;</i>
</button>
<label>是否模糊查询</label>
<input type="radio" value="true" name="fuzzquery" id="fuzzquery">
</form>

跳转页面:

<a href = "javascript:;" onclick="tiaozhuan(1)">首页</a>
<a href = "javascript:;" onclick="tiaozhuan(${pageInfo.pageNum-1})">上一页</a>
<a href = "javascript:;" onclick="tiaozhuan(${pageInfo.pageNum+1})">下一页</a>
<a href = "javascript:;" onclick="tiaozhuan(${pageInfo.pages})">尾页</a>

js:

	//全局变量
window.url = null;
//模糊查询url监测
$("#submit").click(function () {
function initurl(){
var start = $("#start").val();
var end = $("#end").val();
var cname = $("#cname").val();
var url1 = "queryCourseBynameandtime?";
var url2 = "start=";
var url3 = "&end=";
var url4 = "&coursename=";
//判断是否选中
if ($('#fuzzquery').is(':checked')) {
var url5 = "&fuzzquery=true";
} else {
var url5 = '';
}
//拼接url
if (start == '' && end == '' && cname == '') {
url = "queryAllCourse";
window.location.href =url;
} else {
url = url1 + url2 + start + url3 + end + url4 + cname + url5;
window.location.href =url;
}
};
function tiaozhuan(num) {
if (url == null) {
window.location.href = "queryAllCourse" + "?pn=" + num;
} else {
var tempurl = url + '?pn=' + num;
window.location.href = tempurl;
}
}

这个解法一开始我还很自信的,但是写完发现js 存在这样的规则:全局变量在页面跳转至新页面是自动置空,这个方法悲催的没有实现。

尝试二:js闭包保存拼接的url

我的理解,闭包可以巧妙地解决全局变量的问题,上面地代码只需稍加修改即可,将上面的JQuery使用id获取button改变为添加onclick,定义触发的函数

<form class="layui-form layui-col-md12 x-so">
<%--按照name进行查询--%>
<input class="layui-input" placeholder="开始日" name="start" id="start">
<input class="layui-input" placeholder="截止日" name="end" id="end">
<input type="text" name="coursename" placeholder="请输入课程名" autocomplete="off" class="layui-input" id="cname">
<button class="layui-btn" type="button" lay-submit="" lay-filter="sreach" id="submit" onclick="initurl()"><i class="layui-icon">&#xe615;</i>
</button>
<label>是否模糊查询</label>
<input type="radio" value="true" name="fuzzquery" id="fuzzquery">
</form>
<a href = "javascript:;" onclick="tiaozhuan(1)">首页</a>
<a href = "javascript:;" onclick="tiaozhuan(${pageInfo.pageNum-1})">上一页</a>
<a href = "javascript:;" onclick="tiaozhuan(${pageInfo.pageNum+1})">下一页</a>
<a href = "javascript:;" onclick="tiaozhuan(${pageInfo.pages})">尾页</a>

js:

 window.url = null;
//模糊查询url监测
function initurl(){
var start = $("#start").val();
var end = $("#end").val();
var cname = $("#cname").val();
var url1 = "queryCourseBynameandtime?";
var url2 = "start=";
var url3 = "&end=";
var url4 = "&coursename=";
//判断是否选中
if ($('#fuzzquery').is(':checked')) {
var url5 = "&fuzzquery=true";
} else {
var url5 = '';
}
//拼接url
if (start == '' && end == '' && cname == '') {
url = "queryAllCourse";
window.location.href =url;
} else {
url = url1 + url2 + start + url3 + end + url4 + cname + url5;
window.location.href =url;
}
return function tz(){
url = url+'';
}
};
function tiaozhuan(num) {
var fn = initurl();
fn();
alert(url);
if (url == null) {
window.location.href = "queryAllCourse" + "?pn=" + num;
} else {
var tempurl = url + '?pn=' + num;
window.location.href = tempurl;
}
}

这样,url变量便一直存在于内存之中了。嘿嘿~js新手,存在错误请指正!


突然意识到,如果使用Ajax传递url和参数,只需要简单判断是否存在参数便确定了大部分的url,利用data-*自定义属性或者利用jquery操作dom获取部分参数,就避免了页面间传递参数的问题,emmmmmm~~~~~~~


再一次更新,突然发现闭包好像不能实现,emmmmmmm~~~~~~~~~ 这里使用window的location对象实现

 function initurl() {
var start = $("#start").val();
var end = $("#end").val();
var cname = $("#cname").val();
var url1 = "queryCourseBynameandtime?";
var url2 = "start=";
var url3 = "&end=";
var url4 = "&coursename=";
//判断是否选中
if ($('#fuzzquery').is(':checked')) {
var url5 = "&fuzzquery=true";
} else {
var url5 = '';
}
//拼接url
if (start == '' && end == '' && cname == '') {
url = "queryAllCourse";
window.location.href = url;
console.log("initurl1:" + url);
} else {
url = url1 + url2 + start + url3 + end + url4 + cname + url5;
window.location.href = url;
}
};
function tiaozhuan(num) {
console.log("tz2:" + window.location.href);
if(window.location.href.indexOf('pn')==-1){//url中没有出现pn
if(window.location.href.indexOf("queryAllCourse")==-1){//url中不存在queryAllCourse
//pn不是第一个参数
window.location.href =window.location.href + "&pn=" + num;
}else {
//pn是第一个参数
window.location.href =window.location.href + "?pn=" + num;
}
}else {//地址url中存在pn
//获取最后=的位置,左闭右开
index = window.location.href.lastIndexOf("=");
//获取上一次访问地址
url = window.location.href;
//地址拼接,拼接页数pn
window.location.href= url.substr(0,index)+"="+num;
}
}

参考:window.location获取url各项参数详解

我的第一次"闭包"应用的更多相关文章

  1. vue中methods中的方法闭包缓存问题

    vue中methods中的方法闭包缓存问题 问题背景 需求描述 在路由的导航栏中需要, 判断是否为第一次点击 需要一个标志位来记录是否点击过 现状: 这个标志位只在一个函数中用过.不希望存放全局 希望 ...

  2. 深入浅出JavaScript之闭包(Closure)

    闭包(closure)是掌握Javascript从人门到深入一个非常重要的门槛,它是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现.下面写下我的学习笔记~ 闭包-无处不 ...

  3. 如何设计一门语言(七)——闭包、lambda和interface

    人们都很喜欢讨论闭包这个概念.其实这个概念对于写代码来讲一点用都没有,写代码只需要掌握好lambda表达式和class+interface的语义就行了.基本上只有在写编译器和虚拟机的时候才需要管什么是 ...

  4. JavaScript学习总结(二)——闭包、IIFE、apply、函数与对象

    一.闭包(Closure) 1.1.闭包相关的问题 请在页面中放10个div,每个div中放入字母a-j,当点击每一个div时显示索引号,如第1个div显示0,第10个显示9:方法:找到所有的div, ...

  5. 匹夫细说C#:委托的简化语法,聊聊匿名方法和闭包

    0x00 前言 通过上一篇博客<匹夫细说C#:庖丁解牛聊委托,那些编译器藏的和U3D给的>的内容,我们实现了使用委托来构建我们自己的消息系统的过程.但是在日常的开发中,仍然有很多开发者因为 ...

  6. 深入理解JavaScript——闭包

    跟很多新手一样我也是初入前端,对闭包的理解花费的时间和精力相当的多.效果也还行,今天我就来根据自己的理解细致的讲一讲闭包,由于是初入学习的时候不免有一些弯路和困惑,我想信这也是很多跟我一样的人会同样遇 ...

  7. JavaScript学习总结——我所理解的JavaScript闭包

    一.闭包(Closure) 1.1.什么是闭包? 理解闭包概念: a.闭包是指有权限访问另一个函数作用域的变量的函数,创建闭包的常见方式就是在一个函数内部创建另一个函数,也就是创建一个内部函数,创建一 ...

  8. 【转】深入浅出JavaScript之闭包(Closure)

    闭包(closure)是掌握Javascript从人门到深入一个非常重要的门槛,它是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现.下面写下我的学习笔记~ 闭包-无处不 ...

  9. javascript中的闭包

    闭包一直是javascript中的难点,也比较不容易被初学者所掌握,"官方"的解释是:所谓"闭包",指的是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是 ...

随机推荐

  1. eventkeyboardmouse

    http://www.javascriptkit.com/jsref/eventkeyboardmouse.shtml

  2. 怎样处理Gradle中的这个文件下载慢的问题的

    如图:在build.gradle中的dependencies中加上要依赖的包后,就点击sync gradle.然后就开始了下载.在此过程中我是FQ了的(在此同时我是可以用chrome进入https:/ ...

  3. bat 截取字符串(for命令) 推荐收藏

    摘自:http://www.jb51.net/article/50354.htm 今天需要用批处理命令处理文件夹中的文件,需要用到bat中的for命令以及字符串截取的一些命令.在上面的链接中找到许多有 ...

  4. oracle给用户授权

    1.在PLSQL里,用sys(oracle系统用户)登陆,登陆的时候一定要选择SYSDBA.普通用户登陆选择normal就可以了 2.创建用户 *也可以给普通用户授权为dba即数据库管理员.在导入导出 ...

  5. bzoj 1704: [Usaco2007 Mar]Face The Right Way 自动转身机【贪心+差分】

    首先O(n^3)的贪心很好想,就是枚举k然后从前往后扫,扫到反就翻转区间 然后考虑优化掉翻转区间维,就是搞成差分的形式,在翻转区间的尾部打上标记,再用一个变量维护当前的翻转次数,加到当前状态上来判断是 ...

  6. robotframework - 测试用例&套件- Settings标签

    1.Test Case -- Settings标签截图 2.Test Case Settings 标签说明: Documentation:用于描述用例的一个小文本,它可以把 URL 地址转换为可点击的 ...

  7. mysql——免安装配置

    1.下载 (1)下载地址:https://dev.mysql.com/downloads/mysql/ (2)选择下载 2.配置环境变量 (1)解压目录:D:\mysql-8.0.16-winx64 ...

  8. BACnet开发资料与调试工具

    一.开发资料 1.认识BACnet协议 2.BACnet网络讲义: 链接:https://pan.baidu.com/s/1A6OOUxvJe1zIYbockqTEsQ提取码:wz49 二.调试工具 ...

  9. [C++ STL] 迭代器(iterator)详解

    背景:指针可以用来遍历存储空间连续的数据结构,但是对于存储空间非连续的,就需要寻找一个行为类似指针的类,来对非数组的数据结构进行遍历.因此,我们引入迭代器概念.   一.迭代器(iterator)介绍 ...

  10. [CREC2007/CQOI2014]robotic sort

    Description 一个实验室里有n个长短不一的试管.你的任务是编写一段程序,用机器臂把它们按照高度从小到大的顺序排列. 对于高度相同的试管,排序前后的相对位置应保持不变.排序方法如图所示. 排序 ...