基礎行為 | 鼠標滾動 | Cookie 筆記

阻止默認行為
return false: 1、適用於obj.on[xxx] = fn所觸發的行為 2、attachEvent綁定;
e.preventDefault():適用於addEventListener綁定的事件。

function (ev) {
  ev = ev || event
  if (ev.preventDefault) {
    ev.preventDefault();
  } 
  else {
    ev.returnValue = false;
    return false;
  }
}

鼠標滾動
ie/chrome : e.onmousewheel
底下 e.wheelDelta 數字類型:上 : 120 , 下 : -120
ff : DOMMouseScroll 必須用addEventListener綁定 [ ff認為給obj添加一個onmousewheel屬性 ]
底下 e.detail 數字類型:上 : -3,下 : 3


box.onmousewheel = fn
if (box.addEventListener) { //做判斷,否則ie8報錯
  box.addEventListener('DOMMouseScroll', fn, false)
}


function fn(e) { //updown為true滾上,為false滾下
  var updown = true;
  var e = e || event;
  if (e.wheelDelta) {
    updown = e.wheelDelta > 0 ? true : false;
  } 
  else {
    updown = e.detail < 0 ? true : false
  }
  if (updown) {
    // do something
  } else {
    // do something
  }
  return false
  if (e.preventDefault) {
    e.preventDefault()
  }
}

Cookie
1、不同瀏覽器位置不同;
2、cookie以域名形式存;
3、cookie數據可設置名字,j.name = elmok;
4、通過document.cookie 來獲取當前網站下的cookie,得到字符串形式值;
5、域名下存放多個cookie ,不同瀏覽器不同;
6、每個cookie存放內容大小也是有限制,不同瀏覽器不同;
7、長時間存放cookie需要設置時間;document.cookie = '名稱 = 值;expires='+時間【必須是字符串格式】;toGMTString
8、cookie默認臨時存儲,當瀏覽器關閉進程時自動銷毀;
9、有特殊如n,使用encodeURI/decodeURI;

//設置一個cookie
var _Date = new Date();
_Date.setDate(_Date.getDate() + 7)        //7天以後
document.cookie = 'username = elmok;expires=' + _Date.toGMTString();
console.log(_Date);// Date {Fri Aug 21 2015 22:24:41 GMT+0800};

console.log(encodeURI('你好'))
console.log(decodeURI('%E4%BD%A0%E5%A5%BD'))

//方法封裝
function getCookie(key) {
  var arr = document.cookie.split('; ')
  for (var i = 0; i < arr.length; i++) {
    var arrN = arr[i].split('=')
    if (arrN[0] == key) {
      return decodeURI(arrN[1]);
    }
  }
}

function setCookie(key, value, t) {
  var _Date = new Date();
  _Date.setDate(_Date.getDate() + t)
  document.cookie = key + '=' + value + ';expires=' + _Date.toGMTString()
}

function removeCookie(key) {
  setCookie(key, '', - 1);
}

getCookie('username');
setCookie('sex', '男', 10);
removeCookie('sex')

//ex
var _uname = document.getElementById('username')
var _login = document.getElementById('login')
var _del = document.getElementById('del')
if (getCookie('username')) {
  _uname.value = getCookie('username')
}
_login.onclick = function () {
  alert('ok')
  setCookie('username', _uname.value, 5)
}
_del.onclick = function () {
  removeCookie('username')
  _uname.value = '';
}

基礎焦點 | 事件 | 健盤 | 移動 | 拖拽 筆記

焦点事件

txt1.onfocus = function () {
  if (this.value == 'please input something') {
    this.value = ''
  }
}
txt1.onblur = function () {
  if (this.value == '') {
    this.value = 'please input something'
  }
}

// obj.focus()//给指定元素设置焦点
// obj.blue() //取消元素焦点
// obj.select() /选择指定元素的文本

btn1.onclick = function () {   txt1.select() } 

事件对象
1、event:事件对象,当一个事件发生时,和当前对象发生的这个事件有关的一些详细的信息都会保存到一个指定地方:event对象供我们在需要时调用
2、如果一个函数被事件调用,那么这个函数定义的第一个参数就是事件对象

