javascript学习小记

1,event对象

是DOM给事件提供更为详细信息的对象,在定义事件处理函数时经常需要用到,为了确保我们得到的event对象不是空值,我们需要先确认下:

1 if(!e) 
2     e = window.event;

其常用的属性有:event.target(元素出现的对象,比如锚,在部分浏览器中用event.srcElement表示), event.which(键盘事件的键码(Unicode表示),经常与String.fromCharCode使用, 在部分浏览器中用event.keyCode表示),  event.button(按下的鼠标按键,左键为0或1,右键为2),event.altkey等;

为了兼容不同的浏览器,我们使用有不同的名称的属性时,应如下:

whichlink = (e.target) ? e.target.id : e.srcElement.id;

先判断是哪个有定义再使用

2,onClick与onclick

onClick是指事件,这一事件在单击时发生,如果这一事件发生后,返回了false,则消息单击的效果,如果返回true,则单击成功,后面可以接任何javascript。对于onclick,这是指对象的事件程序,当对象被点击时所执行的程序,与返回值无关;

代码示例:

onClick:
<a href="http:://baidu.com" onClick = "return false;">TEST</a>

onclick:
function mousestate (e) {
    if(!e)
        e = window.event;
    btn = e.button;
    whichone = (btn < 2) ? "Left" : "Right";
    message = e.type + " : " + whichone + "\n";
    document.form1.info.value += message;
    return false;
}
obj = document.getElementById("testlink");
obj.onclick = mousestate;

 3.id与name

从w3school中得到如下说明:

a)id属性规定HTML元素的唯一的id, 在HTML文档中必须是唯一的;

b) id属性可用作链接锚,通过Javascript(HTML DOM)或通过CSS为带有指定id的元素改变或添加样式;[getElementById(Id)]

c)name属性用于对提交到服务器后的表单数据进行标识,或者在客户端通过Javascipt引用表单数据。

更多可以参考:HTML中ID与NAME的区别

4.li与其外部元素的对齐

在作下拉菜单时,html中用到了内外的两重ul+li来达到菜单的目的,相关的示例html

    <ul id="MainMenu"> 
        <li class="MenuItem"><a href="#">Home</a></li>

        <li class="MenuItem"><a href="#">Product</a>
            <ul>
                <li><a href="#">Sub-item1</a></li>
                <li><a href="#">Sub-item2</a></li>
            </ul>
        </li>

        <li class="MenuItem"><a href="#">Support</a>
            <ul>
                <li><a href="#">Sub-item1</a></li>
                <li><a href="#">Sub-item2</a></li>
            </ul>
        </li>

        <li class="MenuItem"><a href="#">Information</a>
            <ul>
                <li><a href="#">Sub-item1</a></li>
                <li><a href="#">Sub-item2</a></li>
            </ul>
        </li>

        <li class="MenuItem"><a href="#">Content_us</a>
            <ul>
                <li><a href="#">Sub-item1</a></li>
                <li><a href="#">Sub-item2</a></li>
            </ul>
        </li>
    </ul>

如何让内部的li与外部的对齐呢?这个如果理解了盒子原理就不难弄懂了,可以通过借助Chrome的开发者工具里面的盒子模型来学习和理解。回到正题,设置时只要把内部的ul的填充与空白都设为0就可以了,这时的内容区就可以与外部的对齐了,还要理解父元素与子元素之间的继承,以及改变这种关系。示例代码:

#MainMenu li{
    float: left;
    list-style-type:none;
    padding-right:20px;    
    width:100px;
}


#MainMenu li ul {
    margin: 0px;
    padding:0px;
}

#MainMenu li ul li {
    float:none; 
    list-style-type:none;
    margin:10px 0px;
    width:80px;
}

 5.JavaScript的继承

首先要明白JavaScript一开始只是为了作为一种浏览器与网页的互动语言,设计者并没有想把这种脚本语言弄得过于复杂,和C++和Java一样,所以虽然JavaScript是一种面向对象的语言,但是它本身没有与C++和Java一样的类定义,它只有对象的定义,也即“属性的无序集合,每个属性存放一个原始值,对象或函数”。但作为一门面向对象的语言,需要为开发者提供,封闭性,多态性,继承性,聚集性。所以JavaScript的开发者就为此引入了new,prototype,构造方法,原型链,通过这些我们可以模拟类与继承。更多可以参考:http://www.ruanyifeng.com/blog/2011/06/designing_ideas_of_inheritance_mechanism_in_javascript.html

对于继承,可以参考如下代码:

/*Define classA*/
function classA(id, color) {
    this._id = id;
    this._color = color;
}

function showColor() {
}

classA.prototype.className = "classA";
classA.prototype.showColor = function() {
    document.write(this.className + " " + this._id +" "  + this._color + "<br \>");
}


/*Define classB inherit classA*/
function classB(id, color, num) {
    classA.call(this, id, color);
   this._num = num; } classB.prototype
= new classA(); //把A的所有属性和方法都一次性给classB.prototype(达到一次性继承需要共享的属性) classB.prototype.className = "classB"; /*test code*/ A = new classA("A", "red"); A.showColor(); B = new classB("B", "blue", "3"); B.showColor();

其原型链如下:

B [classB的实例化] {_id, _color, _num}
  classB.ptototype [classA的实例] {[_id, _color;] className : "classB"}
    classA.prototype {showColor : ... , className : "classA"}
      Object.prototype {toString : ... /*etx*/ }

1)思想主要是通过构造方法来设计自身的属性,通过prototype来设计共享的属性;利用对象冒充继承构造函数的属性,用原型链继承prototypec对象的属性

2)在进行属性查找时的机制是:从对象本身开始往上遍历整个原型链,若到了Object.prototype仍未找到,则返回undefined.

3) 不使用classB.prototype = classA.prototype的原因是因为这样的话,两个类的prototype就都指向了同一个地址,会导致修改一个类影响另一个类的后果,而使用classB.prototype = new classA();就可以避免这样的后果,因为只是修改了classA的一个实例。同时要注意的是,所有的classB的实例都共享了同一个classA的实例作为classB.prototype.

6)JavaScript中的RegExp实例方法exec

  该方法的使用分两种情况,一种是没有全局模式的情况,还有一种就是全局模式时;在没有全局模式的情况,如果匹配成功会返回一个数组,数组的第一项(下标为0)是与正则表达式匹配的内容,第二项开始是捕获组匹配的字符串(也就是说第二项是正则表达式中的第一个子表达式的匹配内容,以此类推),另外这个数组还有两个属性(index表示匹配项在字符串中的位置,而input表示应用 正则表达式的字符串),且对同一个字符串反复使用exec()的结果都是一样的;对于有全局模式的正则来说,每次调用exec()都会在字符串中继续查找新匹配项,且还有一个属性lastIndex,该属性保存了匹配项字符在匹配字符串中的下一个位置。

 

posted @ 2015-07-17 10:35  Kinthon  阅读(161)  评论(0编辑  收藏  举报