JS打亂數(shù)組
function shuffle(arr) {
let i = arr.length;
while (i) {
let j = Math.floor(Math.random() * i--);
[arr[j], arr[i]] = [arr[i], arr[j]];
}
}
JS ajax
//步驟一:創(chuàng)建異步對(duì)象
var ajax = new XMLHttpRequest();
//步驟二:設(shè)置請(qǐng)求的url參數(shù),參數(shù)一是請(qǐng)求的類型,參數(shù)二是請(qǐng)求的url,可以帶參數(shù),動(dòng)態(tài)的傳遞參數(shù)starName到服務(wù)端
ajax.open('get','getStar.php?starName='+name);
//步驟三:發(fā)送請(qǐng)求
ajax.send();
//步驟四:注冊(cè)事件 onreadystatechange 狀態(tài)改變就會(huì)調(diào)用
ajax.onreadystatechange = function () {
if (ajax.readyState==4 &&ajax.status==200) {
//步驟五 如果能夠進(jìn)到這個(gè)判斷 說明 數(shù)據(jù) 完美的回來(lái)了,并且請(qǐng)求的頁(yè)面是存在的
console.log(ajax.responseText);//輸入相應(yīng)的內(nèi)容
}
}
JS bind 實(shí)現(xiàn)
if (!Function.prototype.bind) {
Function.prototype.bind = function () {
var self = this, // 保存原函數(shù)
context = [].shift.call(arguments), // 保存需要綁定的this上下文
args = [].slice.call(arguments); // 剩余的參數(shù)轉(zhuǎn)為數(shù)組
return function () { // 返回一個(gè)新函數(shù)
self.apply(context,[].concat.call(args, [].slice.call(arguments)));
}
}
}
Function.prototype.bind = function (...arg) {
var self = this;
var newArr = [...arg]; // 保存原函數(shù)
var context = newArr.shift(); // 保存需要綁定的this上下文
return function (...arg2) {
var arr = [...newArr];
Array.prototype.push.apply(arr,arg2)
self.apply(context,arr);
}
}
懶加載
let lazyImages = [...document.querySelectorAll('.lazy-image')]
let inAdvance = 300 // 自定義一個(gè)高度,當(dāng)距離300px到達(dá)圖片時(shí)加載
function lazyLoad() {
lazyImages.forEach(image => {
if (image.offsetTop < window.innerHeight + window.pageYOffset + inAdvance) { // 距離xxpx時(shí)加載圖片
image.src = image.dataset.src
image.onload = () => image.classList.add('loaded')
}
})
// if all loaded removeEventListener
}
lazyLoad()
window.addEventListener('scroll', _.throttle(lazyLoad, 16)) // 用到了lodash的節(jié)流函數(shù)
window.addEventListener('resize', _.throttle(lazyLoad, 16))
JS實(shí)現(xiàn)promise
function PromiseM(){
this.status='pending';
this.msg='';
var process=arguments[0];
var that=this;
process(function(){
that.status='resolve';
that.msg=arguments[0];
},function(){
that.status='reject';
that.msg=arguments[0];
});
return this;
}
PromiseM.prototype.then=function(){
if(this.status=='resolve'){
arguments[0](this.msg);
}
if(this.status=='reject'&&arguments[1]){
arguments[1](this.msg);
}
}
JS發(fā)布訂閱模式
const event = {
clientList: [],
listen: function(key , fn) {
if (this.clientListen[key]) {
this.clientList[key] = []
}
this.clientList[key].push(fn)
},
trigger: function() {
const key = Array.prototype.shift.call(arguments)
const fns = this.clientList[key]
if (!fns || fns.length === 0 ) {
return false
}
for (let i = 0, fn ;fn = fns[i++];) {
fn.apply(this, arguments)
}
},
remove : function(key , fn) {
const fns = this.clientList[key]
if (!fns) {
return false
}
if (!fn) {
fns && (fns.length = 0)
} else {
for (let l = fns.length - 1; l>=0; l--) {
const _fn = fns[l]
if ( _fn ===fn) {
fns.splice(l, 1)
}
}
}
}
const installEvent = (obj) => {
for (let i in event) {
obj[i] = event[i]
}
}
JSONP
var script = document.createElement('script');
script.type = 'text/javascript';
// 傳參并指定回調(diào)執(zhí)行函數(shù)為onBack
script.src = 'http://www.domain-com:8080/login?user=admin&callback=onBack';
document.head.appendChild(script);
// 回調(diào)執(zhí)行函數(shù)
function onBack(res) {
alert(JSON.stringify(res));
}
JS 獲取url參數(shù)
function getQueryString(name) {
var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i");
var r = window.location.search.substr(1).match(reg);
if (r != null) return unescape(r[2]); return null;
}
CSS 無(wú)限旋轉(zhuǎn)
@keyframes rotate{
0%{
transform: rotate(0);
}
50%{
transform:rotate(200deg);
}
100%{
transform: rotate(0);
}
}
.rotate{
transition: 0.5s;
transform-origin: 30px 30px;
animation: rotate 10s linear infinite; /*開始動(dòng)畫后無(wú)限循環(huán),用來(lái)控制rotate*/
}
CSS 卡牌翻轉(zhuǎn)
.wutai{
position: relative;
perspective: 800px;
width: 220px;
height: 292px;
transform-style: preserve-3d;
}
#trans{
position: absolute;
width: 100%;
height: 100%;
transition: all 1s;
transform-style: preserve-3d;
}
.back{transform: rotateY(180deg);}
.flip{transform: rotateY(180deg);}
display 有兼容性怎么辦
.box{
display: -webkit-box; /* 老版本語(yǔ)法: Safari, iOS, Android browser, older WebKit browsers. */
display: -moz-box; /* 老版本語(yǔ)法: Firefox (buggy) */
display: -ms-flexbox; /* 混合版本語(yǔ)法: IE 10 */
display: -webkit-flex; /* 新版本語(yǔ)法: Chrome 21+ */
display: flex; /* 新版本語(yǔ)法: Opera 12.1, Firefox 22+ */
}
.flex1 {
-webkit-box-flex: 1 /* OLD - iOS 6-, Safari 3.1-6 */
-moz-box-flex: 1; /* OLD - Firefox 19- */
-webkit-flex: 1; /* Chrome */
-ms-flex: 1 /* IE 10 */
flex: 1; /* NEW, Spec - Opera 12.1, Firefox 20+ */
}
算法 選擇排序
function selectionSort(arr) {
var len = arr.length;
var minIndex, temp;
for (var i = 0; i < len - 1; i++) {
minIndex = i;
for (var j = i + 1; j < len; j++) {
if (arr[j] < arr[minIndex]) { //尋找最小的數(shù)
minIndex = j; //將最小數(shù)的索引保存
}
}
temp = arr[i];
arr[i] = arr[minIndex];
arr[minIndex] = temp;
}
return arr;
}
二分查找算法
function binarySearch(data,item,start,end){
var end=end || data.length-1;
var start=start || 0;
var m=Math.floor((start+end)/2);
if(item === data[m]){
return m;
}else if(item<data[m]){
return binarySearch(data,item,start,m-1) //遞歸調(diào)用
}else{
return binarySearch(data,item,m+1,end);
}
return false;
}
歸并算法
function merge(left, right) {
var tmp = [];
while (left.length && right.length) {
if (left[0] < right[0])
tmp.push(left.shift());
else
tmp.push(right.shift());
}
return tmp.concat(left, right);
}
function mergeSort(a) {
if (a.length === 1)
return a;
var mid = ~~(a.length / 2)
, left = a.slice(0, mid)
, right = a.slice(mid);
return merge(mergeSort(left), mergeSort(right));
}
快速排序
const quickSort = (arr) => {
let left = 0;
let right = arr.length - 1;
whlie(left < right) {
while(arr[right] >= arr[0] && left < right){
right -= 1
}
while(arr[left] <= arr[0] && left < right) {
left++;
}
if (right === left) {
let mid=arr[right];
arr[right]=arr[0];
arr[0]=mid;
break;
}
// 當(dāng)左指針小于右指針的位置,交換兩個(gè)指針當(dāng)前位置的元素
let tem=arr[right];
arr[right]=arr[left];
arr[left]=tem;
}
return quickSort(arr.slice(0,left)).concat(arr.slice(left,right+1)).concat(quickSort(arr.slice(right+1)));
}
function _quickSort(num, left, right) {
if (left >= right) return; // 若左右指針相遇,待排序數(shù)組長(zhǎng)度小宇1,即遞歸的終點(diǎn),return(注意不能寫成left==right,這里left是有可能大于right的)。
var i = left, j = right, flag = left; // 定義可移動(dòng)的左右指針 i,j,定義flag為基數(shù)下標(biāo)。
while (i < j) { // 在i<j時(shí)不斷循環(huán),i一旦與j碰頭,則跳出循環(huán)。
while (num[j] >= num[flag] && j > flag) j--; // j不斷左移,找到在num[flag]右側(cè)且比它大的數(shù)。
if (i >= j) {
break; // 由于j可能已被改變,需再次判斷i與j是否碰頭。
}
while (num[i] <= num[flag] && i < j) i++; // i不斷右移,找到且比基數(shù)小的數(shù),且i不能與j碰頭。(由于兩次交換已合并,此處不需要使得i在flag左側(cè))
// num[flag] num[j] num[i]三者換位,可用ES6語(yǔ)法糖[num[flag],num[j],num[i]] = [num[j],num[i],num[flag]];
let temp = num[flag];
num[flag] = num[j];
num[j] = num[i];
num[i] = temp
flag = i; // 基數(shù)已經(jīng)在原num[i]的位置,flag同時(shí)也要賦值成i。
}
_quickSort(num, left, flag - 1); // 將flag左邊數(shù)組作為待排序數(shù)組,遞歸調(diào)用。
_quickSort(num, flag + 1, right); // 將flag右邊數(shù)組作為待排序數(shù)組,遞歸調(diào)用。
}
節(jié)流函數(shù)
function throttle(method,delay,duration){
var timer=null;
var begin=new Date();
return function(){
var context=this, args=arguments;
var current=new Date();
clearTimeout(timer);
if(current-begin>=duration){
method.apply(context,args);
begin=current;
}else{
timer=setTimeout(function(){
method.apply(context,args);
},delay);
}
}
}
// 函數(shù)消抖
function debounce(method,context){
clearTimeout(method.tId);
method.tId=setTimeout(function(){
method.call(context)
},300)
}
function debounce(method,delay){
var timer = null;
return function(){
var context = this,args = arguments;
clearTimeout(timer);
timer = setTimeout(function(){
method.apply(context,args);
},delay);
}
}
const throttle = (method, delay, duration) => {
const date = new Date();
let timer = null;
return function (...arg){
const current = new Date();
clearTimeOut(timer);
if(current - data >= duration){
method.apply(this, arg);
date = current;
}
timer = setTimeOut(() => {
method.apply(this, arg);
}, delay)
}
}
IndexOf的實(shí)現(xiàn)
function ArrayIndexOf(arr,value,n){
var i=isNaN(n)?0:n;//有第三參時(shí)
i=(i<0)?arr.length+i:i;//第三參為負(fù)數(shù)時(shí)
for(i;i<arr.length;i++){
if(arr[i]===value){return i;}
}return -1;
}