* * ☆★☆★☆★☆★☆★☆JavaScript草稿集☆★☆★☆★☆★☆★☆ * * By Barret Lee
★JQuery★<!--<script type="text/javascript" src="http:code.jquery.com/jquery-latest.js"></script>-->
★★★★★★★★公共部分★★★★★★★★ function printf(obj) { document.write(obj + "<br>"); }
function $(obj) { return document.getElementById(obj); } function forEach(obj) { for (m in obj) { printf(m + ':' + obj[m]); } } ★★★★★★★★注释方式★★★★★★★★★ * * <!--[CDATA[ * * ]]-->
★★★★★★★★alertBox★★★★★★★★ function alertBox() { "use strict"; var coverLayer = document.createElement("div"); var contentLayer = document.createElement("div"); coverLayer.setAttribute("id", "coverLayer"); contentLayer.setAttribute("id", "contentLayer"); contentLayer.innerHTML = "<p>Huazhong University Of Science And Technology</p>"; document.body.appendChild(coverLayer); document.body.appendChild(contentLayer); } window.onload = alertBox;
★★★★★★★★基本数据类型★★★★★★★★ var x = parseFloat("20.33"); var y = parseInt("11", 8); var z = Math.sin(Math.PI / 2); var s = "this is a string."; var a = [1, 2, 4, 3]; var o = {first: 1, second: 2, third: 3}; var result = o.valueOf(); printf(result + "<br>"); printf(1 + "2" + "<br>"); 12 printf((a instanceof Array) + "<br>"); printf((a.constructor) + "<br>"); printf(o.hasOwnProperty("first") + "<br>");
★★★★★★★★arguments数组★★★★★★★★ function plus(x, y, z) { "use strict"; if (arguments.length !== 3) { throw new Error(arguments.callee); } return x + y + z; } plus(2, 3); printf(plus(2, 3, 4)); var cal = { x: 1, y: 2, f: function () { "use strict"; return this.x + this.y; } }; printf(cal.f() + "<br>");
★★★★★★★★函数call和apply★★★★★★★★ function fCall(x, y) { return x + y; } var res = fCall.call(cal, 1, 2); var res1 = fCall.apply(cal,[6, 9]); printf(res + "<br>"); printf(res1 + "<br>");
★★★★★★★★类和继承★★★★★★★★ function people(name, age, sex) { this.name = name; this.age = age; this.sex = sex; } people.prototype.info = function () { printf("My name is " + this.name + ", I'm " + this.age + " years old." + "<br>"); } var humen = new people("Lijing", 19, "man"); humen.info();
★★★★★★★★IE4 && IE5 没有apply函数,利用prototype来构造这样的原型函数★★★★★★★★ if (!Function.prototype.apply) { Function.prototype.apply = function (object, parameters) { var f = this; var o = object || window; var args = patameters || [];
o._$_apply_$_ = f;
var stringArgs = [];
for (var i = 0; i < args.length; i++) { stringArgs[i] = "args[" + i + "]"; }
var arglist = stringArgs.join(","); var methodcall = "o._$_apply_$_(" + arglist + ");"; var result = eval(methodcall);
delete o._$_apply_$_;
return result; }; }
★★★★★★★★类属性,类方法,类私有成员,子类与超类★★★★★★★★ function Rectangle(width, height) { this.width = width; this.height = height; } Rectangle.prototype.area = function () { return this.width * this.height; } function PositionRectangle(x, y, w, h) { Rectangle.call(this, w, h); this.x = x; this.y = y; }
PositionRectangle.prototype = new Rectangle(); delete PositionRectangle.prototype.width; delete PositionRectangle.prototype.height; PositionRectangle.prototype.constructor = PositionRectangle;
var r = new PositionRectangle(2, 2, 2, 2); printf(r.area()); printf(r instanceof PositionRectangle && r instanceof Rectangle && r instanceof Object);
注:可以使用call和apply来调用被覆盖的函数 such as: Circle.prototype.toString.apply(this);
★★★★★★★★非继承的扩展★★★★★★★★ function borrowMethods(borrowFrom, addTo) { var from = borrowFrom.prototype; var to = addTo.prototype; for (m in from) { if (from[m] != "function") continue; to[m] = from[m]; } }
★★★★★★★★确定对象类型★★★★★★★★
△ typeof null → "object"; typeof undefined → "undefined"; typeof 数组 → "object"; typeof 函数 → "function"
△ instanceof 和构造函数 constructor 【特点:他们只能允许根据已经知道的类来进行测试对象,无法用于检查未知的对象】
△ 用Object.toString()测试对象的类型
△ 鸭子类型识别(Duck Typing)
★★★★★★★★渐变效果★★★★★★★★
function setOpacity(obj, val) { if (document.documentElement.filters){ obj.style.filter = "alpha(opacity=" + val + ")"; }else { obj.style.opacity = val / 100; } }
function fadeIn(obj) { var val = 10; var t = setInterval(function(){ if (val >= 100) { clearInterval(t); } setOpacity(obj, val); val += 10; }, 250); }
★★ fadeIn($("changeBox"));
function setWidth(obj, val) { obj.style.width = parseInt(val) + "px"; } function setHeight(obj, val) { obj.style.height = parseInt(val) + "px"; } function slide(obj) { var val = 0; var t = setInterval(function(){ if (val >= 300) { clearInterval(t); } setWidth(obj, val); setHeight(obj, val); val += 10; }, 80); }
★★ slide($("changeBox"));
function setTop(obj, val) { obj.style.top = parseInt(val) + "px"; } function setLeft(obj, val) { obj.style.left = parseInt(val) + "px"; } function move(obj) { var val = 0; var t = setInterval(function(){ if (val >= 300) { clearInterval(t); } setTop(obj, val); setLeft(obj, val); val += 10; }, 80); }
★★ move($("changeBox"));
★★★★★★★★正则表达式★★★★★★★★ 正则表达式中的特殊符号有 ^ $ . * + ? = ! | \ / () [] {}
*|------------------------------------------------------------ * | [...] 括号内任意字符 * | [^...] 非上 * | . 除换行符和其他Unicode行终止符之外的任意字符 * | \w 任何ASCII单字字符 * | \W 非上 * | \s 任何Unicode空白 * | \S 非上 * | \d 任何ASCII数字,等价于[0-9] * | \D 非上 * | \b 匹配一个词语的边界 * | \B 非上 * | {n, m} 匹配至少 n 至多 m 次 * | {n,} 匹配至少 n 次 * | {n} 匹配恰好 n 次 * | ? 匹配前一项0或1次 * | + 匹配前一项1次或多次 * | * 匹配前一项0次或多次 * | ^ 匹配字符串开头 * | $ 匹配字符串结尾 * | i 忽略大小写 * | g 全局匹配 * | m 多行匹配 * |-------------------------------------------------------------
var text = "JavaScript is not Java, thanks god, that is true! Java is not Javascript!!"; var url = "http:www.baidu.com/pic.html" var Reg = /java/gi; var RegUrl = /(\w+):\/\/([\w.]+)\/(\S*)/; var res = url.match(RegUrl); var res = text.replace(/Java/gi, "JAVA"); var res = Reg.exec(text); var res = Reg.test(text); printf(text); printf(res);
★★★★★★★★drag拖动★★★★★★★★
var box = document.getElementById("box"); var drag = { start: function(evt) { var e = window.event || evt; box.startX = e.clientX - box.offsetLeft; box.startY = e.clientY - box.offsetTop; document.onmousemove = drag.ondrag; document.addEventListener ? document.addEventListener("mouseup",drag.stop,false) : document.attachEvent("onmouseup",drag.stop); }, ondrag: function(evt) { var e = window.event || evt; with(box.style) { position = "absolute"; left = e.clientX - box.startX + "px"; top = e.clientY - box.startY + "px"; }; }, stop: function() { document.onmousemove = ""; document.detachEvent ? document.detachEvent("onmouseup",drag.start) : document.removeEventListener("mouseup",drag.start,false); }, init: function() { box.addEventListener ? box.addEventListener("mousedown",drag.start,false) : box.attachEvent("onmousedown",drag.start); } } drag.init();
★★★★★★★★浏览器Location和History★★★★★★★★ Location: protocol + host + pathname + search printf(document.location == document.URL); true
在大多数情况下,document.location和location.href是相同的,但是,当存在服务器重定向时, document.location包含的是装载的URL,而location.href包含的则是原始请求的文档的URL
|-------self, window | |-------navigator | |-------frames[] |------forms[]--------elments[]------options[] | | |-------location |------anchors[] | | |-------document--------|------links[] | | |-------history |------images[] | | |-------screen |------applets[]
for(m in navigator){printf(m + ":" + screen[m]);}
printf(window.screenX); printf(window.screenY); printf(window.outerWidth); printf(window.outerHeight); printf(window.innerWidth); printf(window.innerHeight); 以上属性IE7下没有 printf(""); printf(screen.width); printf(screen.height); printf(screen.availWidth); printf(screen.availHeight);
子窗口和父窗口的相互控制 function openWin() { childWin = window.open("javascript:'<h1>hello</h1>'", "newWin", "height=0,width=0"); var val = 0; var t = setInterval(function(){ if (val > 400){ clearInterval(t); } childWin.resizeTo(val,val); childWin.moveTo(val,val); val += 10; },100); childWin.opener.focus(); childWin.opener.close(); } function closeWin() { childWin.close(); }
document.onclick = openWin; document.onkeydown = closeWin;
★★★★★★★★ERROR提示★★★★★★★★
window.onerror = function (msg, url, line) { alert("Wow..my gosh!!! You got an error.\n\n" + "【Error】: " + msg + "\n【url】: " + url + "\n【line】: " + line); }
★★★★★★★★document★★★★★★★★
帧结构演示 <html> <frameset cols="200,*"> <frame src="./gustbook.html"> <frame src="/gustbook.html" name="view_frame"> </frameset> </html>
function w() { printf("something"); } setTimeout(w,1000); 覆盖原来的文本 注:一个文档绝不应该从时间句柄中调用他自己的write()方法
★document.open 功能:打开一个新文档,并擦除当前文档的内容。 语法:document.open(mimetype,replace) 参数:
mimetype:可选。规定正在写的文档的类型。默认值是"text/html"。 replace:可选。当此参数设置后,可引起新文档从父文档继承历史条目。 注1:open()方法将擦除当前HTML文档的内容,开始一个新的文档,新文档用write()方法或writeln()方法编写。 注2:调用open()方法打开一个新文档并且用write()方法设置文档内容后,必须记住用close()方法关闭文档,并迫使其内容显示出来。
注3:属于被覆盖的文档的一部分的脚本或事件句柄不能调用该方法,因为脚本或事件句柄自身也会被覆盖。
★document.close 功能:close()方法可关闭一个由open()方法打开的输出流,并显示选定的数据。 语法:document.close() 参数:无。
注:该方法将关闭open()方法打开的文档流,并强制地显示出所有缓存的输出内容。如果您使用write()方法动态地输出一个文档,必须记住当你这么做的时候要调用close()方法,以确保所有文档内容都能显示。
★一旦调用了close(),就不应该再次调用write(),因为这会隐式地调用open()来擦除当前文档并开始一个新的文档。
★★★★★★★★节点类型★★★★★★★★
|--------------------------------| | 接口 nodeType值 | |--------------------------------| | Element 1 | | Text 3 | | Document 9 | | Comment 8 | | DocumentFragment 11 | | Attr 2 | |--------------------------------|
★★★★★★★★document.documentElement★★★★★★★★ 引用的是 html appendChild(), insetBefore(), replaceChild() 可以用document.createDocumentFragment()来创建一个DocumentFragment
function reverse(n) { var f = document.createDocumentFragment(); while (n.lastChild) f.appendChild(n.lastChild); n.appendChild(f); }
★★★★★★★★查询选定的文本★★★★★★★★
function getSelectedText() { if (window.getSelection) { return window.getSelection().toString(); }else if (document.getSelection) { return document.getSelection(); }else { return document.selection.createRange().text; } } function start() { var text = getSelectedText(); if (text) { $("changeBox").innerHTML = text; window.open("http:www.baidu.com/s?wd=" + encodeURIComponent(text)); } } if (!document.all) { window.onmouseup = start; }else { document.attachEvent("onmouseup", start); }
var o = $("changeBox"); printf(o.offsetTop); printf(o.offsetLeft); printf(o.clientWidth); printf(o.clientHeight); printf(o.scrollTop); printf(o.scrollLeft); printf(o.offsetWidth); printf(o.offsetHeight);
★★★★★★★★Key Event and Mouse Event★★★★★★★★ 屏蔽右键菜单,可以应用到任何一个区域 oncontextmenu="window.event.returnValue=false" document.onmousedown = function (e) { var e = window.event || e; if (e.button == 0) { document.body.style.background = "red"; }else if (e.button == 1) { document.body.style.background = "blue"; }else { document.body.style.background = "yellow"; } }
document.onkeydown = function (e) { var e = window.event || e; if (e.shiftKey) { alert("shift"); }if (e.ctrlKey) { alert("ctrl"); }else if (e.altKey) { alert("alt"); }else { alert("others"); } }
★★★★★★★★合成事件★★★★★★★★ Document.createEvent()创建, Event.initEvent(), UIEvent.initEvent(), MouseEvent.initEvent.initMouseEvent()初始化 dipatchEvent方法来分派事件 IE中,使用Document.createEventObjec来创建一个新的事件对象。然后使用目标元素的fireEvent()方法来分派他 var DataEvent = {}; DataEvent.send = function (target, datatype, data) { if (typeof target == "string") target = $(target); if (document.createEvent) { var e = createEvent("Events"); e.initEvent("dataavailable", true, false); }else if (document.createEventObject) { var e = document.createEventObject(); }else return; e.datatype = datatype; e.data = data; if (target.dispatchEvent) target.dispatchEvent(e); else if (target.fireEvent) target.fireEvent("ondataavailable", e); }; DataEvent.receive = function (target, handler) { if (typeof target == "string") target = $(target); if (target.addEventListener) target.addEventListener("dataavailable", handler, false); else if (target.attachEvent) target.attachEvent("ondataavaliable", handler); }
★★★★★★★★IE支持客户端永久性★★★★★★★★
var username = "hustskyking"; var password = "psw"; var memory = $("changeBox"); memory.style.behavior = "url('#default#userData')"; memory.setAttribute("username", username); memory.setAttribute("password", password); memory.save('myPersistentData');
var now = (new Date()).getTime(); var expires = now + 10*24*60*60*1000; memory.expires = (new Date(expires)).toUTCString();
var memory = $("changeBox"); memory.load("myPersistentData"); alert(memory.getAttribute("username"));
★★★★★★★★AJAX★★★★★★★★ function loadXMLDoc() { var xmlhttp = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP"); xmlhttp. xmlhttp.onreadystatechange = function () { if (xmlhttp.readyState == 4 && xmlhttp.status == 200) { $("changeBox").innerHTML = xmlhttp.responseText; } } xmlhttp.open("GET", "response.php?func=" + printf("Instead of origin HTML"), true); xmlhttp.send(); } window.onclick = loadXMLDoc;
function createXHR() { var aVersions = ["MSXML2.XMLHttp.6.0", "MSXML2.XMLHttp.3.0"]; for (var i = 0; i < aVersions; i++) { try { var oXHR = new ActiveXObject(aVersions[i]); return oXHR; }catch(oError){ 不执行任何操作 } } throw new Error("MSXML is not installed."); }
在给src特性复制的同时会下载一个图像,这意味着甚至无需将该图像添加到页面中 基于图像实现跨域通信 * * 启动并连续向服务器发送骑牛的最佳方式是什么?在有些情况下,最好是从服务器与载入一些信息, * 以便能够快读相应用户的操;而在另外一些情况下,你可能想在不同的时间间隔内,向服务器发送 * 数据或者从服务器接收数据。
var oImg = document.createElement("img"); oImg.onload = function() { alert("Image is ready"); } oImg.src = "./images/001.gif"; document.body.appendChild(oImg);
function createIFrame(){ var oframe = document.createElement("iframe"); oframe.name = "myIFrame"; oframe.id = "myIFrame"; oframe.style.cssText = "height:500px; width:400px; border:none"; oframe.src = "http:jqueryui.com/demos/droppable/accepted-elements.html"; document.body.appendChild(oframe); } createIFrame();
面向对象的Javascript 1.公共成员 function Customer() { this.firstName = "John"; this.lastName = "Smith"; this.getFullName = function () { return this.firstName + " " + this.lastName; } } var john = new Customer();
2.私有变量 function Customer(firstName, lastName) { var _firstName = firstName; var _lastName = lastName; this.getFullName = function () {闭包 return _firstName + " " + _lastName; } }
prototype属性 扩展类的定义 如果在prototype属性所引用的对象里没有找到,它会到这个引用对象的prototype属性里查找,如此递归查询。 Customer.prototype.getFullName = function () { return this.firstName + " " + this.lastName; }
面向对象编程和继承 function Partner() { this.partnerId = ""; } Partner.prototype = new Customer();
与上等价 Partner.prototype = { firstName: "", lastName: "" }
★★★★★★★★Cookie★★★★★★★★ function setCookie(name,value,days) { if (days) { var date = new Date(); date.setTime(date.getTime()+(days*24*60*60*1000)); var expires = "; expires="+date.toGMTString(); } else var expires = ""; document.cookie = name+"="+value+expires+"; path=/"; }
function getCookie(name) { var nameEQ = name + "="; var ca = document.cookie.split(';'); for(var i=0;i < ca.length;i++) { var c = ca[i]; while (c.charAt(0)==' ') c = c.substring(1,c.length); if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length); } return null; }
function deleteCookie(name) { setCookie(name,"",-1); }
|