本文从ITeye导入

*
* ☆★☆★☆★☆★☆★☆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 次
* | ? 匹配前一项01
* | + 匹配前一项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);
}