for (var attr in ev) {   console.log(attr + '=' + ev[attr]); } 

FF无even内部定义全局对象
div鼠标移动

document.onmousemove = function (ev) {
  var ev = ev || event;
  var sct = document.documentElement.scrollTop || document.body.scrollTop;
  var scl = document.documentElement.scrollLeft || document.body.scrollLeft;
  box.style.left = ev.clientX + scl + 'px'
  box.style.top = ev.clientY + sct + 'px'
}

事件流:1、事件冒泡;2、事件捕获

function fn1() {
  alert(this.id)
}
box1.onclick = fn1; //给元素加函数;//告诉box1,如果他接收到一个点击事件,那么他就去执行fn1  //事件函数绑定
box2.onclick = fn1;
box3.onclick = fn1;
//从中间截断,即不会再有冒泡,box3也冒泡不到box1
box2.onclick = function (ev) {
  var ev = ev || event
  ev.cancelBubble = true;
}
var box = document.getElementById('box')
var inp = document.getElementById('btn')
inp.onclick = function (ev) {
  box.style.display = 'block'
  //阻止inp的冒泡 阻止当前对象的当前事件冒泡  即只阻止onclick,如onmouseover等都会有冒泡
  var ev = ev || event
  ev.cancelBubble = true;
}
document.onclick = function () {
  box.style.display = 'none'
}
//FB显示隐藏
var div1 = document.getElementById('div1')
div1.onmouseover = function () { //移到div2时,冒泡到div1了,所以能显示
  this.style.left = 0
}
div1.onmouseout = function () {
  this.style.left = - 100 + 'px'
}

1、事件绑定第一种形式:obj.onclick = fn; 多个绑定会覆盖前面绑定;
2、事件绑定第二种形式:

IE:obj.attachEvent(事件名,事件函数) document.attachEvent('onclick',fn1) IE7下顺序会相反
   <blockquote> 1)无捕获
    2)事件名称有on
    3)IE7下事件执行顺序相反
    4)this指向window
    5)使用call,函数下一个方法,改变一个函数运行中this指向,第二个开始就是原来函数的参数
ockquote>
标准下:obj.addEventListener(事件名,事件函数,是否捕获?) obj.addEventListener('click','fn1', true)
ckquote> 1)有捕获<br />
    2)事件名称无on<br />
    3)顺序正常<br />
    4)this指向触发该函数的对象</blockquote>
//事件绑定方法封装
function on(obj, evt, fn) {
  if (obj.addEventListener) {
    obj.addEventListener(evt, fn, false)
  } 
  else {
    obj.attachEvent('on' + evt, function () {
      fn.call(obj);
    })
  }
}
on(document, 'click', fn1)
function fn1() {
  alert(this)
}
<div id="box1">
    <div id="box2">
        <div id="box3"></div>
    </div>
</div>
//先出后进
box1.addEventListener('click', function () {
  alert(1)
}, false)
box1.addEventListener('click', function () {
  alert(3)
}, true)
box3.addEventListener('click', function () {
  alert(2)
}, false)

取消事件绑定
ie:obj.adttachEvent(事件名称,事件函数)
标准 : obj.removeEventListener(事件名称,事件函数,是否捕获)

document.onclick = null;
document.removeEventListener('click',fn1,false)

健盘事件
onkeydown:按按下时触发
onkeyup:按健抬起时触发
event.keyCode:数字类型,健值
ctrlKey,shiftKey altKey ,boolean值,当一个事件发生时,如果ctrl || shift || alt是按下的状态返回true,否则返回false

document.onkeydown = function (ev) {
  var ev = ev || event
  alert(ev.keyCode)
}
document.onclick = function (ev) {
  var ev = ev || event
  alert(ev.ctrlKey)
}
txt1.onkeyup = function (ev) {
  var ev = ev || event
  //alert(this.value)
  if (this.value != '') {
    if (ev.keyCode == 13) {
      var oli = document.createElement('li')
      oli.innerHTML = this.value;
      if (ul1.children[0]) { //如果存在子元素
        ul1.insertBefore(oli, ul1.children[0])
      } 
      else { //如果不存在子元素
        ul1.appendChild(oli)
      }
    }
  }
}

