@hotjp
2018-01-20T08:01:25.000000Z
字数 6619
阅读 1412
培训
最后更新日期: 2018-01-20
$()将类css语法的字符串放在
$()中
// 单元示例$('div')// 返回类名为 classname1 的所有元素集合$('.classname1')// 返回 id 为 id1 的第一个元素集合$('#id1')// 返回 类名为class2的父元素中包含类名为class1的元素集合$('.class1 .class2')<div class=".class1"><div><div class="class2"></div><div class="class2"><div class="class2"></div></div><div></div>// 返回 直接父级节点 直接父级节点 直接父级节点 类名为class的span元素集合$('.class>span')// 返回name为value的元素集合$('[name=value]')<div name="value"><input name="value"><input name="value"></div>// 同上原理可以$('[data-name=value]')<div data-name="value"><input data-name="value"><input data-name="value"></div>// 也有这种操作// 返回匹配集合第一个$('div:first')// 返回匹配集合最后一个$('div:last')// 返回匹配集合索引为奇数的集合$('div:even')// 返回匹配集合索引为偶数的集合$('div:odd')
除了上面列出来的还有很多的 操♂作,可自行查阅sizzle的文档
选择器的执行思路是从右向左,$('body div p span')选择器会遍历出所有span之后遍历查找父级为p元素的然后依次直到body,所以就写得短一点,或者增加唯一度较高的classname或者id
将需要实例的html字符串放在
$()中
// 单元示例$('<div></div>')// 错误,非自闭合标签需要完整书写否则有ie8-的兼容问题$('<div>')var dialogHtml= '' +'<div class="ecGoodsDialog" style="display:none;">' +'<div class="ecDialog">' +' <div class="title">生成商品链接 <span>(全程电商平台接口)</span>' +' <a class="close" id="close" href="javascript:;">x</a>' +' </div>' +'<input class="baseUrl" id="baseUrl" type="text" placeholder="电商主站根目录地址,不要漏掉最后的斜线,例:http://emall.jerei.com/">' +' <a class="validateUrl" id="validateUrl" href="javascript:;">验证地址</a>' +'<hr>' +' <div class="goodsOpt">' +' <input class="baseUrl" id="ecKeyword" type="text" placeholder="要查找的商品名称">' +' <a class="validateUrl sort" href="javascript:;">筛选商品</a>' +' <div class="goodsList">' +' <ul>' +' </ul>' +' <a class="getMore" href="javascript:;">获取更多</a>'+' </div>' +' </div>' +' </div>' +'</div>';// 实例domvar foo = $(dialogHtml);foo.on('click','.getMore',function(){alert(点击了获取更多)})$('body').append(foo);foo.on('click','.getMore',function(){alert(获取更多)})foo.find('.validateUrl').on('click',function(){alert(验证)})
利用jquery提供的函数缩写完成需求
// 单元示例$(function(){...})// 完整含义$(document).ready(function(){...})// 约等于window.onload = function(){}
window.onload 每个页面只能有一个window.onload 等待页面全部资源加载完成后执行 $(function(){}) 每个页面可以存在多个,在队列中依声明顺序执行$(function(){}) 等待页面DOM加载完成后执行so,各位自己按需选择咯。某些十分特殊的情况下可能会需要两种混用,不要忘记先后顺序
jquery 1.7.0开始引入on方法,低版本可以使用live方法,详细的请自行查阅文档,浏览器内置的常用事件列表可以看看w3school
// 写法$(...).on([event name],[selector],[callback]);$(...).on([event name],[callback]);// 示例// 事件将在a元素click事件冒泡至#foo时执行$('#foo').on('click','a',function(){...});// 事件将在click #foo时执行$('#foo').on('click',function(){...});
jquery 1.7.0开始引入off方法,低版本可以使用die方法,详细的请自行查阅文档
// 写法$(...).off([event],[selector],[callback]);$(...).off([event],[callback]);// 示例// 将解绑#foo元素上对a元素的侦听$('#foo').off('click','a',function(){...});// 将解绑#foo元素上的事件侦听$('#foo').on('click',function(){...});
相对于
$(...).click();$(...).hover();等方式更推荐使用on, off的原因是可控性强,风格一致,容易维护
// 给同一个元素绑定相同事件时可以进行事件命名$(...).on('click.foo1',function(){});$(...).on('click.foo2',function(){});// 在适当的时机可以解除某一个特性事件的绑定$(...).off('click.foo1');// 当然也可以一次性全部解绑$(...).off('click');
// 来点刺激的,绑定自定义事件$('body').on('randomEvent',function(event,callback){console.log('执行自定义事件')callback(Math.random())})$('body').trigger('randomEvent',function(num){console.log(num)})// 计算body的面积(参数传递的示例)$('body').on('area',function(event,num1,num2,callback){console.log('元素的面积是:')callback(num1 * num2)})$('body').on('click',function(){$('body').trigger('area',[$(this).width(),$(this).height(),function(area){console.log(area)}])})
$.fn/$.prototype常用操作
// 获取某个表单元素的value值$(...).val()// 获取某个标签元素的文本,过滤掉标签$(...).text();// 获取某个元素内的html字符串$(...).html();// 将一段html字符串追加到页面中,触发dom渲染$(...).html(htmlStr)// 在元素内部最后追加$(...).append(htmlStr);// 在元素内部最前面追加$(...).prepend(htmlStr);// 在元素前面追加$(...).before(htmlStr);// 在元素后面追加$(...).after(htmlStr);// 增加classname$(...).addClass(str);// 删除classname$(...).removeClass(str);// 遍历jquery对象$(...).each(callback);
$常用操作
// 合并对象b到a里$.extend(a,b);// 合并对象a、b赋值给cvar c = $.extend({},a,b);// 去除字符串前后空格$.trim(' abc ');// xhr请求$.ajax(options);// 遍历对象//$.each(obj,[callback]);
问题:遇到不熟悉的函数提供了回调(callback),又不知道会给几个参数怎么办?
function(){console.log(arguments);// 看arguments结构比较迷茫?试试这个,将arguments伪数组转成数组就可以直观的看到收到的参数啦console.log([].slice.call(arguments))}
问题:页面上的js不执行
问题多见于在jsp或者ftl页面中使用include等方法拆分模板后
页面最终
<!DOCTYPE html><html lang="zh-CN"><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>Document</title><script src="./js/jquery-1.11.0.js"></script><script>$('body').css('background','#000');</script></head><body></body></html>
文档是自上而下解析,所以我们的$('body')在代码执行时尚不存在
解决方法是我们的开发思路也保持单线程或者巧妙地利用‘回调’
1.在元素存在的时候操作元素
<!DOCTYPE html><html lang="zh-CN"><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>Document</title><script src="./js/jquery-1.11.0.js"></script></head><body><script>// js放置在页面最底部,代码解析到这里时,其上元素皆已经在栈内$('body').css('background','#000');</script></body></html>
2.利用回调
<!DOCTYPE html><html lang="zh-CN"><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>Document</title><script src="./js/jquery-1.11.0.js"></script><script>// 1.jquery的dom载入完成的回调(时机好,可多次使用)$(function(){$('body').css('background','#000');});// 2.原生的页面载入完成的事件(时机晚,不能重复声明)window.onload = function(){$('body').css('background','#000');};</script></head><body></body></html>
问题:两个需要从后台获取数据的接口数据需要相互使用
<!DOCTYPE html><html lang="zh-CN"><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>Document</title><script src="./js/jquery-1.11.0.js"></script><script src="./js/fakeAjax.js"></script></head><body><script>var list = [];$.ajax({url:'第一个接口',data:{list:[1,2,3,4,5]},success:function(res){list = res.data.list;}});$.ajax({url:'第二个接口',data:{newList:list},success:function(res){console.log(res.data.newList);}});</script></body></html>
第二个接口需要第一个接口返回的list数据,两个并行的异步函数使得功能难以实现的时候有一个解决方案
将数据的依赖关系搞清楚,b需要a,那就让a先返回结果在执行b,让b放置在a的回调中
<!DOCTYPE html><html lang="zh-CN"><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>Document</title><script src="./js/jquery-1.11.0.js"></script><script src="./js/fakeAjax.js"></script></head><body><script>var list = [];$.ajax({url: '第一个接口',data: {list: [1, 2, 3, 4, 5]},success: function (res) {list = res.data.list;$.ajax({url: '第二个接口',data: {newList: list},success: function (res) {console.log(res.data.newList);}});}});</script></body></html>