JS事件

DOM

DOM查询

  1. 通过domcument对象获取元素节点:
    1. getElementById("id"):通过id属性获取一个元素节点对象;
    2. getElementsByTagName("tag"):通过标签名获取一组元素节点对象;
    3. getElementsByTagName("*"):支持通配符,获取所有节点对象;
    4. getElementsByName("name"):通过name属性获取一组元素节点对象。
    5. 获取元素节点的属性值:节点对象.属性名,但对于class属性,节点对象.className
  2. 通过具体的元素节点对象获取其子节点:
    1. childNodes:获取其所有的子节点,包括文本节点、换行、标签间的空白等,但IE8不会;
    2. children:获取所有的子元素,只获取标签元素,且是直接子元素;
    3. firstChild/lastChild:获取第一个/最后一个子节点,也包括文本节点、换行,空白等;
    4. firstElementChild:获取第一个标签元素,不兼容<=IE8
  3. 获取父节点和兄弟节点:
    1. parentNode:获取当前节点的父节点;
    2. previousSibling/nextSibling:获取前/后一个兄弟节点;
    3. previousElementSibling:获取前一个兄弟标签元素,也不兼容<=IE8;
    4. innerText/innerHTML/textContent:都可以获取一个标签的内容,innerHTML的内容包含子标签,而innerTexttextContent只获取标签内的字符串文本;
    5. 只获取标签内自己的字符串:firstChild.nodeValue,没有字符串文本,则返回空字符串;对于不能做父元素的标签,如<img/>, 其firstChildnull
  4. 每个节点(包括文本节点)都具有的3个属性:nodeName、nodeType、nodeValse
    1. 文档节点:nodeName =>#document、nodeType =>9、nodeValse =>null
    2. 元素节点:标签名、1、null
    3. 属性节点:属性名、2、属性值
    4. 文本节点:#text、3、文本内容
  5. document.documentElement/body:获取<html>/<body>的元素对象;
  6. document.all/document.getElementsByTagName("*"):获取所有节点的标签元素;
  7. getElementsByClassName('选择器名称'):根据class属性值获取一组元素,兼容到>=IE8
  8. querySelector('CSS选择器'):根据CSS选择器获取标签元素,只返回第一个,兼容到>=IE8
  9. querySelectorAll('CSS选择器'):返回一组标签元素;
  10. HTML是自顶向下解析的,不能提前获取document节点
    1. <body>标签之后使用<script>,可以获取节点对象;
    2. window.onload = function(){ ... }:等待HTML文档加载并渲染完成再执行.

DOM增删改

  1. appendChild()/removeChild()/replaceChild():添加/删除/替换子节点;
  2. insertBefore(newNode, oldNode):在指定的子节点前插入新的子节点;
  3. createElement()/createAttribute()/createTextNode():创建元素/属性/文本节点;
    var li = document.createElement("li"); --> 创建一个<li>
    var text = document.createTextNode("Mark"); --> 创建文本节点
    li.appendChild(text); --> 把文本节点添加到<li>中
  1. innerHTML也可以完成DOM的增删改:li.innerHTML="<span>Smith</span>"
    var li = document.createElement("li");
    li.innerHTML = "Mark"; --> create与innerHTML结合使用
  1. setAttribute()/getAttribute():设置/获取指定的属性;
  2. confirm(str):确认/取消提示框,带有确认和取消按钮,返回true/false
        <button>Button-1</button> <button>Button-2</button>

    window.onload=function(){
        var btns = document.getElementsByTagName("button")
        for (var i=0; i<btns.length; i++) {
            btn[i].onclick=function(){
                confirm(this.innerHTML); --> this指向当前button对象
                confirm(btns[i].innerHTML); -->报异常undefined,此时的i=btns.length
            }; --> 页面加载完成,首先执行的是for循环,而不会执行函数;
        } --> 在点击按钮时,此时的i=btns.length,所以报异常;
    }; --> 而函数内的this始终指向调用者,所以可以正常执行。

DOM操作CSS

