JavaScript入门学习(二)

一、注册事件

(一)on+事件名="fuctionName()"

(二)on+事件名绑定(onclick, onmouseover)

<body>
    <button id="button1">注册事件</button>
    <script>
      var btn = document.querySelector("#button1"); //事件源
      btns[0].onclick = function(){
            alert(this.innerHTML);
      }
    </script>
  </body>

一个元素只能绑定一个事件,多写相当于最后注册的事件绑定覆盖掉前面的,前面的注册事件全部失效

(三)addEventListener()

1.仅ie9以上支持

<body>
    <button id="button1">注册了两个事件的按钮</button>
    <script>
      var btn = document.querySelector("#button1"); //事件源
      btn.addEventListener("click", function () {
        alert(this.innerHTML);
      });
    </script>
  </body>

     一个元素可以绑定多个事件,每个事件都有效,先绑先触发。

     eventTarget.addEventListener(type, listener[, useCapture])

  • type: click, mouseover等(不带on)
  • listener: 函数
  • useCpature: true即使用捕获模式(capture),false表示使用冒泡模式

2.ie9以下使用attachEvent(eventNameWithOn, callback)

<body>
    <button id="button1">注册了两个事件的按钮</button>
    <script>
      var btn = document.querySelector("#button1"); //事件源
      btn.attachEvent("click", function () {
        alert(this.innerHTML);
      });
    </script>
  </body>

3.注册事件兼容性解决方案(了解)

function addEventListener(element,eventName,fn){
    //判断当前浏览器是否支持addEventListener方法
    if(element.addEventListener){
        element.addEventListener(eventName,fn);
    }else if(element.attachEvent){
        element.attachEvent('on' + eventName,fn);
    }else{
    //相当于 element.onclick = fn
    element['on'+eventName]=fn;
    }
}

二、删除事件

(一)on+事件名 = null;

<body>
    <div>1</div>
    <div>2</div>
    <div>3</div>
    <script>
      var divs = document.querySelectorAll("div"); //事件源
      btns[1].onclick = function(){
            alert(this.innerHTML);
            divs[0].onclick = null;
      }
    </script>
  </body>

(二)eventTarget.removeEventListener(type, listener[, useCapture])

1.ie9以上

<body>
    <div>1</div>
    <div>2</div>
    <div>3</div>
    <script>
      var divs = document.querySelectorAll("div"); //事件源
      divs[0].addEventListener("click", fn)
      function fn() {
        alert(this.innerHTML);
        divs[0].removeEventListener("click", fn)
      });
    </script>
  </body>

(三)eventTarget.detachEvent(eventNameWithOn, callback)

ie9以下

<body>
    <div>1</div>
    <div>2</div>
    <div>3</div>
    <script>
      var divs = document.querySelectorAll("div"); //事件源
      divs[0].attachEvent("onclick", fn)
      function fn() {
        alert(this.innerHTML);
        divs[0].detachEventListener("onclick", fn)
      });
    </script>
  </body>

兼容

function addEventListener(element,eventName,fn){
    //判断当前浏览器是否支持addEventListener方法
    if(element.removeEventListener){
        element.removeEventListener(eventName,fn);
    }else if(element.attachEvent){
        element.detachEvent('on' + eventName,fn);
    }else{
    //相当于 element.onclick = fn
    element['on'+eventName]=fn;
    }
}

注意:删除事件和注册事件,必须是同一个事件,即同一个函数,才能删除成功。长得一样的函数在js看来是不一样的,因为函数的地址是不同的,删除的函数的地址必须与注册的函数的地址保持一致,才能删除成功。

二、DOM重点核心

(一)创建

1.document.write

2.innerHTML

3.creatElement

(二)增

1.appenChild

2.insertBefore

(三)删

remove

(四)改

1.修改元素属性:src、href、title

2.修改普通元素内容:innerHTML、innerText

3.修改表单元素:value、type、disable

4.修改元素样式:style、className

(五)查

