-
1. 省市联动:在网页上,选择对应的省份之后,动态的关联出该省份对应的市。选择对应的市之后,动态地关联出城市对应的区。2. 设计数据库表123456789101112131415t_area (区域表)id(PK-自增) code name pcode---------------------------------------------1 001 河北省 null2 002 河南省 null3 003 石家庄 0014 004 邯郸 0015 005 郑州 0026 006 洛阳 0027 007 江苏 null8 008 南京 007 将全国所有的省、市、区、县等信息都存储到一张表当中。采用的存储方式实际上是code pcode形势。3. 这里只是一个模拟,所以建的数据库是不完整的,想要完整的数据库,可以去网上找。4. 上代码(1)自写的jQquery库12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849function jQuery(selector){ // selector可能是#id,也可以是其他的选择器,例如类选择器:.class if(typeof selector == "string"){ if (selector.charAt(0) == '#') { domObj = document.getElementById(selector.substring(1)); return new jQuery(); } } if(typeof selector == "function"){ window.onload = selector; } this.html = function(htmlStr){ domObj.innerHTML = htmlStr; } this.click = function(fun){ domObj.onclick = fun; } this.val = function(v){ if (v == undefined) { return domObj.value; }else{ domObj.value = v; } } this.change = function(fun){ domObj.onchange = fun; } // 静态的方法:发送ajax请求 jQuery.ajax = function(jsonArgs){ var xhr = new XMLHttpRequest(); xhr.onreadystatechange = function(){ if (this.readyState == 4) { if (this.status == 200) { var jsonObj = JSON.parse(this.responseText); jsonArgs.success(jsonObj); } } } if (jsonArgs.type.toUpperCase() == "POST") { xhr.open("POST",jsonArgs.url,jsonArgs.async); xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded") xhr.send(jsonArgs.data); } if (jsonArgs.type.toUpperCase() == "GET") { xhr.open("GET",jsonArgs.url + "?" + jsonArgs.data,jsonArgs.async); xhr.send(); } }}$=jQuery;(2)html文件(Ajax请求)1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>用ajax实现省市联动</title></head><body><!--引入自己编写的jQuery库--><script type="text/javascript" src="/ajax/js/jQuery-1.0.0.js"></script><!--<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>--><script type="text/javascript">$(function(){ // 发送ajax请求,获取所有的省份,省份的pcode是null $.ajax({ type: "get", url : "/ajax/listArea", data : "t=" + new Date().getTime(), async : true, success:function(jsonArr){ var html = "<option value=\"\">--请选择省份--</option>"; for (var i = 0; i < jsonArr.length; i++) { var area = jsonArr[i]; html += "<option value=\""+area.code+"\">"+area.name+"</option>" } $("#province").html(html) } }) // 只要change发生,就发送ajax请求 $("#province").change(function(){ $.ajax({ type: "get", url : "/ajax/listArea", data : "t=" + new Date().getTime()+ "&pcode="+this.value, async : true, success:function(jsonArr){ var html = "<option value=\"\">--请选择市--</option>"; for (var i = 0; i < jsonArr.length; i++) { var area = jsonArr[i]; html += "<option value=\""+area.code+"\">"+area.name+"</option>" } $("#city").html(html) } }) })})</script><select id="province"></select><select id="city"></select></body></html>(3)servlet文件(后端)12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182package com.bjpowernode.ajax.servlet; import com.alibaba.fastjson.JSON;import com.bjpowernode.ajax.bean.Area;import jakarta.servlet.ServletException;import jakarta.servlet.annotation.WebServlet;import jakarta.servlet.http.HttpServlet;import jakarta.servlet.http.HttpServletRequest;import jakarta.servlet.http.HttpServletResponse; import java.io.IOException;import java.sql.*;import java.util.ArrayList; /** * 动态获取所有的省份 */@WebServlet("/listArea")public class ListAreaServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 连接数据库,获取所有的对应区域,最终响应一个JSON格式的字符串给WEB前端 Connection conn = null; PreparedStatement ps = null; ResultSet rs= null; ArrayList<Area> areas = new ArrayList<>(); String pcode = request.getParameter("pcode"); String sql; try { Class.forName("com.mysql.cj.jdbc.Driver"); String url = "jdbc:mysql://localhost:3306/bjpowernode?useUnicode=true&characterEncoding=UTF-8"; String user = "root"; String password = "1234"; conn = DriverManager.getConnection(url,user,password); if (pcode == null){ sql = "select code,name from t_area where pcode is null"; ps = conn.prepareStatement(sql); }else{ sql = "select code,name from t_area where pcode = ?"; ps = conn.prepareStatement(sql); ps.setString(1,pcode); } rs = ps.executeQuery(); while (rs.next()) { String code = rs.getString("code"); String name = rs.getString("name"); Area area = new Area(code, name); areas.add(area); } } catch (ClassNotFoundException e) { throw new RuntimeException(e); } catch (SQLException e) { throw new RuntimeException(e); } finally{ if (rs != null) { try { rs.close(); } catch (SQLException e) { throw new RuntimeException(e); } } if (ps != null) { try { ps.close(); } catch (SQLException e) { throw new RuntimeException(e); } } if (conn != null) { try { conn.close(); } catch (SQLException e) { throw new RuntimeException(e); } } } response.setContentType("text/html,charset=UTF-8"); String json = JSON.toJSONString(areas); response.getWriter().print(json); } }
-
本篇文章主要介绍了js封装成插件的步骤方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧由于项目原因,工作一年多还没用js写过插件,项目太成熟,平时基本都是在使用已经封装好的功能插件。感觉自己好low......这两天想自己抽空写一个canvas画统计图与折现图的插件,所以就去网上学习了下如何封装.....虽然之前看了很多源码,但是感觉就算了解也是野路子.....什么是封装呢?我的理解就是 把一个功能单独做成一个组件,就像做饺子,以前做饺子必须自己先用面粉做饺子皮,再做饺子馅,然后再手工包饺子,但是现在人们发明了自动包饺子机器,虽然机器里面的每一步骤和你自己包饺子是一样的,但是实际上你现在需要做的就只有一件事,就是放原料。这边机器就是封装好的插件,而原料就是你要传的参数为什么要把js功能封装成插件呢?我觉得有以下几点吧 1、便于代码复用 2、避免各个相同功能组件的干扰,可能会有作用域的一些问题吧 3、便于维护,同时利于项目积累 4、不觉得一直复制粘贴很low么.......我在网上看到的封装好像有两种,一种是js的原生封装,一种是jquery的封装。这边我先讲一下原生封装吧。我们在封装的时候会把js代码放到一个自执行函数里面,这样可以防止变量冲突。1234567(function(){ ...... ...... }()} 然后再创建一个构造函数123456789(function(){ var demo = function(options){ ...... } }()) 把这个函数暴露给外部,以便全局调用123456(function(){ var demo = function(options){ ...... } window.demo = demo;}())其实现在你可以直接调用了,封装好了,虽然没实现什么功能1234var ss = new demo({ x:1, y:2});或者1234new demo({ x:2, y:3});然后传参怎么搞呢,我们一个插件一般有一些必选参数或者可选参数,在我看来可选参数不过就是在插件里面给了默认值罢了。我们传的参数会覆盖插件中的默认参数,可以用$.extend({})覆盖12345678910111213141516171819(function(){ var demo = function(options){ this.options = $.extend({ "x" : 1, "y" : 2, "z" : 3 },options) } window.demo = demo; }()) 然后你可以在在初始化构造函数的时候执行一些操作12345678910111213141516171819(function(){ var demo = function(options){ this.options = $.extend({ "x" : "1", "y" : "2", "z" : "3" },options); this.init(); }; demo.prototype.init = function(){ alert("x是"+this.options.x+" y是"+this.options.y+" z是"+this.options.z); }; window.demo = demo;}());new demo({ "x" :"5", "y" :"4"});</script>就是这样了。一个超级简单的封装 我这边有个疑问,extend只是jquery有吗,js对象有什么代替方法吗?晚点在看看............. 还有需要提的是封装js的时候我们要考虑周全,比如它的扩展性和兼容性,还有性能怎么样,还有没必要的就不需要封装了......要有选择性。现在网上已经完成的插件数不胜数,而且功能又十分强大,但是恰恰是这点,有的时候一个很大的插件我们只用到很小的一部分,那么就需要我们自己修改成适合我们自己的了,而且有些项目的风格和现在的插件风格也不同,所以关键是要适合自己的项目。以上就是本文的全部内容,希望对大家的学习有所帮助转载自https://www.jb51.net/article/123369.htm
-
【文章的来源(华为云社区)】一、jQuery动画效果jQuery提供的一组网页中常见的动画效果,这些动画是标准的、有规律的效果;同时还提供给我们了自定义动画的功能。1、显示动画方式一:无参数,表示让指定的元素直接显示出来。其实这个方法的底层就是通过display: block;实现的。$("div").show();方式二:通过控制元素的宽高、透明度、display属性,逐渐显示,例如:3秒后显示完毕。$('div').show(3000);方式三:和方式二类似,也是通过控制元素的宽高、透明度、display属性,逐渐显示。$("div").show("slow");参数说明:slow 慢:600ms normal 正常:400ms fast 快:200ms方式四:动画执行完后,立即执行回调函数。//show(毫秒值,回调函数; $("div").show(5000,function () { alert("动画执行完毕!"); });总结:上面的四种方式几乎一致:参数可以有两个,第一个是动画的执行时长,第二个是动画结束后执行的回调函数。2、隐藏动画方式参照上面的show()方法的方式。如下: $(selector).hide(); $(selector).hide(1000); $(selector).hide("slow"); $(selector).hide(1000, function(){});练习 : 实现点击按钮显示盒子,再点击按钮隐藏盒子实现点击按钮显示盒子,再点击按钮隐藏盒子:<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <style type="text/css"> #box{ width: 200px; height: 200px; background-color: green; border: 1px solid red; display: none; } </style> </head> <body> <div id="box"> </div> <button id="btn">隐藏</button> </body> <script src="jquery-3.3.1.js"></script> <script type="text/javascript"> //jquery 提供了一些方法 show() hide() 控制元素显示隐藏 var isShow = true; $('#btn').click(function(){ if(isShow){ $('#box').show('slow',function(){ $(this).text('盒子出来了'); $('#btn').text('显示'); isShow = false; }) }else{ $('#box').hide(2000,function(){ $(this).text(''); $('#btn').text('隐藏'); isShow = true; }) } }) </script> </html>3、开关式显示隐藏动画$('#box').toggle(3000,function(){});显示和隐藏的来回切换采用的是toggle()方法:就是先执行show(),再执行hide()。代码如下:$('#btn').click(function(){ $('#box').toggle(3000,function(){ $(this).text('盒子出来了'); if ($('#btn').text()=='隐藏') { $('#btn').text('显示'); }else{ $('#btn').text('隐藏'); } }); })4、滑入和滑出1、滑入动画效果:(类似于生活中的卷帘门):下拉动画,显示元素。$(selector).slideDown(speed, 回调函数);注意:省略参数或者传入不合法的字符串,那么则使用默认值:400毫秒(同样适用于fadeIn/slideDown/slideUp)2、滑出动画效果: 上拉动画,隐藏元素。$(selector).slideUp(speed, 回调函数);3、滑入滑出切换动画效果:$(selector).slideToggle(speed, 回调函数);代码如下:示例:<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <style> div { width: 300px; height: 300px; display: none; background-color: green; } </style> <script src="jquery-3.3.1.js"></script> <script> $(function () { //点击按钮后产生动画 $("button:eq(0)").click(function () { //滑入动画: slideDown(毫秒值,回调函数[显示完毕执行什么]); $("div").slideDown(2000, function () { alert("动画执行完毕!"); }); }) //滑出动画 $("button:eq(1)").click(function () { //滑出动画:slideUp(毫秒值,回调函数[显示完毕后执行什么]); $("div").slideUp(2000, function () { alert("动画执行完毕!"); }); }) $("button:eq(2)").click(function () { //滑入滑出切换(同样有四种用法) $("div").slideToggle(1000); }) }) </script> </head> <body> <button>滑入</button> <button>滑出</button> <button>切换</button> <div></div> </body> </html>5、淡入淡出动画1、淡入动画效果:让元素以淡淡的进入视线的方式展示出来。 $(selector).fadeIn(speed, callback);2、淡出动画效果:让元素以渐渐消失的方式隐藏起来$(selector).fadeOut(1000);3、淡入淡出切换动画效果:通过改变透明度,切换匹配元素的显示或隐藏状态。$(selector).fadeToggle('fast', callback);参数的含义同show()方法。代码如下:示例:<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <style> div { width: 300px; height: 300px; display: none; /*透明度*/ opacity: 0.5; background-color: red; } </style> <script src="jquery-3.3.1.js"></script> <script> $(function () { //点击按钮后产生动画 $("button:eq(0)").click(function () { // //淡入动画用法1: fadeIn(); 不加参数 $("div").fadeIn(); // //淡入动画用法2: fadeIn(2000); 毫秒值 // $("div").fadeIn(2000); // //通过控制 透明度和display //淡入动画用法3: fadeIn(字符串); slow慢:600ms normal正常:400ms fast快:200ms // $("div").fadeIn("slow"); // $("div").fadeIn("fast"); // $("div").fadeIn("normal"); //淡入动画用法4: fadeIn(毫秒值,回调函数[显示完毕执行什么]); // $("div").fadeIn(5000,function () { // alert("动画执行完毕!"); // }); }) //滑出动画 $("button:eq(1)").click(function () { // //滑出动画用法1: fadeOut(); 不加参数 $("div").fadeOut(); // //滑出动画用法2: fadeOut(2000); 毫秒值 // $("div").fadeOut(2000); //通过这个方法实现的:display: none; // //通过控制 透明度和display //滑出动画用法3: fadeOut(字符串); slow慢:600ms normal正常:400ms fast快:200ms // $("div").fadeOut("slow"); // $("div").fadeOut("fast"); // $("div").fadeOut("normal"); //滑出动画用法1: fadeOut(毫秒值,回调函数[显示完毕执行什么]); // $("div").fadeOut(2000,function () { // alert("动画执行完毕!"); // }); }) $("button:eq(2)").click(function () { //滑入滑出切换 //同样有四种用法 $("div").fadeToggle(1000); }) $("button:eq(3)").click(function () { //改透明度 //同样有四种用法 $("div").fadeTo(1000, 0.5, function () { alert(1); }); }) }) </script> </head> <body> <button>淡入</button> <button>淡出</button> <button>切换</button> <button>改透明度为0.5</button> <div></div> </body> </html>6、自定义动画语法:$(selector).animate({params}, speed, callback);作用:执行一组CSS属性的自定义动画。第一个参数表示:要执行动画的CSS属性(必选)第二个参数表示:执行动画时长(可选)第三个参数表示:动画执行完后,立即执行的回调函数(可选)代码如下:示例:<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <style> div { position: absolute; left: 20px; top: 30px; width: 100px; height: 100px; background-color: green; } </style> <script src="jquery-3.3.1.js"></script> <script> jQuery(function () { $("button").click(function () { var json = {"width": 500, "height": 500, "left": 300, "top": 300, "border-radius": 100}; var json2 = { "width": 100, "height": 100, "left": 100, "top": 100, "border-radius": 100, "background-color": "red" }; //自定义动画 $("div").animate(json, 1000, function () { $("div").animate(json2, 1000, function () { alert("动画执行完毕!"); }); }); }) }) </script> </head> <body> <button>自定义动画</button> <div></div> </body> </html>7、停止动画$(selector).stop(true, false);参数说明:第一个参数: true:后续动画不执行。 false:后续动画会执行。 第二个参数: true:立即执行完成当前动画。 false:立即停止当前动画。PS:参数如果都不写,默认两个都是false。实际工作中,直接写stop()用的多。示例:鼠标悬停,弹出下拉菜单:<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <style type="text/css"> * { margin: 0; padding: 0; } ul { list-style: none; } .wrap { width: 330px; height: 30px; margin: 100px auto 0; padding-left: 10px; background-color: pink; } .wrap li { background-color: green; } .wrap > ul > li { float: left; margin-right: 10px; position: relative; } .wrap a { display: block; height: 30px; width: 100px; text-decoration: none; color: #000; line-height: 30px; text-align: center; } .wrap li ul { position: absolute; top: 30px; display: none; } </style> <script src="jquery-3.3.1.js"></script> <script> //入口函数 $(document).ready(function () { //需求:鼠标放入一级li中,让他里面的ul显示。移开隐藏。 var jqli = $(".wrap>ul>li"); //绑定事件 jqli.mouseenter(function () { $(this).children("ul").stop().slideDown(1000); }); //绑定事件(移开隐藏) jqli.mouseleave(function () { $(this).children("ul").stop().slideUp(1000); }); }); </script> </head> <body> <div> <ul> <li> <a href="javascript:void(0);">一级菜单1</a> <ul> <li><a href="javascript:void(0);">二级菜单2</a></li> <li><a href="javascript:void(0);">二级菜单3</a></li> <li><a href="javascript:void(0);">二级菜单4</a></li> </ul> </li> <li> <a href="javascript:void(0);">二级菜单1</a> <ul> <li><a href="javascript:void(0);">二级菜单2</a></li> <li><a href="javascript:void(0);">二级菜单3</a></li> <li><a href="javascript:void(0);">二级菜单4</a></li> </ul> </li> <li> <a href="javascript:void(0);">三级菜单1</a> <ul> <li><a href="javascript:void(0);">三级菜单2</a></li> <li><a href="javascript:void(0);">三级菜单3</a></li> <li><a href="javascript:void(0);">三级菜单4</a></li> </ul> </li> </ul> </div> </body> </html>上方代码中,关键的地方在于,用了stop函数,再执行动画前,先停掉之前的动画。
-
一、概要近日研究人员发现apache jQuery-File-Upload <= v9.22.0中存在未经身份验证的任意文件上载漏洞(CVE-2018-9206)可以导致远程代码执行,该漏洞exp已被公布,建议涉及的用户尽快完成漏洞修复。jQuery-File-Upload是一个应用广泛的文件上传工具,该漏洞的主要原因为jQuery File Upload的安全限制被绕过,通过该漏洞攻击者可上传web shell进而造成远程命令执行,漏洞威胁等级为严重。参考链接:https://www.zdnet.com/article/zero-day-in-popular-jquery-plugin-actively-exploited-for-at-least-three-years/#ftag=RSSbaffb68二、漏洞级别漏洞级别:【严重】(说明:漏洞级别共四级:一般、重要、严重、紧急。)三、影响范围漏洞影响Apache jQuery-File-Upload 9.22.0及以下版本。四、安全建议官方已经在9.22.1更新中修复该漏洞,请及时更新。更新链接:https://github.com/blueimp/jQuery-File-Upload注意:修复漏洞前请将资料备份,并进行充分测试。
-
jQuery.i18n.properties 简介 [color=rgb(51,51,51)]jQuery.i18n.properties 是一款轻量级的 jQuery 国际化插件。与 Java 里的资源文件类似,jQuery.i18n.properties 采用 .properties 文件对 JavaScript 进行国际化。jQuery.i18n.properties 插件根据用户指定的(或浏览器提供的 )语言和国家编码(符合 ISO-639 和 ISO-3166 标准)来解析对应的以“.properties”为后缀的资源文件。 [color=rgb(51,51,51)]总的来说,jQuery.i18n.properties 有一下一些特点: 1.使用 Java 标准的 .properties 文件作为资源文件,资源文件命名有以下三种格式: basename_properties basename_language.properties basename_language_country.properties 2.使用 ISO-639 作为语言编码标准,ISO-3166 作为国家名称编码标准 3.按顺序加载默认资源文件和指定语言环境的资源文件,保证默认值始终可用 4.未指定语言环境时使用浏览器提供的语言 5.可以在资源字符串中使用占位符(例如:hello= 你好 {0}! 今天是 {1}。) 6.资源文件中的 Key 支持命名空间(例如:com.company.msgs.hello = Hello!) 7.支持跨行的值 8.可以以 JavaScript 变量(或函数)或 Map 的方式使用资源文件中的 Key jQuery.i18n.properties(settings) 选项描述类型可选?name资源文件的名称,例如 strings 或 [strings1,strings2],前者代表一个资源文件,后者代表资源文件数组。String 或 String[]否path资源文件所在目录的路径String是mode加载模式:“vars”表示以 JavaScript 变量或函数的形式使用资源文件中的 Key,“map”表示以 Map 的方式使用资源文件中的 Key,“both”表示可以同时使用两种方式。如果资源文件中的 Key 包含 JavaScript 的关键字,则只能采用“map”。默认值是“vars”。String是languageISO-639 指定的语言编码(如:“en”表示英文、“zh”表示中文),或同时使用 ISO-639 指定的语言编码和 ISO-3166 指定的国家编码(如:“en_US”,“zh_CN”等)。如果不指定,则采用浏览器报告的语言编码。String是cache指定浏览器是否对资源文件进行缓存,默认为 false。boolean是encoding加载资源文件时使用的编码。默认为 UTF-8。String是callback代码执行完成时运行的回调函数function是
推荐直播
-
华为云码道Agent集成与鸿蒙实战2026/08/11 周二 19:00-21:00
王一男-华为云码道产品规划专家;李炎-华为云码道产品专家;彭江敏-华为云鸿蒙端云一体化开发专家
本次直播带你解读华为云码道7月份产品新特性、新功能。更有专家演示码道Agent Space × 钉钉机器集成实战,从0到1打通消息通道;码道鸿蒙端云一体化实战,快速搭建员工签到系统。
回顾中 -
华为云开发者AI素养直播课·第五期2026/09/04 周五 16:00-18:00
林华鼎-华为云AI开发者运营负责人;蒋春阳-华为云AI开发者案例开发专家
本期直播内容: AI工具体验营 · 第5-8课连讲。Agent-Team 多智能体协作完成毕业设计实践
回顾中 -
华为云开发者AI素养ClassRoom·第六期2026/09/08 周二 19:00-20:00
樊渊-2026华为软件挑战赛冠军
高手来了:看软挑高手解析二维排样问题—从工业难题到算法突破
回顾中
热门标签