querySelector 選擇首次遇到的
querySelectorAll 選擇所有
classList : add remove toggle

var div = document.getElementById('div1')
console.log(typeof div.classList); //object
// alert(div.classList)  //box1 box2 box3
div.classList.add('box4')
div.classList.remove('box2')
div.classList.toggle('box4') // 有則刪,無則加



eval(): 可以解析任何字符串變成js


parse: 只能解析JSON形式的字符串變成JS 安全性高些

字符串[json形式]轉 -- > JS ; JSON.parse(str)


json轉--> 字符串 ;JSON.stringify(json)

//str是一個fun
var str = 'function show(){ alert(123) }'
eval(str);     //字符串轉成原生js
show()     //之後即可調用*/

//str是一個json
var str = '{"name":"elmok"}'   //'{name:"elmok"}' 這咱不行,一定要加引號
var json = JSON.parse(str)   // json =  {"name":"hello"}
console.log(json.name);      //hello

//json變字符串
var json = {name:"hello"}    //json變成字符串 會自動加上雙引號
var str = JSON.stringify(json)
console.log(str);

問題:克隆一個json a{},並且改變不影響原json
先把a{}轉為字符串'a{}',存在str = 'a{}'裏,再把str轉為json,存在新建變量b = {},則改變b不影響a

var a = {name: 'hello'}
var str = JSON.stringify(a)
var b = JSON.parse(str)
b.name = 'hi'
console.log(a.name);

兼容 https://github.com/douglascrockford/JSON-js



自定義屬性,想要取得某個值,可使用dataset對象

<div id="div1" data-mm="BB" data-mm-bb="BBBB">div</div>

    var div = document.getElementById('div1')
    alert(div.dataset.mm)
    alert(div.dataset.mmBb) //多個駝峰寫法



延遲加載JS
defer : 延迟加载,会按顺序执行,在onload执行前被触发
async : 异步加载,加载完就触发,有顺序问题

<script src="a.js" defer="defer"></script> <!--onload執行之前執行-->
<script src="a.js" async="async"></script> <!--圖片與js同時加載-->



元素拖動<>

首先,被拖動元素自身定義:draggable="true"

draggable :

设置为true,元素就可以拖拽了

拖拽元素事件 : 事件对象为被拖拽元素

dragstart , 拖拽前触发
drag ,拖拽前、拖拽结束之间,连续触发
dragend , 拖拽结束触发

目标元素事件 : 事件对象为目标元素

dragenter , 进入目标元素触发,相当于mouseover
dragover ,进入目标、离开目标之间,连续触发
dragleave , 离开目标元素触发,相当于mouseout
drop , 在目标元素上释放鼠标触发

See the Pen JYYKeV by elmok (@elmok) on CodePen.


<script async src="//assets.codepen.io/assets/embed/ei.js"></script>

FF下必須設置dataTransfer对象才可能拖動(圖片以外)的元素

setData() : 设置数据 key和value(必须是字符串)
getData() : 获取数据,根据key值,获取对应的value
ev.dataTransfer.effectAllowed 設置光標樣式:copy link uninitialized..
ev.dataTransfer.setDragImage(img, 0, 0) 拖動的東西變為指定的對像,如一張圖片,0,0表示對象的座標XY

See the Pen bVVeyR by elmok (@elmok) on CodePen.


<script async src="//assets.codepen.io/assets/embed/ei.js"></script>

li[i].ondragstart = function (ev) { //g開始
  var ev = ev || event
  //   ev.dataTransfer.setData('name','hello') //ff bug
  ev.dataTransfer.setData('name', 'hello')
  ev.dataTransfer.effectAllowed = 'copy'; //光標樣式
  ev.dataTransfer.effectAllowed = 'link'; //光標樣式
  ev.dataTransfer.effectAllowed = 'uninitialized'; //光標樣式
  ev.dataTransfer.setDragImage(img, 0, 0) //拖的東西指定為div,即使變為div
}

小實例1:文件拖放上傳


1、目標元素事件ondragenter,進入目標元素時更改文字:可釋放鼠標;


2、在目標元素內釋放鼠標生效,所以ondragover去默認事件;


3、目標元素釋放鼠標事件,ondrop,先去除默認事件ev.preventDefault()


4、var fs = ev.dataTransfer.files得到對象的集合,運回一個filesList列表,下有type屬性,返回文件類型


5、每一個fs[i].type判斷類型,如:fs[i].type.indexOf('image') != -1


6、FileReader(讀取文件信息)所以創建一個var fd = new FileReader()對象,fd.readAsDataURL方法讀取文件,即,fd.readAsDataURL(fs[i]),傳進來,會轉成文件信息


7、當文件信息FileReader讀取成功後,走fd.onload = ..事件


8、fd.onload = ...裏有 this.result事件,彈出的其實即圖片的數據 base-64位


9、所以拿到數據this.result後,即可把數據上傳!



See the Pen ojjYqE by elmok (@elmok) on CodePen.


<script async src="//assets.codepen.io/assets/embed/ei.js"></script>
小實例2:拖放購物車

1、使用ev.dataTransfer.setData()及ev.dataTransfer.getData()讀取獲取數據,注意思路!


2、使用json去重覆思路,先定obj = {} ,如果,因為stitle是唯一的,所以使用stitle判斷是否已在購物車裏,obj[stitle]不存在false,取反即返回true,走創建元素操作,之後把obj[title] = 1變為1,即存在,走else


3、如商品已在購物車裏,走else,只須把已經存在的商品數量+1


4、處理數量+1,因為stitle的class為box2,所以使用box2判斷,如果box2[i].innerHTML == stitle已存的stitle,則把box1.innerHTMl + 1,注意字符串先轉為數字,[box1.innerHTMl為數量]


5、allMoney,把每次拖進來的smoney累加到inum裏,最後把inum賦值allMoney即可



See the Pen jbbVYO by elmok (@elmok) on CodePen.


<script async src="//assets.codepen.io/assets/embed/ei.js"></script>