@hotjp
2018-01-20T16:01:25.000000Z
字数 6619
阅读 1225
培训
最后更新日期: 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>';
// 实例dom
var 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赋值给c
var 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>