1、事件委托及 this == id 不兼容 IE 的问题:
//事件委托delegate(),就是给checkbox委托点击事件,选中value赋值1,取消赋值0
$("#queryCondition").delegate("input[type='checkbox']","click",function(){
if($(this).prop("checked")){
$(this).val(1);
}else{
$(this).val(0);
}
});
//但是有一个checkbox比较特殊,后面跟着一个text的input,取消的时候我也需要清空input的值,刚开始考虑这样
$("#queryCondition").delegate("input[type='checkbox']","click",function(){
if($(this).prop("checked")){
$(this).val(1);
}else{
$(this).val(0);
if(this === noBootAssetTime_check){//注意id是不能加引号的
$("#noBootAssetTime").val(0);
}
}
});
经过测试谷歌和火狐均可以,支持 this === id 的条件,但是在IE下就不支持。所以需要修改,现在正好想到拿出 this 的 id来跟id名称进行比较,即:this.id === "id名称",这样就可以兼容IE了,代码如下:
$("#queryCondition").delegate("input[type='checkbox']","click",function(){
if($(this).prop("checked")){
$(this).val(1);
}else{
$(this).val(0);
if(this.id === "noBootAssetTime_check"){
$("#noBootAssetTime").val(0);
}
}
});
delegate() 和 this.id = id 的使用
2、变量赋值与引用传参
这里其实对于基本类型来说没有什么需要重点说明的。这里就重点说下引用类型吧。对于赋值
function setName(obj) {
obj.name = "Neal";
console.log(obj);//{name:"Neal"}
obj = new Object();
obj.name = "yang";
console.log(obj);//{name:"yang"}
}
var person = new Object();
setName(person);
console.log(person.name);//Neal
如上代码,最后console出来的是Neal。
这段代码说明两点:
- 引用类型在传参的时候,是按照引用传递的,不然不可能person.name为Neal
- 即使在函数内部修改了参数的值,原始的引用依然不变。实际上,在重写obj的时候,这个变量的引用已经是一个局部变量了。只是在这儿函数运行完,这个对象被销毁了。
所以说到这,对于对象的赋值,一句以概之:引用的赋值。
3、关于IIFE的注意事项:
IIFE称为立即执行函数,这个立即执行函数有多立即呢?立即执行函数再快也得按照代码执行顺序,逐行执行,如下代码返回1
var a = 1;
(function(){
console.log(a);//1
})();
类似地,函数也是这种情况
function a(){
return 1;
}
(function(){
console.log(a());//1
})();
但,如果是函数表达式就不一样了。执行如下代码会报错,提示此时的a是undefined
var a = function(){
return 1;
}
(function(){
console.log(a());//报错
})();
函数有一个声明提升的过程,函数表达式其实分为先声明,后赋值这两步。而,如果后面存在着立即执行函数IIFE,这个IIFE会快到函数表达式a执行完第一步骤函数声明之后IIFE就会立即执行,这此时a未被赋值,是undefined,所以执行a()时会报错。
4、关于获取多级iframe里元素的问题:
top.$("iframe[name='iframeWindow']")[0].contentWindow.$("#inside_tableElement"),这样才能获取到iframe里的元素,
top.$("iframe[name='iframeWindow']").eq(0).$("#inside_tableElement"),是获取不到的
5、JS操作时间问题:
主要是2个主要函数:new Date() 和 Date.parse()
(1)new Date():参数可以是机器时间,参数为空时表示把当前机器时间传入。返回值是标准字符串时间。
new Date()
//Wed Nov 15 2017 23:11:43 GMT+0800 (中国标准时间)
new Date("2017-11-15 12:12:12")
//Wed Nov 15 2017 12:12:12 GMT+0800 (中国标准时间)
new Date(1510758800422)
//Wed Nov 15 2017 23:13:20 GMT+0800 (中国标准时间)
(2) Date.parse():参数为标准字符串时间,返回值是对应的机器时间。
Date.parse("2017-11-15 12:12:12")
//1510719132000
在JS中操作时间,和在其它语言中操作时间原理上相似,核心就是解决2个问题:(1)把机器时间转成人类时间;(2)把人类时间转成机器时间。
//得到当前机器时间
Date.now(); //1510758800422
//得到当前人类时间
new Date(); //Wed Nov 15 2017 23:11:43 GMT+0800 (中国标准时间)
//给出标准字符串时间转成机器时间
var stdStrTime = "2004-05-25T00:00:00.000Z";
var mTime = Date.parse(stdStrTime);
console.log(mTime);
//1085443200000
//给出机器时间转成标准字符串时间
var mTime = 1510758800422;
var stdStrTime = new Date(mTime);
console.log(stdStrTime);
//Wed Nov 15 2017 23:13:20 GMT+0800 (中国标准时间)
6、css 实现一个元素的hover, focus 状态改变其他元素的样式。
只要可以通过selector从 a 到 b 就可以 hover 后面继续跟selector:假设悬浮元素是a,样式改变元素是b,俩个元素之间的关系就是b是a的子元素就可以使用a:hover>b{....};还有就是b刚好是a的同级元素并且是紧接着的,就可以a:hover+b{....};还有就是b这一类的元素都是a的同级元素并且是a元素之后的就可以a:hover~b{....} 等等
比如css实现鼠标放到一个div上显示另一个隐藏的div:.cent:hover .cs(hover后面再跟对应元素更改css属性)
.cent:hover .cs{
display:block;
top:20px;
}
7、ajax里面的success等函数体内调用this,this是指的ajax对象,因此如果在回调函数里面需要使用this的话,就要注意this重定向的问题。
8、用css伪类选择器判断输入的邮箱格式是否正确,然后改变另一个元素的样式:input[type="email"]:invalid 和 :valid 的使用;再一个就是元素选择器的传递
input[type="email"]:invalid + .btn{
background: red;
}
input[type="email"]:valid + .btn{
background: green;
}
9、鼠标拖动div边框改变大小问题:
(1)e.clientX、e.clientY的使用
(2)事件委托,mousemove、mouseup事件绑定在$(document)上性能更好,如果绑定在div元素上,当鼠标拖动过快移除div框外时,拖动停顿,体验不好
$(function () {
//绑定需要拖拽改变大小的元素对象
bindResize(document.getElementById('test'));
});
function bindResize(el){
//初始化参数
var x = 0,
y = 0;
//鼠标按下绑定事件
$(el).on("mousedown",function(e){
//计算鼠标坐标与对象的相对坐标
x = e.clientX - el.offsetWidth;
y = e.clientY - el.offsetHeight;
//绑定鼠标移动和放开事件
$(document).on("mousemove",mousemove).on("mouseup",mouseup);
//阻止默认事件
e.preventDefault();
});
//移动
function mousemove(e){
el.style.width = e.clientX - x + "px";
el.style.height = e.clientY - y + "px";
}
//放开
function mouseup(e){
//卸载绑定的事件
$(document).off("mousemove",mousemove).off("mouseup",mouseup);
}
}
10、清除浮动的8种方法:
(1)给父级元素定义height
原理:父级div手动定义height,就解决了父级div无法自动获取到高度的问题。
优点:简单、代码少、容易掌握
缺点:只适合高度固定的布局,要给出精确的高度,如果高度和父级div不一样时,会产生问题
建议:不推荐使用,只建议高度固定的布局时使用
(2)结尾处加空div标签,然后给样式: clear:both。(要注意空标签添加的位置)
原理:添加一个空div,利用css提高的clear:both清除浮动,让父级div能自动获取到高度
优点:简单、代码少、浏览器支持好、不容易出现怪问题
缺点:不少初学者不理解原理;如果页面浮动布局多,就要增加很多空div,让人感觉很不好
建议:不推荐使用,但此方法是以前主要使用的一种清除浮动方法
(3)父级div定义伪类:after 和 zoom
两行CSS代码:
.clearfloat:after{display:block;clear:both;cotent:"";visibility:hidden;height:0;}
.clearfloat{zoom:1}
原理:IE8以上和非IE浏览器才支持:after,原理和方法2有点类似,zoom(IE专有属性)可解决ie6,ie7浮动问题
优点:浏览器支持好、不容易出现怪问题(目前:大型网站都有使用,如:腾迅,网易,新浪等等)
缺点:代码多、不少初学者不理解原理,要两句代码结合使用才能让主流浏览器都支持。
建议:推荐使用,建议定义公共类,以减少CSS代码。
(4)父级div定义 overflow:hidden
(5)父级div定义 overflow:auto
此外:(6)父级一起浮动;(7)父级定义display:table;(8)结尾处加 br标签 clear:both;也都可以清除浮动,但是都会引出新问题,只做了解,不推荐使用。
<style type="text/css">
.div1{background:#000080;border:1px solid red;
/*解决方案1代码:
height:200px;*/
/*解决方案4或5代码
overflow:hidden;
或overflow:auto;*/
}
.div2{background:#800080;border:1px solid red;height:100px;margin-top:10px}
.left{float:left;20%;height:200px;background:#DDD}
.right{float:right;30%;height:80px;background:#DDD}
/*解决方案2代码:
.clear{clear: both;}*/
/*解决方案3代码:
.clearfloat:after{display:block;clear: both;content: "";visibility: hidden;height: 0;}
.clearfloat{zoom:1;}*/
</style>
<body>
<div class="div1 clearfloat">
<div class="left">Left</div>
<div class="right">Right</div>
<!-- 解决方案2<div class="clear"></div> -->
</div>
<div class="div2">div2</div>
</body>