代码改变世界

平时积累的一点东西

2012-09-16 01:25  Barret李靖  阅读(559)  评论(1编辑  收藏  举报

本文从ITeye导入

 

*
*                         ☆★☆★☆★☆★☆★☆JavaScript草稿集☆★☆★☆★☆★☆★☆
*
*                                               By 靖鸣君

★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 style='text-align:center; color:white; font-size:40px;'>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);
}