问题1:
web开发中表单无处不在,从邮件订阅、登陆注册到多页填写信息提交,每次都需要花费大量时间和精力处理。
为了让客户端表单验证变得更简单,请基于jQuery 开发一个微量级验证插件(validate),为表单提供验证功能,并提交你的代码。
要求:
(1)可以让用户去配置选项,拥有定制validate插件的能力,如:
- $(“form”). validate({
- defaultEvent: “change”, //自定义校验触发事件
- })
(2)至少包含四种表单验证方式(身份证号码验证、手机电话号码、电子邮箱验证、必填字段验证、最大值/最小值验证)。
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>jQuery 作业</title><script src="jquery-2.0.3.js"></script><script src="jquery.validate.js"></script><style>.context{width: 500px;padding: 30px;margin:50px auto;border-radius:5px;box-shadow: 3px 3px 10px #888888;}</style><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u"crossorigin="anonymous"></head><body><div class="context"><form><div class="form-group"><label>邮箱</label><input type="text" class="form-control" placeholder="请输入邮箱"data-dv-email = truedata-dv-email-error = '请输入正确的邮箱'></div><div class="form-group"><label>手机</label><input type="text" class="form-control" placeholder="请输入手机"data-dv-mobile = truedata-dv-mobile-error = '请输入正确的手机'></div><div class="form-group"><label>座机</label><input type="text" class="form-control" placeholder="请输入座机"data-dv-landline = truedata-dv-landline-error = '请输入正确的座机'></div><div class="form-group"><label>密码</label><input type="password" class="form-control" placeholder="请输入密码"data-dv-password = true></div><button type="text" class="btn btn-success">提交</button></form></div><script>$('form').validate({initEvent: 'blur'});//扩展功能$('form').validate.expand({landline: function() {return /^\d{3,4}-\d{7,8}$/.test(this.val());}});</script></body></html>
正则复习:*:匹配前面的子表达式零次或多次。例如,zo 能匹配 “z” 以及 “zoo”。 等价于{0,}。+:匹配前面的子表达式一次或多次。例如,’zo+’ 能匹配 “zo” 以及 “zoo”,但不能匹配 “z”。+ 等价于 {1,}。?:匹配前面的子表达式零次或一次。例如,”do(es)?” 可以匹配 “do” 或 “does” 中的”do” 。? 等价于 {0,1}。{n}:n 是一个非负整数。匹配确定的 n 次。例如,’o{2}’ 不能匹配 “Bob” 中的 ‘o’,但是能匹配 “food” 中的两个 o。{n,}:n 是一个非负整数。至少匹配n 次。例如,’o{2,}’ 不能匹配 “Bob” 中的 ‘o’,但能匹配 “foooood” 中的所有 o。’o{1,}’ 等价于 ‘o+’。’o{0,}’ 则等价于 ‘o‘。{n,m}:m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,”o{1,3}” 将匹配 “fooooood” 中的前三个 o。’o{0,1}’ 等价于 ‘o?’。请注意在逗号和两个数之间不能有空格。
*\w:匹配包括下划线的任何单词字符。等价于’[A-Za-z0-9_]’。
(function(root, plug) {var RULES = {email: function() {// \w:匹配包括下划线的任何单词字符, 等价于'[A-Za-z0-9_]'return /^\w+@\w+\.\w+$/.test(this.val());},mobile: function() {// 匹配一个数字字符, 等价于 [0-9]return /^1\d{10}$/.test(this.val());},password: function() {// 匹配字符,6-12位,注意6,和12之间不能有空格return /^\w{6,12}$/.test(this.val());}};$.fn[plug] = function(options) {// 判断this是否为form元素if (!this.is('form')) {return this;}// 以默认配置为优先,用户配置为覆盖的原则var __def__ = {initEvent: 'input',sign: 'dv',error: '输入不合法,请检查您的输入'};//合并用户配置和默认配置,注意顺序var ret = $.extend({}, __def__, options);// 获取所有的input控件var keyNot = this.find('input');keyNot.on(ret.initEvent, function() {var error;// 因为event事件是在这个DOM上出发的,所以这里的this指向DOM元素// 要把这里的this包装成jQuery对象var _this = $(this);//如果已经有错误信息,则移除_this.next('span').remove();$.each(RULES, function(key, func){var attrValue = _this.data(ret.sign + '-' + key);if (attrValue) {var result = func.call(_this);if (!result) {error = _this.data(ret.sign + '-' + key + '-error') || __def__.error;if (error) {_this.after('<span style="color: red">'+ error +'</span>');}}}});});};// 扩展功能$.fn[plug]['expand'] = function(options) {$.extend(RULES, options);};})(this, 'validate');
问题2:
图片懒加载(LazyLoad)一直是前端的优化方案之一。
其核心思想是:先将img标签中的src链接设为同一张图片,真正的图片地址存储在img标签的自定义属性中。当js监听到该图片元素进入可视窗口时,将自定义属性中的地址存储到src属性中。
请基于jQuery开发一个懒加载插件。
基础知识拓展:
http://www.ruanyifeng.com/blog/2016/11/intersectionobserver_api.html
动画展示效果: 网页开发时,常常需要了解某个元素是否进入了”视口”(viewport),即用户能不能看到它。
目前有一个新的 IntersectionObserver API,可以自动”观察”元素是否可见,Chrome 51+ 已经支持。由于可见(visible)的本质是,目标元素与视口产生一个交叉区,所以这个 API 叫做”交叉观察器”。
