零HTML5筆記 | 選擇器 | 元素拖放
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>