JS修改元素样式

  1. 选择器中的样式是无法获取,也无法修改的,但可以操作元素的内联样式,其优先级高于选择器;
  2. 元素对象.style.样式名 = "样式值",通用写法:元素对象.style["样式名"] = "样式值"
  3. 对于 - 连接的属性,则去掉 -,并把后面的首字母大写:btn.style.fontSize="20px";
  4. 通用形式则不需要去掉属性名中的连接符:btn.style["font-size"]="20px";
  5. <style>中的选择器应避免使用 !important,它表示样式的最高优先级,内联样式也无法覆盖;
  6. element.setAttribute('style', 'width:20px;height:30px;'):设置元素的 style 属性;
  7. element.setAttribute('style'):移除元素的 style 属性,也即删除 style 样式;
  8. 如果要修改多个样式,可以在<style>中预定义CSS样式选择器,再赋值给元素的 className 属性,这种方式的性能比较高,也使得JS和CSS更好的分离。

JS获取元素样式

  1. element.style:获取的是当前元素上的所有内联样式,包括默认存在的内联样式;
  2. element.style.样式名、element.style["样式名"]:根据属性名获取内联样式的属性;
    1. 获取的只是内联样式上的属性,如果内联样式上没有手动设置该属性,则获取的属性值为'';
    2. element.style.cssText:只获取标签上手动设置的CSS样式,是一个字符串;
    element.style.cssText = "width:100%;font-size:16px;" -->修改/添加内联样式
  1. element.getAttribute('style'):获取标签上的style属性值,同element.style.cssText
  2. element.currentStyle.样式名:IE独有的,获取元素当前正在使用的所有样式信息;如果没有手动设置样式的默认值,则返回 auto
  3. getComputedStyle(element, null)window 的方法,获取元素当前正在使用的的所有样式;
    let sty = getComputedStyle(btn, null)
    1. sty["background-color"] 返回的是 rgb 值,btn.style["background-color"] 返回的是当前样式中设置的 background-color 属性值;
    2. 不兼容<=IE8
  4. currentStylegetComputedStyle() 获取的属性都是只读的,不能修改;
  5. 获取CSS样式属性的兼容方式:
    function getStyle(element, styleName) {
        if(window.getComputedStyle) {
            return getComputedStyle(element, null)[styleName];
        } else { --> IE8的window中没有getComputedStyle,则返回undefined,即false
            return element.currentStyle[styleName];
        } --> 属性styleName要显示设置一个默认值,否则浏览器可能返回auto
    }

DOM属性事件

  1. clientWidth/clientHeight:获取元素的可见宽高,不带单位px,返回的是数值;
    1. clientWidth = width + paddingLeft + paddingRight
    2. clientWidth和clientHeight 都是只读属性;
    3. 浏览器窗口的宽度/高度:document.documentElement.clientWidth/clientHeight
  2. scrollWidth/scrollHeight:获取元素的滚动区域宽高;
    1. 如果元素区域带有滚动条,clientWidth/clientHeight 只能获取滚动窗口内可见的宽高,而scrollWidth/scrollHeight 获取的宽高,包含滚动窗口外的宽高;
    2. clientWidth/clientHeight 获取的宽高包含滚动条的宽度/高度;
    3. scrollLeft/scrollTop:水平/垂直滚动的距离;
    4. 当垂直滚动条滚到底部时,clientHeight == scrollHeight-scrollTop
    5. element.onscroll = function(){};:绑定滚动条滚动事件
  3. offsetWidth/offsetHeight:获取元素的整个宽度和高度,width+padding+border
  4. offsetParent:获取距离最近的、使用了定位的父元素对象,如果都没有定位,则返回body
  5. offsetLeft/offsetTop:当前元素相对于其定位父元素的水平/垂直偏移量,都是只读的属性;

上传图片

