日期:2014-05-16  浏览次数:20387 次

JS_OR_JQUERY_即时笔记
0.再次被坑:JQuery的AJAX封装....调试半天,不见AJAX的效果,最后发现是缓存的原因,任凭在URL后加上new Date()参数,还是缓存,最终在网上找到解决方法:
!!!!!!$.ajaxSetup ({cache:false //关闭AJAX相应的缓存 });
1.被坑了,查了半天BUG,原来误把div1.find("div2")理解成是在div1元素的下级孩子中查找div2,原来find会在div1包含的所有元素中查找,不管层级关系一概查找,查找次级/孩子元素应该用children(xx)
2.jQuery中,经常见到var xxx = !!xxObject.x的形式,其中!!的用途是将值转为boolean类型,貌似if(!!obj)等同于if(obj)
3.$(xx).one('xxevent',fun)---同bind绑定方法用法相同,只是元素所绑定的事件xxevent只会触发一次,触发过一次后无效.
[比如:右键菜单,每次显示菜单的同时,给$(document)对象用one方法绑定click事件[事件处理为隐藏菜单],最终效果为:每次显示菜单后,点击文档空白处隐藏菜单,且仅第一次点击空白有效]
4.==先转换成布尔类型再比较,===先判断类型,如果不是同一类型直接为false
5.$(xx,context)---context为搜寻xx的上下文,默认为当前文档document.可设置context为DOM元素集、JQUERY对象、文档.
如:$("div", xml.responseXML);在一个由 AJAX 返回的 XML 文档中,查找所有的 div 元素
6.javascript中,类成员/方法和prototype定义的成员/方法感觉很像,但,类成员/方法相当于JAVA中的类/静态成员/方法,而prototype定义的成员/方法相当于JAVA中的对象/实例成员/方法,被所有实例共享.
且javascript中访问类成员/方法和访问prototype定义的成员/方法的方式不同:
Class.property|Class.prototype.property
7.jQuery中each方法有两种形式:jQuery对象的each方法和jQuery全局/静态each方法
对象/实例的each方法本质上由jQuery静态方法实现.详情请看:
http://www.cnblogs.com/jams742003/archive/2009/12/25/1632218.html
8.jQuery中常用形式-闭包
经常可以见到这种形式:
(function($){
    var v = 0;
    //(或$.fn.extend)
    $.extend({f:function(){alert(v)}});
})(jQuery);
无非是类似于javascript中,定义一个匿名函数并且立即执行。但是其中利用到了闭包,并保持了这个匿名函数中的变量持续驻留在内存中。关键的一句代码是$.extend...。
这一句意义在于将匿名函数中的内部函数绑定到外界的jQuery对象上,匿名函数内部的函数即一个闭包函数,通过闭包,保证了这个理应在执行完成后被回收的匿名函数执行后却保持了其状态以及内部变量的状态(注:保持了其内部变量的状态并不是说在外部可以直接访问)。
该写法使得编写代码时无需考虑命名空间的问题,避免了变量名称发生冲突的情况.
9.
返回数组Array实现闭包
<script>
	function fun(){
		var array = new Array();
		addElement = function(val){
			array.push(val);
		}
		return array;
	}
	
	var ar = fun();
	addElement(1);
	addElement(2);
	addElement(3);
	for(var i in ar){
		alert(ar[i]);
	}
</script>

10.想知道this到底是谁,要看被包含函数的调用者,如果是个对象,那就是该对象
???arguments.caller??? null时呢??

11.如果外层函数仅是作为其他函数的活动对象,被调用,那仍然是Global。也就是说,函数被直接调用执行时,不管是在哪里,其内部的this都是window
12.function fun(){}和var fun=function(){}的区别
<script>
	function fun(){
		//预解析阶段便将定义形式的函数以[函数名-函数体]的形式注册到了variable object(全局环境中的称谓,在函数中称活动对象Activation object)中
		//因此执行阶段,可顺利执行[注:在这个过程中,除了实际参数有值外和函数定义外,其它都被'预解析'为undefined值]
		innerFun();
		//定义形式的函数,在预解析阶段,以[expressionFun-undefined]的形式注册到Activation object中,而且执行阶段,
		//在执行到[给活动对象中的变量赋值]的代码之前便调用了expressionFun,此时expressionFun在活动对象中的值还是undefined,因此报错
		//类似于变量的使用在变量的声明/赋值之前-此时变量的值为undefined
		expressionFun();
		//定义形式的函数
		function defineFun(){
			alert('innerFun execute..');
		}
		//表达式形式的函数[]
		var expressionFun = function(){
			alert('expressionFun');
		}
	}
	fun();
</script>

13.
全局执行环境/Eval执行环境中叫可变对象(Variable Object),函数执行环境中叫做活动对象Activation Object
14.
若前台页面,请求一张图片(如验证码),或者是showModalDialog弹出一个模式对话框时,在调试过程中是非常恶心的,因为这两种情况下,请求的URL不变,这样浏览器会去缓存中直接取数据,解决方法是利用javascript在请求的URL上做处理:  url + "?preCache=" + new Date()
15.event对象只在事件发生的过程中才有效,在绑定到事件上的方法function中,直接可引用event对象
16.JQuery的ajax封装,看网上说是使用UTF-8进行编码/解码的??,调试时也出现过乱码问题,首先是发送中文参数,服务端接收到为乱码,解决方式是对参数值先用iso8859-1方式解码,再用utf-8编码.另外服务端响应到客户端的字符串/json为乱码,解决方式是在服务端:response.setCharacterEncoding("utf-8")
17.
$.ajax({})是JQUERY中AJAX封装的核心方法,async参数默认为true,即异步;有时async设置为false[同步]是有必要的,比如有一个局部刷新记录集的需求,此时使用$.ajax方法发出请求后,要设置为同步调用,待记录集返回到客户端时,$.ajax方法的后续方法才能执行,否则一直阻塞.[该情况,若使用异步调用,结果是:没等记录集返回,客户端的显示记录集的代码段已开始运行,可能显示空记录]
注意:当设置async=false时,响应到客户端的数据没有经过JQuery转换,需手动将响应字符串转成相应类型,如eval(responseText)==>json格式
18.JQUERY_遍历字符串数组,慎用this
var test = ['a','b','c'];
$.each(test,function(){
	al