js回顾

关于js执行顺序,对于主动获取文档的js需要放到文档后面,或者定义在onload属性方法里面。

1.嵌入js的3种方式:

2.数值类型,包括正数和小数

3.创建未赋值的变量是undefined,

4.document.write()和writeln()区别是:

writeln()只是在源码上换行,网页显示上并不换行,只是有空格相隔开

5.write和innerHTML的区别:

write会让内容全部重写,针对是整个文档内容,并且插入的内容支持js脚本
innerHtml:针对是某个标签内容,一般浏览器插入的内容不支持js

6.正则:

test():匹配返回true
exec():返回比配的字符串,
都可以重复调用多次匹配,需要加标识符g(比如全局匹配a的正则:
/a/g
还有忽略大小写的标识符:i
多行匹配:m(需要匹配字符串中有换行符,没有这个标识符,会被认为都是一行

7.数组:

数组是可变长度的以及元素可以是不同类型的
定义数组不用指定长度,和类型,比如:new Array();
并且没有取值没有越界异常,只是返回undefined

8.typeof:获取类型;instance of:判断是否是实例

9.for in

//循环对于数组得到是下标:
a=["a","b","c",1,3,4,3]; for(n in a){ myPrint(n + ":-----------:" + a[n]); }
0:-----------:a
1:-----------:b
2:-----------:c
3:-----------:1
4:-----------:3
5:-----------:4
6:-----------:3
View Code
//对于对象的属性得到是属性的名字,获取值通过o[i]
o = {
        name : "cm",
        age : 33,
        sex : ""
    }
    for (i in o) {
        myPrint(i + ":----"+o+"-------:" + o[i]);
    }
name:----[object Object]-------:cm
age:----[object Object]-------:33
sex:----[object Object]-------:男
View Code

10.with语句简化对象重复书写(document.write()):

with (document) {
        write("1");
        write("2");
        write("3");
    }

11.函数的三种定义:

//1.命名函数
function myf() {
        myPrint("命名函数");
    }
//2.匿名函数
    myf2 = function() {
        myPrint("匿名函数");
    }
//3.构造函数函数(F大写,最后一个参数是函数体,其他参数可以是函数参数也可以省略    
myf3=new Function("myPrint('构造函数')");
//这种方式可以执行字符串的函数体

12.返回一个函数再调用:

function reMyf() {
    alert("哈哈");
    return function() {
        myPrint("返回一个函数");
    }
}
r=reMyf();
r();

13.函数的3种调用方式:

//1.直接调用,window.可以省略,效果一样
function myf(name) {
    myPrint(name);
}
window.myf("1");
myf("1");
//2,3区别是方法名和参数方式有点差异
//2.call myf.call(window,"call"); //3.apply myf.apply(window,["apply"]);

call/apply这种方式的可以用来执行一个未知的函数

function myCall(arg,f){
    f.call(window,arg);
}
//这样
myCall("咿呀",function(name){
alert("我是一个未知函数--"+name);
});
//或者
function f(name){
alert("我是一个未知函数2--"+name);
}
myCall("咿呀",f);

14.date对象:(特别注意,月份的数值0-11;星期的数值0-6,并且0是周日开始

d=new Date(2017,6,7,16,33,33);
alert(d.toString());
myPrint(d.toLocaleString());

15.对象的3种定义方式:

//1.构造函数方式
function Student(name,age){
    c=":c";//有点像私有成员,因为在外面获取不到该属性
    this.name=name;
    this.age=age;
    this.info=function(){
        alert(name+":"+age+":"+Student.b+c);
    }
    this.a=33;
    Student.b=44;//相当静态成员变量
    //相当静态方法
    Student.info2=function(){
        alert(name+"-:-"+age+":"+Student.b);
    }
}
s=new Student("w",3);
alert(s.c)//undefined s.info(); alert(s.a); alert(Student.b);
//直接通过类名调用 Student.info2();
//2.利用Object对象的方式
s=new Object();
s.name="wc";
s.age=2;
s.i=function(){
    alert("i");
}
function fo(){
    alert("fo");
}
s.i2=fo;
s.i();
s.i2();
//3.json对象的属性名,可使用冒号也可以不用
student = {
    name : "ww",
    i : function() {
        alert("json");
    }
}
student.i();

16.获取对象属性值的两种方式:

student = {
    name : "ww",
    i : function() {
        alert("json");
    }
}
 //1.通过点
alert(student.name);
//2.通过["属性名称"],for in循环就是通过这种方式获得属性值
alert(student['name']);

 BOM(浏览器对象,但是并没有标准化)

window:js的顶层对象,包括的属性:

document:窗口中装载的html文档
location:文档的url
navigtor:当前浏览器以及属性,名称版本平台等
screen:屏幕对象,大小
history:历史记录

window常用方法:

alert();//警告
confirm();//确认
prompt();//提示输入
关闭窗口,滑动窗口,设置定时器,打开窗口

history方法:

history.back();
history.forward();
history.go();

location方法:位置信息

screen方法:屏幕信息

DOM

1.文档由3种节点组成:

标签,文本,属性

2.获取节点:

1.通过名字获取节点
2.通过位置关系获取节点
//(注意得到是数组)只有一个,获取第一个
document.getElementsByTagName("table")[0[;
//根据id得到唯一一个
var ta = document.getElementById("ta");

补充:关于获取文档节点注意几点:

a.获取的文档节点是否已经加载完成

b.根据位置关系获取的节点,特别是换行符也是作为节点出现的,有些标签是显示效果是可以自动换行的,但是源码中格式化的时候也是有换行的。

对于主动执行js,获取节点前,需要确保文档已经加载:
1.将该js写在html文档下面
2.将该js写在onload事件中(window.onload=function(){...})

补充:设置获取文本值只有少部分标签通过text(比如:option),一般都可以采用innerHTML方式(而且很多是必须的,比如:table ,row cell。

2.1根据位置获取节点:

var fdiv = document.getElementById("fdiv");
fdiv.parentNode;//父节点
fdiv.previousSibling;//上一个兄弟节点(nextSibling下一个兄弟节点)
fdiv.firstChild;//第一个子节点
fdiv.lastChild);//最后一个子节点
fdiv.childNodes);//所有子节点
fdiv.firstChild.nextSibling;//第一个子节点的下一个节点
fdiv.lastChild.previousSibling;

//特别注意:获取兄弟和子节点时,隐藏的换行符也会被认为是节点,获取父节点则不会
//比如fdiv的父节点是onediv;它的第一个子节点却是换行符,需要获取文档上显示的第一个子节点的方式:firstChild.nextSibling;
<div class="onediv">
<div id="fdiv">
<div>兄弟1</div>
<div>兄弟2</div>
</div>
</div>

补充:有说法低版本IE不认换行符是第一个节点(未作测试),采用IE11谷歌都认为换行符是节点

2.2对于js程序处理表格文档结构的表格体会默认添加tbody标签来处理

//网页编写中结构
<table id="ta">
        <tr>
            <td>John</td>
            <td>Doe</td>
            <td>Alaska</td>
        </tr>
</table>
//系统认为的结构是:
<table id="ta">
    <tbody>
<tr> <td>John</td> <td>Doe</td> <td>Alaska</td> </tr> </tbody>
</table>

3.专门获取表单的方式:

document.form[0]//获取第几个表单

3.1获取表单属性和表单控件

<form action="www.baidu.com" method="get" target="_self">
        <input name="button" type="button" value="button" />
        <input name="reset" type="reset" value="reset" />
        <input name="checkbox" type="checkbox" value="aa" />
        <input name="password" type="password" value="aa" />
        <input name="radio" type="radio" value="aa" />
        <input name="text" type="text" value="aa" />
        <select name="select">
            <option value="a">a</option>
            <option value="b" selected>b</option>
            <option value="c">c</option>
        </select>
    </form>
window.onload=function() {
    var form = document.forms[0];
    with (console) {
        log("form", form);
        log("action", form.action);//获取action属性值
        log("method", form.method);
        log("elements", form.elements);//获得所有表单控件
        log("target", form.target);
        log("length", form.length);
       //获取表单控件3种方式
        log("elements[6].value", form.elements[6].value);//1.根据下标获取(下标从0开始)
        log("elements[select]", form.elements["select"]);//2.根据控件id/name获取
        log("form.select", form.select);//3.根据控件id/name获取
        form.button.onclick = function() {
            form.submit();
        } }}

4.获取列表框/下拉列表属性和文本值

<form action="www.baidu.com" method="get" target="_self">
        <select name="select" size="3" >
            <option value="a">a</option>
            <option value="b">b</option>
            <option value="c">c</option>
            <option value="d">d</option>
            <option value="e" selected>e</option>
            <option value="f">f</option>
        </select>
    </form>

(列表框和下拉列表框的区别是size的值是否为1)

select = document.getElementsByName("select")[0];
    with (console) {
        //列表框的属性
        log("form", select.form);//所在的表单对象
        log("length", select.length);//选项的长度
        log("options", select.options);//选项数组
        log("selectedIndex", select.selectedIndex);//选中项的索引(从0开始的)
        log("type", select.type);//是否多选
    }
    options = select.options;
    with (console) {     
        for (i=0;i<options.length;i++) {
            log("option_" + i, options[i]);
            //选项的属性
            log("option_" + i, options[i].defaultSelected);//默认是否是选中的
            log("option_" + i, options[i].index);//选项的索引
            log("option_" + i, options[i].selected);//是否是选中的
            log("option_" + i, options[i].text);//选择的文本
            log("option_" + i, options[i].value);//选项value值
        }
form <form action=​"www.baidu.com" method=​"get" target=​"_self">​…​</form>​
length 6
options (6) [option, option, option, option, option, option, selectedIndex: 4]
selectedIndex 4
 type select-one
View Code

5.对表格的获取操作

表格的结构:标题(caption),表格头(thead),表格体(tbody),表格脚(tfoot)

<table border="1">
        <caption>标题</caption>
        <thead>
            <tr>
                <th>00</th>
                <th>01</th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td>11</td>
                <td>12</td>
            </tr>
            <tr>
                <td>21</td>
                <td>22</td>
            </tr>
        </tbody>
        <tfoot>
            <tr> <td>31</td><td>32</td></tr>
        </tfoot>
    </table>
View Code
tab=document.getElementsByTagName("table")[1];
    with (console) {
        log("table",tab);
        log("caption",tab.caption);//获取标题
        log("thead",tab.thead);//下面三个属性未获取到
        log("tbodies",tab.tbody);
        log("tfoot",tab.tfoot);
        log("rows",tab.rows);//所有行
        //第二行(索引从0开始)
        row=tab.rows[1];
        log("row",row);
        log("cells",row.cells);//该行所有单元格
        log("rowIndex",row.rowIndex);//该换对应表格的索引
        log("sectionRowIndex",row.sectionRowIndex);//该行所在thead/tbody/tfoot对应的索引
        //第二个单元格
        cell=row.cells[1];
        log("cell",cell);
        log("cellIndex",cell.cellIndex);//单元格所在行的索引
        //修改
        tab.rows[3].cells[1].innerHTML="修改第4行第2列";        
    }
                   table <table border=​"1">​…​</table>​
myjs.js:248 caption <caption>​标题​</caption>​
myjs.js:249 thead undefined
myjs.js:250 tbodies undefined
myjs.js:251 tfoot undefined
myjs.js:252 rows (4) [tr, tr, tr, tr]
myjs.js:254 row <tr>​…​</tr>​
myjs.js:255 cells (2) [td, td]
myjs.js:256 rowIndex 1
myjs.js:257 sectionRowIndex 0
myjs.js:259 cell <td>​12​</td>​
myjs.js:260 cellIndex 1
View Code

6.创建(ie不支持)/添加/复制/删除节点

<ul id="mycity">
        <li>北京</li><li>北京2</li><li>北京3</li>
        <li>沙皇<a href="#">我是子节点</a></li>
        <li>肾好<a href="#">我是子节点</a></li>
        <li>/ul前,如果有换行,换行符也算节点的</li></ul>
    <input type="button" onclick="add()" value="添加节点" />
    <input type="button" onclick="clone()" value="复制节点" />
    <input type="button" onclick="remove()" value="删除节点" />
i = 0;
var city;
// 获取/创建
function add() {
    city = document.getElementById("mycity");
    // 据说ie老版本不支持这种创建方式,亲测IE.11没有问题,该参数对应的标签必须是合法存在的(li)
    li = document.createElement("li");
    li.innerHTML = "广州" + i++;
    // 添加到当前节点的最后一个子节点
    // city.appendChild(li);

    // (注意下面两个函数:调用该方法的节点必须是新节点的父节点)
    // 将新节点添加在一个节点前
    // city.insertBefore(li, city.firstChild.nextSibling);
    city.replaceChild(li, city.firstChild.nextSibling);
}
function clone() {
    // 特别注意:
    //1.节点选择时候,换行符也是节点
    //2.li标签在代码中可以不用换行(可以设置格式代码的时候不换行显示),网页显示是自动换行的
    //3.对于根据位置关系查找节点,换行符是一个大问题,毕竟不同编码格式可能有改变,最好还是采用id或者name直接定位
    cloneNode = city.lastChild.cloneNode(true);

    // 复制节点及其所有子节点(参数不为为true,那么仅仅复制<li></li>,注意:节点中的文本是子节点)
    cloneNode = city.lastChild.cloneNode(true);
    city.appendChild(cloneNode);

}
function remove() {
    city.removeChild(city.lastChild);
}

7.对于下来列表专门的创建列表方式(一般浏览器支持)

<select id="myselect">
        <option value="1">1</option>
        <option value="2">2</option>
        <option value="3">3</option>
    </select>
    <input type="button" onclick="addO()" value="添加节点" />
    <input type="button" onclick="removeO()" value="删除节点" />
i = 5;
var select;
// 3种方式添加列表选项
function addO() {
    select = document.getElementById("myselect");
    // 1.常规方式,可以添加各种节点
    // o = document.createElement("option");
    // o.setAttribute("value", i++);
    // o.text = i - 1;
    // select.appendChild(o);

    // 2.专门添加选项节点的方式
    // 四个参数分别表示:文本,value值,默认是否选中,当前是否选中,四个参数是可省略的,可以少于4个
    // new Option("text","value",defaultSelected,"selected");
    // o = new Option(i++, i - 1, false, true);
    // select.appendChild(o);

    // 3.采用给选项数组赋值的方式
    o = new Option(i++, i - 1, false, true);
    select.options[select.options.length] = o;
}

// 3种删除选项的方式
function removeO() {
    // 1.根据序列删除
    // select.remove(select.options.length - 1);
    
    // 2.选项置空
    // select.options[select.options.length - 1] = null;
    
    // 3.清空所有选项
    select.options.length = null;
}

8.对表格增删改:

<div id="mytable"></div>
    <input type="button" onclick="createT()" value="创建表" />
    <input type="button" onclick="delLastCell()" value="删除最后一个单元格" />
    <input type="button" onclick="delLastRow()" value="删除最后一行" />
var t;
function createT() {
    t = document.createElement("table");
    var c = t.createCaption();
    c.innerHTML = "表格标题";
    t.border = 1;
    for (i = 0; i < 10; i++) {
        // 根据索引插入一行
        var row = t.insertRow(i);
        for (j = 0; j < 3; j++) {
            // 根据索引插入单元格
            var cell = row.insertCell(j);
            cell.innerHTML = "单元格" + i + j;
        }
    }
    myt = document.getElementById("mytable");
    myt.appendChild(t);
}
// 根据索引删除最后一行
function delLastRow() {
    t.deleteRow(t.rows.length - 1);
}
// 获取最后一行,根据索引删除最后一个单元格
function delLastCell() {
    lastR = t.rows[t.rows.length - 1];
    lastR.deleteCell(lastR.cells.length - 1);
}

事件:

补充:如果代码中有多个onload只会执行最后一个

window.onload = function() {
    alert("第一个onload")
}
window.onload = function() {
    alert("第二个onload");
}
//只会执行第二个

据说IE(IE9以及之前)只支持冒泡事件;(IE11测试和谷歌火狐两种都支持) 

冒泡事件:从子元素的事件开始
捕获事件:从父元素的事件开始

补充:可以在默认事件中加:return false;取消默认行为;比如提交按钮和超链接

1.事件上静态绑定方法的2种方式:

1.1.在标签上

1.2.在dom节点的事件上

<a href="www.baidu.com" onclick="return false">取消默认事件</a>
    <input type="button" value="标签绑定事件" onclick="tagE()" />
    <button id=myB>DOM上绑定事件</button>
    <script type="text/javascript">
    function tagE(){
        alert("标签事件");
    }
    function domE(){
        alert("dom事件");
    }
    var b=document.getElementById("myB");
    b.onclick=domE;
    </script>

2.给标签动态添加事件方法

补充:ie提供了专门添加事件方法的方式,但是在IE11测试中无效了(IE9之后:attachEvent/detachEvent无效)

采用dom方式添加事件方法:

<input id="IEaddE" type="button" value="IE添加单击事件的处理方法" />
    <button id="IEdelE">IE删除该事件方法</button>
window.onload = function() {
    var addE = document.getElementById("IEaddE");
    //添加的事件名称和静态标签上(dom属性上)的事件区别是不用on前缀
    addE.addEventListener("click", show);
    // 1.添加事件可以采用静态事件绑定方法
    // document.getElementById("IEdelE").onclick = function() {
    // addE.removeEventListener("click", show);
    // }
    // 2.添加事件可以都采用动态事件绑定方法
    document.getElementById("IEdelE").addEventListener("click", function() {
                // 第三个参数可以省略,是否是捕获事件,false表示冒泡事件
                addE.removeEventListener("click", show, false);
            });
}

3.事件流的方式:

3.1下面IE和谷歌都采用冒泡的方式

<div onclick="show('fdiv')">
        <div onclick="show('sdiv')">
            <p onclick="show('p')">事件流方式</p>
        </div>
    </div>
function show(text) {
    alert(text);
}

3.2捕获型事件测试:(IE11和谷歌效果一样)

<div id="fadiv">
        <div id="sdiv">
            <p id="p">捕获事件流</p>
        </div>
    </div>
function mao(s) {
    alert(s);
}
window.onload = function() {
    var fdiv, sdiv, p;
    with (document) {
        fdiv = getElementById("fadiv");
        sdiv = getElementById("sdiv");
        p = getElementById("p");
        //特别注意对于绑定的方法如果有参数必须使用匿名函数的方式(否则直接执行了),如果没有参数可以直接使用方法名
        //最后一个参数可以省略,默认是冒泡
        fdiv.addEventListener("click", function(){mao('f')}, false);//执行顺序是:3(捕获型优先执行)
        sdiv.addEventListener("click", function(){mao("sdiv")}, true);//1
        p.addEventListener("click", function(){mao("p")}, true);//2
    }}

4.事件对象:封装了事件发生的详细信息比如:比如鼠标还是键盘事件,鼠标位置,键盘按键等

DOM浏览器可以自动将事件对象封装到事件处理函数的第一个参数(新版本的IE也可以)
老版本IE浏览器则将事件对象封装在window.event属性上。(新版IE和谷歌都是这样了)

获取事件对象两种方式(IE11和谷歌都试用)

<div onclick="showE(event)">1.通过传参的方式(必须是event关键字)显示事件对象</div>
<div id="showE">2.采用dom绑定事件处理函数的方法(不传参数)显示事件对象</div>
<div onclick="showE()">3.可以方法中直接通过window.event获取事件对象</div>
//传递event(属于window的属性) function showE(e) { console.log("event", e); }
//绑定处理函数(无参) window.onload
= function() { document.getElementById("showE").onclick = showE; }

事件属性:

<div onclick="showE()">3.可以方法中直接通过window.event获取事件对象</div>
function showE() {
    console.log("event", event);
    console.log("currentTarget", event.currentTarget.tagName);
    //触发事件的标签的名字(IE11也支持)比如:div
    console.log("target", event.target.tagName);
    //谷歌也支持了
    console.log("type", event.srcElement.tagName);
    //事件的名字比如:click
    console.log("type", event.type);
}

5.鼠标常用事件(老版本IE双击事件不同,IE11和谷歌效果一一样)

<img id="img" alt="图片" src="a.jpg" />
<div id="showM">事件</div>

function showM() { document.getElementById(
"showM").innerHTML += event.type + "<br>"; } window.onload = function() { var img = document.getElementById("img"); img.onclick = showM; img.ondblclick = showM; img.onmousedown = showM; img.onmouseup = showM; img.onmouseout = showM; img.onmouseover = showM;

双击事件效果:

mousedown
mouseup
click
mousedown
mouseup
click
dblclick

6.键盘常用事件

<div id="showM">事件</div>
<textarea rows="10" cols="10"></textarea>
function showM() {
    document.getElementById("showM").innerHTML += event.type + "<br>";
}
window.onload = function() {
    var text = document.getElementsByTagName("textArea")[0];
    text.onkeydown = showM;
    text.onkeyup = showM;
    text.onkeypress = showM;

html事件:

    <input type="text" onchange="alert('内容改变')" onselect="alert('内容选中')"/>
    <input type="text" onfocus="alert('获得焦点')" onblur="alert('失去焦点')"/>
    <select onchange="alert('选项改变')">
    <option>1</option>
    <option>2</option>
    </select>

 

posted @ 2017-06-19 14:37  假程序猿  阅读(144)  评论(0)    收藏  举报