<input type="file" accept="image/*" onchange="uploadImg(this)" />

  1. accept:指定上传文件的类型,打开资源管理器展示的文件类型;
  2. onchange:<input/>中的内容发生变化时的事件;
  3. 预览图片,FileReader是H5提供的,用于读取文件
    uploadImg(ev) {
        let file = ev.files[0]
        let reader = new FileReader() -->创建FileReader对象
        reader.onloadstart = function (e) { //开始读取 }
        reader.onprogress = function (e) { //正在读取中 }
        reader.onabort = function (e) { //中断读取 }
        reader.onerror = function (e) { //读取异常 }
        reader.onload = function (e) { --->读取成功的回调
            let img = document.querySelector("input[type=file]")
            img.src = e.target.result
        }
        reader.readAsDataURL(file) --->开始读取本地选择的文件
    }
  1. element.onmousemove = function(event){}:鼠标在元素中移动时被触发;
    1. 回调的参数 event 中封装了所有信息,如鼠标的水平/垂直坐标:clientX/clientY
    2. 但在IE8中不会回调event,而是将事件对象保存在window的属性中:window.event
    3. clientX/clientY只针对当前浏览器的可见窗口,窗口左上角的坐标始终是(0, 0)
    4. pageX/pageY:鼠标相对于当前页面的坐标,页面左上角的坐标才是(0, 0),不兼容IE8
  2. 页面垂直滚动时,scrollTop 的兼容性:获取页面滚动的距离;
    1. document.body.scrollTop:只适用于 Chrome 浏览器,其他浏览器返回 0
    2. document.documentElement.scrollTop:适用于Foxfire、IE,但Chrome仍返回 0
    3. 水平方向滚动时,scrollLeft 同理。
  3. 事件冒泡:如果父节点和子节点绑定了相同的事件,那么触发子节点事件时,父节点也会触发;
    1. 事件只会向上传递父节点的相同事件,不会向下传递;
    2. 阻止事件冒泡:event.stopPropagation(); --> 不兼容IE
    3. IE浏览器特有的阻止事件冒泡:window.event.cancelBubble = true;

事件委托

事件委托:多个子元素需要注册同一种事件时,给其共同的父元素注册该事件,事件响应时,通过回调参数 event 获取每个子元素,根据不同的子元素,执行不同的代码;

    <ul> 
        <li><a href="javascript:;">超链接一</a></li>
        <li><a href="javascript:;">超链接二</a></li>
    </ul>
    var uls = document.getElementsByTagName("ul")[0];
    uls.onclick = function(event) {
        event = event || window.event; --> 兼容IE
        var node = event.target; --> 获取当前点击的子元素节点对象
    };
  1. event.currentTarget 、 event.target
    1. click事件实际注册到<ul>标签上,event.target获取的是实际点击标签的元素对象;
      点击<li>,则event.target就是li;点击<a>,则event.target就是 a
    2. event.currentTarget 获取的是实际注册 click 事件的元素对象,始终是 <ul> 对象。
  2. event.relatedTarget 返回与事件的目标节点相关的节点
    1. 对于 mouseover 事件来说,该属性是鼠标指针移到目标节点上时所离开的那个节点。
    2. 对于 mouseout 事件来说,该属性是离开目标时,鼠标指针进入的节点。
    3. 对于其他类型的事件来说,这个属性没有用。

函数节流:

  1. JS中有些事件的触发频率特别高,比如:onresize,onmousemove
  2. 对于短时间内高频率触发的函数,可以在函数内使用定时器减少触发次数,实现函数节流;
  3. 在触发定时器之前,先清除一次定时器,只保留最后一次定时器任务;
    clearTimeout(timer); timer = setTimeout(function{ ... }, 200);

事件

  1. addEventListener("事件名", function, false):事件绑定,事件名不带 on
  2. element.onclick=function(event){}; ->属性的方式绑定事件,多次绑定同一事件时,最后一次绑定会覆盖之前的事件;
  3. addEventListener() 可以重复绑定同一事件,响应事件时,从第一次绑定时开始响应;
    uls.addEventListener('click', function(){}, false); --> 绑定click事件
  4. removeEventListener('事件名', callback):移除绑定的事件,callback 并不是移除事件的回调,而是addEventListener() 的回调函数名,因为它可以对同一事件绑定多次;
  5. addEventListener() 只兼容到IE9,而在IE8中,绑定事件使用attachEvent()
  6. attachEvent("事件名", function):事件名中带 on,也可以多次绑定同一个事件,但事件的响应顺序与addEventListener() 相反;
  7. addEventListener() 中的 this 指向绑定事件的对象,而 attachEvent() 中指向window
  8. 兼容性:
    function bind(obj, event, callback) {
        if(obj.addEventListener) {
            obj.addEventListener(event, callback, false);
        } else {
            obj.attachEvent("on"+event, function() {
                callback.call(obj);   // 让回调函数中的this指向绑定的对象
            });
        }
    }
  1. 事件的传播:
    1. 微软公司认为事件应该从内向外,即事件冒泡的形式;而网景公司认为恰恰相反;
    2. W3C综合两种方案,将事件传播分为 3 个阶段:捕获阶段、目标阶段、冒泡阶段
    3. 捕获阶段:事件从最外层的父元素,向目标子元素进行事件的捕获,但默认此时不会触发事件;
    4. 目标阶段:事件捕获到目标元素,捕获结束,开始在目标元素上触发事件;
    5. 冒泡阶段:事件从目标元素向父元素传递,并依次触发父元素上的事件;
    6. 在捕获阶段也触发事件:addEventListener("事件名", function, true)
    7. IE<=8 没有事件捕获阶段。
  2. 鼠标按下/移动/松开:onmousedown、onmousemove、onmouseup
    1. 拖拽网页中的内容时,浏览器默认会执行搜索内容,导致拖拽功能异常;
    2. return false; 禁止默认行为,但不兼容IE8
    3. element.setCapture(); 捕获element绑定的相关事件,优先响应;
    4. element.releaseCapture(); 释放捕获;
    5. 但是,setCapture()只有IE支持,Firefox不会报错,Chrome会报错;
      element.setCapture && element.setCapture(); --> 有setCapture()方法,则执行
    6. 鼠标拖拽标签:
    element.onmousedown = function(event){  //  给被拖拽的标签注册鼠标的按下事件
        if (event.button != 0) return; // 只有鼠标左键按下才有效
        element.setCapture&&element.setCapture()  // 兼容IE
        document.onmousemove = function(e){   // 把移动事件注册到document上,防止卡顿
            ......  // 更改标签的left/top,达到移动效果
            e.preventDefault();  // 阻止浏览器的默认行为
        }
        document.onmouseup = function(e){  // 抬起事件也必须注册到document上,任何地方
            document.onmousemove = null;  // 都可以取消事件
            document.onmouseup = null;
            document.releaseCapture&&document.releaseCapture(); // 兼容IE
        }
        // 屏蔽第二次拖拽时的鬼影,return false 无效
        event.preventDefault();
        event.stopPropagation();
    }
  1. 鼠标滚轮:onmousewheel,但Firefox不支持,而是使用DOMMouseScroll,而且火狐必须通过 addEventListener() 绑定滚轮事件;
    1. event.wheelDelta:鼠标滚轮滚动的方向,只看正负,不管大小,负值表示向下滚动;
    2. FireFox也不支持 event.wheelDelta,而是使用 event.detail,正数表示向下滚;
    3. 如果浏览器有滚动条,滚动鼠标滚轮将执行浏览器的默认行为,而不会执行元素的滚轮事件;
    element.onmousewheel=function(event){
        return false;   // 阻止浏览器的默认行为,执行元素的滚轮事件;
    };
    element.addEventListener("DOMMouseScroll", function(event){
        event.preventDefault && event.preventDefault();   // 阻止浏览器的默认行为
    }, false);
  1. return false;addEventListener() 注册的事件中,无法阻止浏览器的默认行为,必须使用tevent.preventDefault();
  2. 鼠标右击事件:oncontextmenu
  3. 键盘事件:onkeydown(按下)、onkeyup(松开)、onkeypress(按下并松开)
    1. 键盘事件一般绑定给可以获取焦点的元素对象,或者document,比如 <input />输入框;
    2. 对于onkeydown,如果长时间按下一个按键,那么事件将一直触发,而且第一次和第二次触发的时间间隔会比第二次之后的时间间隔长一些,为了避免误操作;
    3. event.KeyCode:获取按键的编码,从而判断按键的类型,如 y=89
    4. altKey、ctrlKey、shiftKey:判断 Alt、Ctrl、Shift 键是否被按下;
      event.keyCode===89 && event.ctrlKey --> Ctrl+y
    5. <input />onkeydown 事件默认行为就是输入内容,return false; 可以阻止输入。
  4. 阻止默认行为:return false;event.preventDefault();
    1. 在jQuery中,return false; 相当于同时调用 preventDefault()stopPropagation();
    2. IE不支持preventDefault(),需要使用:window.event.returnValue = false;
    3. 在原生JS中,addEventListener()/attachEvent() 绑定的事件中,不支持return false 阻止默认行为,必须使用preventDefault()、window.event.returnValue=false
    4. H5规范指出,在mouseover等几种特殊事件中,return false;并不一定能终止事件,所以H5建议尽量不要使用 return false 来阻止事件的默认行为。

BOM

BOM:浏览器对象模型,可以让我们通过JS来操作浏览器;

  1. BOM对象:Window、Navigator、Location、History、Screen
    1. Window:代表整个浏览器窗口,同时,window也是网页中的全局对象;
    2. Navigator:表示当前浏览器的信息,可以用来识别不同的浏览器;
    3. Location:浏览器的地址栏,可以获取地址栏信息,操作浏览器跳转页面;
    4. History:表示浏览器的历史纪录,但由于隐私原因,不能获取到具体的历史纪录,只能操作
      浏览器向前/后退,而且只在当次访问时有效,关闭之后再打开则无效;
    5. Screen:表示拥护的屏幕信息,可以获取显示器的相关信息,常用于移动端;
    6. 这些 BOM 对象在浏览器中都是作为 window 对象的属性保存的,又因为 window 是全局的对象,可以直接使用这些对象,而不用通过 window.navigator 调用;
  2. Navigator
    1. 由于历史原因,navigator对象中的大部分属性都已经不能识别浏览器了;
    2. 一般只会使用 userAgent 来判断浏览器的信息:navigator.userAgent
    3. IE11中的 userAgent 已经去除了微软和IE的相关标识,不能通过userAgent来准确识别IE
    4. window.ActiveXObjectIE 特有的函数,根据这些特有的信息获取浏览器的类型;
    if(window.ActiveXObject) --> 微软发现了这种判断方式,所以在IE11返回的是false
    但并不意味着IE11中没有该对象:if("ActiveXObject" in window) --> true
  1. History
    1. length:浏览器历史列表中的URL数量;
    2. back()/forward():加载前/下一个,回退/前进一个页面;
    3. go():加载某个具体页面,go(1)相当于forward()go(-1) 相当于 back()
  2. Location
    1. location 可以获取地址栏的完成信息,也可以直接操作地址栏,同 window.location
    2. 属性:hash、host、hostname、href、pathname、port、protocol、search
  3. location.href = "https://www.baidu.com/":重定向到一个新的网站,会生成历史纪录
  4. location = "/login/login.html":重定向到新的页面,当前域名 /login/login.html
    1. window.location.search:获取地址的参数部分,?...
    2. window.location.hash:获取页面的锚点,#...
  5. assign():加载新的文档,assign("https://www.baidu.com/")
  6. reload():刷新,默认刷新带有缓存,reload(true):强制清空缓存刷新
  7. replace():用新的文档替换当前文档,不会生成历史纪录,即不能回退。
  8. window.open():开启一个新的窗口,加载文档。

定时器

setTimeout()、setInterval()、clearTimeout()、clearInterval()

  1. 延迟任务:
    1. setTimeout(function, time)time毫秒之后执行function,返回Number型的数据;
    2. clearTimeout(timer):即使 timerundefined,也不会报错,什么也不做;
  2. 定时任务
    1. setInterval(function, time):每隔 time 毫秒执行一次 function
    2. clearInterval(timer):清除定时器;

JSON

  1. JSONJavaScript Object Notation,JS对象表示法
    1. JSON和JS对象的格式一样,只不过JSON字符串中的属性名必须加双引号;
      var str = '{"name": "Mack", "age": 18}';
    2. JSON类型:对象{},数组[]
    3. JSON中允许的属性值:字符串、数值、布尔值、null、对象、数组
  2. JSON字符串与JS对象相互转换:JSON
    1. JSON.parse(str):JSON字符串转JS对象;
    2. JSON.stringify(obj):JS对象转JSON字符串;
    3. IE7不支持JSON,可以使用 eval(str) 函数,将一个字符串转为有效的表达式;
        var obj = eval("(" + str +")"); -->对字符串加"()",告诉浏览器{}不是一个代码块;
        // obj = {"name": "Mack", "age": 18}
  1. 但是,eval()的性能比较低,而且存在安全隐患,转换的字符串可能是一段有害的JS代码。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,491评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,856评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,745评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,196评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,073评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,112评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,531评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,215评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,485评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,578评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,356评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,215评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,583评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,898评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,497评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,697评论 2 335

推荐阅读更多精彩内容

  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5? 答:HTML5是最新的HTML标准。 注意:讲述HT...
    kismetajun阅读 27,347评论 1 45
  • 事件源对象 event.srcElement.tagName event.srcElement.type 捕获释放...
    孤魂草阅读 855评论 0 0
  • 事件类型 Web浏览器可能发生的事件类型有很多。不同的事件类型具有不同的信息,而“DOM3级事件“规定了以下几类事...
    ConRon阅读 860评论 0 1
  • 概要 64学时 3.5学分 章节安排 电子商务网站概况 HTML5+CSS3 JavaScript Node 电子...
    阿啊阿吖丁阅读 8,994评论 0 3
  • 第一章 1.什么是DOM DOM: Document Object Model(文档对象模型) 是JavaScri...
    fastwe阅读 776评论 0 0