移動元素,按健連續觸發延遲問題

<div id="div1" style="width: 100px; height: 100px; background: #bf0000; position: absolute;"></div>
var div1 = document.getElementById('div1')
//有焦点的元素才能够接收健盘事件;
var timer = null;
var onoff = true; //設置開關
var clw = document.documentElement.clientWidth;
var clh = document.documentElement.clientHeight;
document.onkeydown = function (e) { //把健盘事件加到document上
  e = e || event;
  switch (e.keyCode) {
    case 37: //左
      if (onoff) {
        timer = setInterval(function () {
          var dl = div1.offsetLeft;
          if (dl < 10) {
            dl = 10
          }
          onoff = false
          div1.style.left = dl - 10 + 'px'
        }, 14)
      }
      break;
    case 38://上
      if (onoff) {
        timer = setInterval(function () {
          var dt = div1.offsetTop
          if (dt < 10) {
            dt = 10
          }
          onoff = false
          div1.style.top = dt - 10 + 'px'
        }, 14)
      }
      break;
    case 39://右
      if (onoff) {
        timer = setInterval(function () {
          var dl = div1.offsetLeft;
          if (dl > (clw - div1.offsetWidth - 10)) {
            dl = clw - div1.offsetWidth - 10
          }
          onoff = false
          div1.style.left = dl + 10 + 'px'
        }, 14)
      }
      break;
    case 40://下
      if (onoff) {
        timer = setInterval(function () {
          var dt = div1.offsetTop
          if (dt > (clh - div1.offsetHeight - 10)) {
            dt = clh - div1.offsetHeight - 10
          }
          onoff = false
          div1.style.top = dt + 10 + 'px'
        }, 14)
      }
      break;
  }
}
document.onkeyup = function () {
  onoff = true;
  clearInterval(timer);
}

事件默認行為: return false;
自定義右健菜單

document.oncontextmenu = function (e) {
  var e = e || event;
  var scl = document.documentElement.scrollLeft || document.body.scrollLeft;
  var sct = document.documentElement.scrollTop || document.body.scrollTop;
  box.style.display = 'block'
  box.style.left = e.clientX + scl + 'px'
  box.style.top = e.clientY + sct + 'px'
  return false;
}
document.onclick = function () {
  box.style.display = 'none'
}

元素拖拽,方法封裝
拖拽過程如果有文字被選中會產生問題:
原因:默認行為
標準下:阻止拖拽默認行為;return false;
ie:全局捕獲 obj.setCapture() ; 當給一個元素設置全局捕獲以後,此元素會監聽後續發生的所有事件,當有事件發生時就會被當前設置了全局捕獲的元素觸發;

inp1.onclick = function(){
    alert(1);
}
inp2.onclick = function(){
    alert(2);
}
if(inp1.setCapture){
inp1.setCapture()
}  //第一次點任意地方都將觸發alert(1);
function drag(obj) {
  var cw = document.documentElement.clientWidth;
  var ch = document.documentElement.clientHeight;
  obj.onmousedown = function (e) {
    var e = e || event;
    var disW = e.clientX - this.offsetLeft;
    var disH = e.clientY - this.offsetTop;
    //解決IE文字選中後移動問題:
    if (obj.setCapture) {
      obj.setCapture();
    }
    document.onmousemove = function (e) {
      var e = e || event;
      var cw_w = e.clientX - disW;
      var ch_h = e.clientY - disH
      if (cw_w < 0) {
        cw_w = 0
      } 
      else if (ch_h < 0) {
        ch_h = 0
      } 
      else if (cw_w > cw - obj.offsetWidth) {
        cw_w = cw - obj.offsetWidth
      } 
      else if (ch_h > ch - obj.offsetHeight) {
        ch_h = ch - obj.offsetHeight
      }
      obj.style.left = cw_w + 'px'
      obj.style.top = ch_h + 'px'
    }
    document.onmouseup = function () {
      document.onmousemove = null;
      //解決IE8抬起鼠標,釋放全局捕獲 releaseCapture();
      if (obj.releaseCapture) {
        obj.releaseCapture()
      }
    }
    return false; //down事件觸發時陰止默認行為;
  }
}