内容简介:纯Jquery实现年月选择,并且根据当
帮一网友所做,效果如图。
具体功能是:点击文本框,显示年月列表,确定之后下拉列表框将这个月分为几周,比如,第一首是从1号到3号,第二周便是4号到10号,以此类推。
开始想的是使用部分jq+updatepanel+后置代码,但是总是觉得这样的效果不好,刷新一个年份就要与服务器进行交互,如果网络太差却是给人感觉不好,所以决定使用纯js和jq来做。
废话不多说。
1.首先实现年月选择列表,使用一个div将按钮列表之类全部放在其中,并且定位方式使用绝对定位,这个很重要,为了点击文本框的时候,显示出来不会讲其余的div撑开,使用绝对定位可让其悬浮在上,而不影响其他布局。布局好之后,这个放于一旁,不用设置其所在位置。它的位置后面再说,好了布局完成,贴上代码,由于是测试,有些样式就写在div里面了。
年月列表CODE <!--时间月份选择框--> <div id="d1" style="display: none; height: 222px; width: 150px; position: absolute"> <asp:Panel ID="p1" runat="server" Width="150px" Height="222px" BackColor="#CCCCCC"> <div style="width: 100%; height: 30px;"> <table style="width: 100%"> <tr> <td> <input id="btnup" type="button" class="btn" value="<<" /> <input id="btndown" type="button" value=">>" class="btn" /> </td> <td style="text-align: right"> <input id="btnhide" type="button" class="btn" value="确定" /> </td> </tr> </table> </div> <div style="width: 100%; height: 170px;"> <select size="4" name="listyymm" id="listyymm" class="listbox"> </select> </div> </asp:Panel> </div> <!-------------------------->
2.既然布局好了,那么就要实现的绑定了,而这个列表框使用 select标记而不是listbox。这是为什么呢?因为这些功能都是js实现的,列表中的数据也是js绑定的,如果使用listbox,并且使用js绑定数据,在浏览的时候就要出错了,具体原因就不详解了。包括后面 下拉列表框同样使用的是select而不是listbox,两个样式不同只是一个size属性控制而已。
好了,将绑定年月的code贴上
绑定年月CODE var year = 0; //绑定年月 function time() { $("#listyymm").empty(); var date = new Date(); var yy = date.getFullYear() + year; for (var i = 1; i <= 12; i++) { if (i < 10) { i = "0" + i; } $("#listyymm").append("<option value='Value'>" + yy + "年" + i + "月</option>"); } $('#listyymm')[0].selectedIndex = 0; };
在代码声明了一个year的全局变量,用于点击按钮时改变年份,而月份是固定的12月这个就不用管了。
上下年份Code //上下一年按钮 $("#btndown").click(function () { year += 1; time(); }); $("#btnup").click(function () { year -= 1; time(); });
好了,数据算是绑定完了,然后点击按钮将选中的数据复制到文本框中,当数据复制到文本框后并且将这个div重新隐藏。
确定Code //确定按钮 $("#btnhide").click(function () { var itme = $("#listyymm").find("option:selected").text(); $("#txt1:text").val(itme.toString()); week(); $("#d1").css("display", "none"); });
这样算是完成一小半了。但是,为了视觉效果更好,所以,还应该做到无论文本框在哪儿,年月列表框就出现在哪儿。所以,这个时候就用到绝对定位了开始的时候是将容纳年月的div的display设为none,也就隐藏了,但点击文本框的时候就显示出来,并且让它显示在文本框下面。
所以就需要给文本框添加click事件,并且还要获取文本框在浏览器中的绝对位置,通过这个坐标来动态改变年月div。
文本框click事件Code $(function () { //文本框单击事件 $("#txt1").click(function () { $("#d1").css("display", "block"); var top = ($("#txt1").offset().top); top += 25; var left = $("#txt1").offset().left; $("#d1").css("top", top); $("#d1").css("left", left); time(); });
3.既然年月绑定好了,那么就要以周为单位来分割这个月了。
首先做好显示周次的样式布局。其实很简单,也就是一个select标记
<select name="dropweek" id="dropweek" class="dropweek"></select>
然后获取这个月的1号是周几,然后通过1号和1号对应的周次来推算了后面每天对应的周次。这个逻辑花了我不少时间,脑袋实在不够用了。其实整个程序最复杂就是这个周次分割了。代码贴上。
周次分割月份Code //绑定周 function week() { var text = $("#txt1").val() var ymd = text.substring(0, 4) + "-" + text.substring(5, 7) + "-1"; var week = new Date(Date.parse(ymd.replace(/\-/g, "/"))); var w = week.toString().substring(0, 3); var yymm = new Date(text.substring(0, 4), text.substring(5, 7), 0); var day = yymm.getDate(); var dd = 1; switch (w) { case "Mon": dd = 0; break; case "Tue": dd = 1; break; case "Wed": dd = 2; break; case "Thu": dd = 3; break; case "Fri": dd = 4; break; case "Sat": dd = 5; break; case "Sun": dd = 6; break; } var aw = 5; if (day == 28 && dd == 0) { aw = 4; } var i = 1; $("#dropweek").empty(); for (var i = 0; i < aw; i++) { var start = i * 7 + 1 - dd; var end = i * 7 + 7 - dd; if (start < 1) { start = 1; } if (end > day) { end = day; } var str = ("第" + (i + 1) + "周 <" + text.substring(5, 7) + "月" + start + "号—" + text.substring(5, 7) + "月" + end + "号>").toString(); $("#dropweek").append("<option value='Value'>" + str + "</option>"); } $('#dropweek')[0].selectedIndex = 0; var itme = $("#dropweek").find("option:selected").text(); $("#txtweek:text").val(itme.toString()); }
现在虽然绑定上了,但是在后置代码中要怎么去获取他选中项的数据呢?而且这里是html标记,不是服务端的控件,后置代码中是不能直接获取了,那么有人说添加一个runat="server" 后面使用request来获取,,但是我没能成功,所以想了一个折中的办法。使用一个服务端的textbox,装在div里面隐藏在页面中,列表中选中项改变时就将值复制到文本框中,这样还有一个好处就是在后置代码中直接使用textbox.text就获取到了,比较符合平时的使用。
4.这样也就完成了。最后贴上完整的代码。
完整Code <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default2.aspx.cs" Inherits="Default2" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title></title> <script src=http://blog.csdn.net/dyllove98/article/details/"Scripts/jquery-1.4.1.js" type="text/javascript"></script> <script type="text/javascript"> var year = 0; //绑定年月 function time() { $("#listyymm").empty(); var date = new Date(); var yy = date.getFullYear() + year; for (var i = 1; i <= 12; i++) { if (i < 10) { i = "0" + i; } $("#listyymm").append("<option value='Value'>" + yy + "年" + i + "月</option>"); } $('#listyymm')[0].selectedIndex = 0; }; //绑定周 function week() { var text = $("#txt1").val() var ymd = text.substring(0, 4) + "-" + text.substring(5, 7) + "-1"; var week = new Date(Date.parse(ymd.replace(/\-/g, "/"))); var w = week.toString().substring(0, 3); var yymm = new Date(text.substring(0, 4), text.substring(5, 7), 0); var day = yymm.getDate(); var dd = 1; switch (w) { case "Mon": dd = 0; break; case "Tue": dd = 1; break; case "Wed": dd = 2; break; case "Thu": dd = 3; break; case "Fri": dd = 4; break; case "Sat": dd = 5; break; case "Sun": dd = 6; break; } var aw = 5; if (day == 28 && dd == 0) { aw = 4; } var i = 1; $("#dropweek").empty(); for (var i = 0; i < aw; i++) { var start = i * 7 + 1 - dd; var end = i * 7 + 7 - dd; if (start < 1) { start = 1; } if (end > day) { end = day; } var str = ("第" + (i + 1) + "周 <" + text.substring(5, 7) + "月" + start + "号—" + text.substring(5, 7) + "月" + end + "号>").toString(); $("#dropweek").append("<option value='Value'>" + str + "</option>"); } $('#dropweek')[0].selectedIndex = 0; var itme = $("#dropweek").find("option:selected").text(); $("#txtweek:text").val(itme.toString()); } $(function () { //文本框单击事件 $("#txt1").click(function () { $("#d1").css("display", "block"); var top = ($("#txt1").offset().top); top += 25; var left = $("#txt1").offset().left; $("#d1").css("top", top); $("#d1").css("left", left); time(); }); //确定按钮 $("#btnhide").click(function () { var itme = $("#listyymm").find("option:selected").text(); $("#txt1:text").val(itme.toString()); week(); $("#d1").css("display", "none"); }); //上下一年按钮 $("#btndown").click(function () { year += 1; time(); }); $("#btnup").click(function () { year -= 1; time(); }); //dropdownonchange $("#dropweek").change(function () { var itme = $("#dropweek").find("option:selected").text(); $("#txtweek:text").val(itme.toString()); }); }); </script> <style type="text/css"> .listbox { width: 148px; height: 190px; border: 1px solid #c0c0c0; } .btn { width: 44px; height: 22px; border: 1px solid #c0c0c0; background-color: #f0f0f0; } .dropweek { width: 220px; height: 22px; border: 1px solid #c0c0c0; } </style> </head> <body> <form id="form1" runat="server"> <!--时间月份选择框--> <div id="d1" style="display: none; height: 222px; width: 150px; position: absolute"> <asp:Panel ID="p1" runat="server" Width="150px" Height="222px" BackColor="#CCCCCC"> <div style="width: 100%; height: 30px;"> <table style="width: 100%"> <tr> <td> <input id="btnup" type="button" class="btn" value="<<" /> <input id="btndown" type="button" value=">>" class="btn" /> </td> <td style="text-align: right"> <input id="btnhide" type="button" class="btn" value="确定" /> </td> </tr> </table> </div> <div style="width: 100%; height: 170px;"> <select size="4" name="listyymm" id="listyymm" class="listbox"> </select> </div> </asp:Panel> </div> <!--------------------------> <div> <asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click" /> <asp:TextBox ID="txt1" onfocus="this.blur()" runat="server"></asp:TextBox> <div style="display: none"> <asp:TextBox ID="txtweek" runat="server"></asp:TextBox></div> <select name="dropweek" id="dropweek" class="dropweek"> </select> </div> </form> </body> </html>
后置代码获取两个数据
//输出年月
Response.Write(txt1.Text);
//输出dropdownlist中选中项,也就是第?周 是 几号至几号
string str = txtweek.Text;
Response.Write(str);
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- 根据输入的日期(年月日)判断是星期几——golang实现
- php如何实现session,自己实现session,laravel如何实现session
- AOP如何实现及实现原理
- webpack 实现 HMR 及其实现原理
- Docker实现原理之 - OverlayFS实现原理
- 为什么实现 .NET 的 ICollection 集合时需要实现 SyncRoot 属性?如何正确实现这个属性?
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Java编程思想
埃克尔 / 机械工业出版社 / 2007-5-1 / 79.00元
《Java编程思想(英文版•第4版)》内容简介:特色:1.适合初学者与专业人员的经典的面向对象的叙述方式;为更新的Java SE5/6的相关内容增加了新的示例和章节。2.测验框架显示程序输出。3.设计模式贯穿于众多示例中:适配器、桥接器、职责链、命令、装饰器、外观、工厂方法、享元、点名、数据传输对象、空对象、代理、单例、状态、策略、模板方法以及访问者。4.为数据传输引入了XML;为用户界面引入了S......一起来看看 《Java编程思想》 这本书的介绍吧!