1. jQuery变量命名时不能使用“-”,可以使用下划线“_”,例如var click-product;会报出“丢失分号”很奇怪的错误,var click_product;正确,很小的一个细节,但因我曾经的一时疏忽,造成两天都找不出错来,深刻的教训,所以写下来告诫自己;
2. 一个无序列表 我要点击任意一个列表项目 要求得到该项目的序列
<ul>
<li><a href="#nogo"> </a></li>
<li><a href="#nogo"> </a></li>
<li><a href="#nogo"> </a></li>
</ul>
$(document).ready(function(){
$("ul li a").click(function(){
var index= $( "ul li a" ).index( $(this)[0] );
});
});
3.单击页面中的按钮,就会重新加载当前页面
<a href="#" onclick='parent.location="javascript:location.reload()"'></a>
加入你想通过链接打开新窗口,又想重新加载当前页面,这是一个比较好的办法;
4.js的变量可以通过设置cookie来传递给php使用,也可以实现页面之间的传参;
本文链接
两个问题
1.jQuery的链式操作是如何实现的?
2.为什么要用链式操作?
你认为这两个问题哪个好回答一点呢?
链式操作
原理相信百度一下一大把,实际上链式操作仅仅是通过对象上的方法最后
return this
把对象再返回回来,对象当然可以继续调用方法啦,所以就可以链式操作了。那么,简单实现一个:
function Demo() {
}
//扩展它的prototype
Demo.prototype ={
setName:function (name) {
this.name = name;
return this;
},
getName:function () {
return this.name;
},
setAge:function (age) {
this.age = age;
return this;
}
};
////工厂函数
function D() {
return new Demo();
}
//去实现可链式的调用
D().setName("CJ").setAge(18).setName();
但……为什么要用呢?
一般的解释:
节省代码量,代码看起来更优雅。
例如如果没有链式,那么你可能需要这样写代码:
document.getElementById("ele").dootherthing();
这个代码中调用了两次document.getElementById来获取DOM树的元素,这样消耗比较大,而且要写两行,而链式只要写一行,节省了代码……
但我们也可以用缓存元素啊。比如:
ele.dosomething();
ele.dootherthing();
而且两行并没有比一行多多少代码,甚至相应的封装反而使得代码更多了。
最糟糕的是所有对象的方法返回的都是对象本身,也就是说没有返回值,这不一定在任何环境下都适合。
举个例子,我们想弄一个超大整数BigInteger(意思是如果用Javascript的Number保存可能会溢出的整数),顺便扩展他的运算方法,会适合用链式操作么?
例如运算31415926535 * 4 - 271828182,如果设计成链式风格的方法可能会是这样的:
console.log("result == " + result);
这看起来似乎也很优雅,但是如果我们想要中间的结果怎么办呢?或许会写成这样:
var result1 = bigInteger.multiply(new BigInteger("4")).val();
var result2 = bigInteger.subtract(new BigInteger("271828182")).val();
console.log("result1 == " + result1 + ", result2 == " + result2);
这似乎一点也不优雅了,和不用链式操作没啥不同嘛!
那么如果要求是原来的BigInteger不能改变呢?好吧,链式操作似乎不能满足这个需求了。
那么到底为什么要用链式操作呢?
为了更好的异步体验
Javascript是无阻塞语言,所以他不是没阻塞,而是不能阻塞,所以他需要通过事件来驱动,异步来完成一些本需要阻塞进程的操作。
但是异步编程是一种令人疯狂的东西……运行时候是分离的倒不要紧,但是编写代码时候也是分离的就……
常见的异步编程模型有哪些呢?
- 回调函数
所谓的回调函数,意指先在系统的某个地方对函数进行注册,让系统知道这个函数的存在,然后在以后,当某个事件发生时,再调用这个函数对事件进行响应。
if(num<0) {
alert("调用低层函数处理!");
alert("分数不能为负,输入错误!");
}else if(num==0){
alert("调用低层函数处理!");
alert("该学生可能未参加考试!");
}else{
alert("调用高层函数处理!");
setTimeout(function(){callback();}, 1000);
}
}
这里callback则是回调函数。可以发现只有当num为非负数时候callback才会调用。
但是问题,如果我们不看函数内部,我们并不知道callback会几时调用,在什么情况下调用,代码间产生了一定耦合,流程上也会产生一定的混乱。
虽然回调函数是一种简单而易于部署的实现异步的方法,但从编程体验来说它却不够好。
- 事件监听
也就是采用事件驱动,执行顺序取决于事件顺序。
this.handlers = {};
}
EventTarget.prototype = {
constructor: EventTarget,
addHandler: function(type, handler){
this.handlers[type] = [];
},
fire: function(){
if(!event.target){
event.target = this;
}
if(this.handlers[event.type instanceof Array]){
var handlers = this.handlers[event.type];
for(var i = 0, len = handlers.length, i < len; i++){
handlers[i](event);
}
}
},
removeHandler: function(type, handler){
if(this.handlers[type] instan
1,用 jQuery 获取iframe父頁面元素 $('#dd', window.parent.document).text('control father iframe');
2,用 jQuery
获取子iframe頁面元素 $("#iframe1").contents().find("#ddd").text("This frame was modified with jQuery! Yay!!!");
3,用 jQuery 获取frameset頁面元素 $(window.parent.frames["down"].document).find('#dd').text('yes'); $('#dd',window.parent.frames["down"].document)
4, parent.document.getElementById("main").cols="0px,*";控制Frame的大小