1. Js implements dragging elements
const div = document.getElementsByTagName('div')[0]
let isDown = false
let numX = 0
let numY = 0
div.onmousedown = (e) => {
numX = e.clientX - div.offsetLeft
numY = e.clientY - div.offsetTop
isDown = true
}
window.onmousemove = (e) => {
if(isDown) {
let nl = e.clientX - numX
let nt = e.clientY - numY
div.style.left = nl + 'px'
div.style.top = nt + 'px'
}
}
div.onmouseup = () => {
isDown = false
}
2. Js realizes once effect
let fn = function () {
console.log(1) }
function onece(fn) {
let isFirst = true
return function() {
if(isFirst) {
fn.apply(null,arguments)
isFirst = false
} else {
return undefined
}
}
}
let b = onece(fn)
b()
b()
3. Js realizes deep copy
1. General approach
function deepClone(obj) {
if (typeof obj === 'string' || typeof obj === 'number' || typeof obj === 'boolean' || typeof obj === 'undefined' || Object.prototype.toString.call(null) === '[object Null]') {
return obj
} else if (Array.isArray(obj)) {
let newArr = []
for (let i in obj) {
newArr.push(deepClone(obj[i]))
}
return newArr
} else {
let newOjb = {
}
for (let i in obj) {
newOjb[i] = deepClone(obj[i])
}
return newOjb
}
}
2. Objects, arrays
let obj = ['haha','lala']
let str = JSON.stringify(obj)
let newObj = JSON.parse(str)
obj[0] = '试试'
console.log(obj,newObj);
var obj = {
a:1,
b:2
}
var newObj = Object.assign({
},obj)
obj.a = 0
console.log(obj,newObj);
3. Arrays
let arr = [1,2,3,4]
let newArr = [...arr]
arr[0] = 0
console.log(arr,newArr);
Fourth, implement fetch (Promise encapsulates Ajax)
function myAjax(method, url, data) {
return new Promise((resolve, reject) => {
let xhr = new XMLHttpRequest();
let method = method || 'GET'
let data = data || null
xhr.open(method, url, true)
xhr.send(data)
xhr.onreadystatechange = () => {
if (xhr.status === 200 && xhr.readyState === 4) resolve(xhr.responseText)
else reject(xhr.responseText)
}
})
}
myAjax("GET", "/some/url.json", null)
.then(res => console.log(res))