1.DOM提供的API方法:getElementById、getElementsByTagName

2.HS提供的新方法:querySelsector、querySelectorAll

3.利用节点操作获取元素:父(parentNode)、子(chlidren)、兄(previousElementSibling、nextElementSling)

(六)属性操作

主要针对自定义属性

1.setAttribute

2.getAttribute

3.removeAttribute

(七)事件操作

鼠标事件触发条件
onclick鼠标点击左键触发
onmouseover鼠标经过触发
onmouseout鼠标离开触发

onfocus

获得鼠标焦点触发
onblur失去鼠标焦点触发
onmousemove鼠标移动触发
onmouseup鼠标弹起触发
onmousedown鼠标按下触发
键盘事件触发条件
onkeyup某个按键被松开时触发
onkeydown某个按键被按下时触发
onkeypress某个按键被按下时触发  但是他不识别功能键如shift

三、 兄弟节点的兼容性处理

(一)ie9以上

1.node.nextSibling

返回当前元素的下一个兄弟节点,找不到返回null

2.node.previousSibling

返回当前元素上一个兄弟节点,找不到返回null

(二)ie9以下

自己封装一个兼容性的函数

function getNextElementSibling(element){
    var el = element;
    while(el  = el.nextSibling){
        if(el.nodeType == 1){
            return el;
        }
    }
    return null;
}

四、this

(一)用法

1.在一般函数方法中使用 this 指代全局对象

function test(){
    this.x = 1;
    alert(this.x);
  }
  test(); // 1

2.作为对象方法调用,this 指代上级对象

function test(){
  alert(this.x);
}
var o = {};
o.x = 1;
o.m = test;
o.m(); // 1

3.作为构造函数调用,this 指代new 出的对象

function test(){
    this.x = 1;
  }
  var o = new test();
  alert(o.x); // 1
    //运行结果为1。为了表明这时this不是全局对象,我对代码做一些改变:
  var x = 2;
  function test(){
    this.x = 1;
  }
  var o = new test();
  alert(x); //2

4.apply 调用 ,apply方法作用是改变函数的调用对象,此方法的第一个参数为改变后调用这个函数的对象,this指代第一个参数

 var x = 0;
  function test(){
    alert(this.x);
  }
  var o={};
  o.x = 1;
  o.m = test;
  o.m.apply(); //0
//apply()的参数为空时,默认调用全局对象。因此,这时的运行结果为0,证明this指的是全局对象。如果把最后一行代码修改为

  o.m.apply(o); //1

(二)this和e.target的区别

  • js中事件是对冒泡的,所以this是会发生变化的,

  • event.target不会发生变化。它是永远直接接受事件的目标DOM元素

五、三种创建元素方法的优缺点

1.document.write()会把之前的整个页面覆盖掉(几乎不用),不能在触发事件时使用

2.element.innerHTML;  每使用一次innerHTML ,页面都需要重新绘制 ,使用时考虑效率问题
优化一,提前拼接字符串,一次使用inner HTML
问题来了:因为字符串的“不可变”,每次拼接都需要重新开辟内存空间,需要耗费时间。

优化二,使用数组代替字符串拼接,
因为数组是一个对象,每次拼接只需要已开辟空间内添加,比重新开辟空间内存要省时间。

两个需要用到的方法:

array.push()往数组里面添加

array.join()拼接数组中的每一项,默认使用‘ ,’隔开 

array.join(' ')即可完成拼接

3.createElement 在内存中创建一个DOM对象
创建后 ,需要把该元素放到DOM树上 使用 element.appendChild();

六、冒泡和捕获一个DOM元素绑定多个事件时,先执行冒泡还是捕获 

绑定在被点击元素的事件是按照代码顺序发生,其他元素通过冒泡或者捕获“感知”的事件,按照W3C的标准,先发生捕获事件,后发生冒泡事件。所有事件的顺序是:其他元素捕获阶段事件 -> 本元素代码顺序事件 -> 其他元素冒泡阶段事件 。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值