最後更新於2019年1月13日
前端經常使用代碼片斷(一) 點這裏
前端經常使用代碼片斷(二) 點這裏
前端經常使用代碼片斷(三) 點這裏
前端經常使用代碼片斷(四) 點這裏
前端經常使用代碼片斷(五) 點這裏
前端經常使用代碼片斷(六) 點這裏javascript
方法1: (ES5)css
function unique(a) { var res = []; for (var i = 0, len = a.length; i < len; i++) { var item = a[i]; (res.indexOf(item) === -1) && res.push(item); } return res; } var a = [1, 1, '1', '2', 1]; var ans = unique(a); console.log(ans); // => [1, "1", "2"]
或html
function unique(a) { var res = a.filter(function(item, index, array) { return array.indexOf(item) === index; }); return res; } var a = [1, 1, '1', '2', 1]; var ans = unique(a); console.log(ans); // => [1, "1", "2"]
方法2: (ES6)前端
Set 以及 Array.from 方法:java
function unique(a) { return Array.from(new Set(a)); } var a = [{name: "hanzichi"}, {age: 30}, new String(1), new Number(1)]; var ans = unique(a); console.log(ans); // => [Object, Object, String, Number]
typeof {} === 'object' // true typeof 'a' === 'string' // true typeof 1 === number // true // But.... typeof [] === 'object' // true
若是你想知道你的變量是否是數組,你仍然能夠用Array.isArray(myVar)
jquery
原始數據 (原始值、原始數據類型)不是一種 object 類型而且沒有本身的方法的。在 JavaScript 中,有六種原始數據類型:string,number,boolean,null,undefined,symbol (new in ECMAScript 2015)。web
var a = [1,2,3,4,3]; var b = [4,5,6,7]; var c = a.map(function(v, i){ return v + (b[i] || 0); }); console.log(c); 第二種考慮兼容 var a=[1,2,3,4,5]; var b=[6,7,8,9]; var c=[]; for (var i=0;i<a.length;i++){ c[i]=a[i]+(b[i]||0); } console.log(c);//[7, 9, 11, 13, 5]
經過Array.prototype.push.apply
方法將一個數組插入到另一個數組ajax
var a = [1,2,3]; var b = [4,5,6]; Array.prototype.push.apply(a, b); console.log(a); // [1, 2, 3, 4, 5, 6]
Javascript 的sort()函數在默認狀況下使用字母數字(字符串Unicode碼點)排序。正則表達式
因此json
[1,2,5,10].sort() //會輸出 [1, 10, 2, 5]
要正確的排序一個數組, 你能夠用
[1,2,5,10].sort((a, b) => a — b) //會輸出 從小到大排序 [1, 2, 5, 10]
從大到小排序即
[1,2,5,10].sort((a, b) => b-a)
let s = "bob" const replaced = s.replace('b', 'l') replaced === "lob" s === "bob"
我以爲這是一件好事,由於我不喜歡函數改變它們的輸入。 你還應該知道 replace 只會替換第一個匹配的字符串:
若是你想替換全部匹配的字符串,你可使用帶/g標誌的正則表達式 :
"bob".replace(/b/g, 'l') === 'lol' // 替換全部匹配的字符串
// These are ok 'abc' === 'abc' // true 1 === 1 // true // These are not [1,2,3] === [1,2,3] // false {a: 1} === {a: 1} // false {} === {} // false
緣由:[1,2,3]和[1,2,3]是兩個獨立的數組。它們只是剛好包含相同的值。它們具備不一樣的引用,沒法用===
相比較。
const Greeters = [] for (var i = 0 ; i < 10 ; i++) { Greeters.push(function () { return console.log(i) }) } Greeters[0]() // 10 Greeters[1]() // 10 Greeters[2]() // 10
你是否是認爲它會輸出 0, 1, 2… ? 你知道它爲何不是這樣輸出的嗎? 你會怎樣修改讓它輸出 0, 1, 2… ?
這裏有兩種可能的解決方法:
let和var的不一樣在於做用域。var的做用域是最近的函數塊,let的做用域是最近的封閉塊,封閉塊能夠小於函數塊(若是不在任何塊中,則let和var都是全局的)。(來源)
Greeters.push(console.log.bind(null, i))
<input type="text" id="copytest"/> <input type="button" value="複製" onclick="clickBtn()"/> function clickBtn(){ // 獲取 input 元素 var input = document.querySelector('#copytest'); //或 var input = document.getElementById('copytest'); input.focus(); input.select(); // 執行復制命令 document.execCommand('Copy') }
核心代碼 document.execCommand() 方法, 該方法的大概用途是 對選中區域 進行一些操做
html部分:
<textarea id="text_txt1"></textarea> <span id ="num_txt1">剩餘可輸入600字</span>
js部分:
function changeLength(obj,num){ obj.on('keyup',function(){ var txtval = obj.val().length; //console.log(txtval); var str = parseInt(600-txtval); //console.log(str); if(str > 0 ){ num.html('剩餘可輸入'+str+'字'); }else { num.html('剩餘可輸入0字'); obj.val(obj.val().substring(0, 600)); } //console.log($('#num_txt').html(str)); }); } $(function(){ //我這裏有四個,因此調用4次 changeLength($('#text_txt1'),$('#num_txt1')); changeLength($('#text_txt2'),$('#num_txt2')); changeLength($('#text_txt3'),$('#num_txt3')); changeLength($('#text_txt4'),$('#num_txt4')); });
//html <button id="btn">click</button> var btn=document.getElementById('btn');
//js 第一種: btn.onclick=function(){ alert('hello world'); } //消除事件 btn.onclick=null;//就不會彈出框了
//js 第二種: btn.addEventListener('click',function(){ alert('hello world') },false); btn.addEventListener('click',function(){ alert(this.id) },false);
//js 第三種: function demo(){ alert('hello'); } <button id="btn" onclick="demo()">click</button>
js觸發按鈕點擊事件
模擬JS觸發按鈕點擊功能
<html> <head> <title>usually function</title> </head> <script> function load(){ //下面兩種方法效果是同樣的 document.getElementById("target").onclick(); document.getElementById("target").click(); } function test(){ alert("test"); } </script> <body onload="load()"> <button id="target" onclick="test()">test</button> </body> <html> //備註: //btnObj.click()是真正地用程序去點擊按鈕,觸發了按鈕的onclick()事件 //btnObj.onclick()只是簡單地調用了btnObj的onclick所指向的方法, //只是調用方法而已,並未觸發事件
.clearfix display :inline-block &:after display :block content:"." height:0 line-height: 0 clear :both visibility :hidden
不少商品評價中都會涉及評分,再根據評分計算星星個數
現介紹一種方法:
每一個都是單個星星,分爲三種.png圖
const LENGTH = 5;//星星個數 const CLS_ON = 'on';//所有選中星星的classNmae const CLS_HALF = 'half';//半個選中的classNmae const CLS_OFF = 'off';//未選中的classNmae let result = []; let score = Math.floor(this.score * 2) / 2; //計算評分,如4.7會計算成4.5分,4.3會計算成4分 let hasDecimal = score % 1 !== 0; //計算是否存在半顆星 let integer = Math.floor(score); //計算有幾個徹底選中的星星 for (let i = 0; i < integer; i++) { result.push(CLS_ON);//數組中添加所有選中星星的classNmae }; if (hasDecimal) { result.push(CLS_HALF);//數組中添加半顆星星的classNmae }; while (result.length < LENGTH) { result.push(CLS_OFF);//數組中補充未點亮星星的classNmae }; return result;//返回數組
相似下圖效果
window.onbeforeunload=function (){ var warning = "請確認保存後再退出哦!"; return warning; } //注:如今不能彈出自定義的信息,暫時不知道緣由, //後續會追蹤這個問題(若是你知道能夠留下評論) //關閉頁面時的一些清楚緩存,ajax退出登陸等操做能夠寫在函數裏
import originJSONP from 'jsonp' // 封裝的 jsonp 函數 export default function jsonp(url, data, options) { url += (url.indexOf('?') < 0 ? '?' : '&') + param(data) return new Promise((resolve, reject) => { originJSONP(url, options, (err, data) => { if(!err) { resolve(data) } else { reject(err) } }) }) } // url 拼接函數 function param(data) { let url = '' for(let k in data) { let value = data[k] !== undefined ? data[k] : '' url += `&${k}=${encodeURIComponent(value)}` } return url ? url.substring(1) : '' }
在firefox中 默認頁面不超過一頁是沒有滾動條的 加入頁面中某些元素會臨時改變頁面高度 好比用了toolTip 之類的提示小工具 就會出現滾動條時有時無 致使頁面抖動
解決方法: 添加css代碼
body{ overflow: -moz-scrollbars-vertical; }
let elementStyle = document.createElement('div').style // 主流瀏覽器內核 let vendor = (() => { let transfromNames = { webkit: 'webkitTransform', Moz: 'MozTransform', ms: 'msTransform', O: 'OTransform', standard: 'transform' } for (let key in transfromNames) { if (elementStyle[transfromNames[key]] !== undefined) { return key } } return false })() // 添加樣式的瀏覽器前綴 export function prefixStyle(style) { if (vendor === false) { return false } if (vendor === 'standard') { return style } return vendor + style.charAt(0).toUpperCase() + style.substr(1) }
// 爲元素添加類名 export function addClass(el, className) { // 先判斷一下元素是否含有須要添加的類名,有則直接 return if (hasClass(el, className)) { return } // 把該元素含有的類名以空格分割 let newClass = el.className.split(' ') // 把須要的類名 push 進來 newClass.push(className) // 最後以空格拼接 el.className = newClass.join(' ') } // 判斷是否有要查看的 className,有則返回true,不然返回 false export function hasClass(el, className) { let reg = new RegExp('(^|\\s)' + className + '(\\s|$)') return reg.test(el.className) }
export function getData(el, name, val) { const prefix = 'data-' name = prefix + name if (val) { return el.setAttribute(name, val) } else { console.log('el.getAttribute(name)', el.getAttribute(name)) return el.getAttribute(name) } }
描述:採用基於jq的datatables(兼容ie8) 主要功能:基本配置,服務端分頁,清楚緩存,刷新等 /************************表格刷新*****************************/ $("#searchFormBtn").click(function () { tablebyGroup.ajax.reload(); }); function queryUserByGroup() { tablebyGroup = $('#workArr').DataTable({ destroy: true, serverSide: true, //啓用服務器端分頁 searching: false, //禁用原生搜索 orderMulti: false, //啓用多列排序 order: [], //取消默認排序查詢,不然複選框一列會出現小箭頭 renderer: "bootstrap", //渲染樣式:Bootstrap和jquery-ui pagingType: "simple_numbers", //分頁樣式:simple,simple_numbers,full,full_numbers iDisplayLength:100, ajax: function (data, callback, settings) { var selected = $('#selectWorkArr').val(); var param = { depId: parseInt(selected), docId: JSON.parse($.cookie('userinfo')).docId }; //ajax請求數據 $.ajax({ type: "post", url: serverIp + "rest/doctor/selectWorkGroup?" + Math.random() + "&" + maiyaBuildParam(param), cache: false, //禁用緩存 // data: JSON.stringify(param), //傳入組裝的參數 // contentType: "application/json; charset=utf-8", dataType: "json", success: function (result) { var returnData = {}; returnData.draw = data.draw;//這裏直接自行返回了draw計數器,應該由後臺返回 returnData.recordsTotal = result.data.length;//返回數據所有記錄 returnData.recordsFiltered = result.data.length;//後臺不實現過濾功能,每次查詢均視做所有結果 returnData.data = result.data;//返回的數據列表 //調用DataTables提供的callback方法,表明數據已封裝完成並傳回DataTables進行渲染 //此時的數據需確保正確無誤,異常判斷應在執行此回調前自行處理完畢 callback(returnData); }, error: function(msg) { alert(msg.message || '查詢失敗') } }); }, bFilter: false,//去掉搜索框方法 bLengthChange: false, //去掉每頁顯示多少條數據方法 "ordering": false,//禁止排序 "columns": [ {"data": "pName"}, {"data": "pSex"}, {"data": "strBirthDate"}, {"data": "pCardNum"}, {"data": "pPhone"}, {"data": "cName"}, {"data": "pActivited"} ], paging: false, "columnDefs": [{ "render": function(data, type, row, meta) { //渲染 把數據源中的標題和url組成超連接 return '<a href="javascript:showStatistics(' + row.pId +','+ row.pActivited + ');" style="color:blue;text-decoration: underline">'+data+'</a>'; }, //指定是第1列 "targets": 0 },{ "render": function(data, type, row, meta) { return data == 1 && '男' || '女'; }, //指定是第1列 "targets": 1 },{ "render": function(data, type, row, meta) { return data == 1 && '已註冊' || '未註冊'; }, //指定是第1列 "targets": 6 }] }); }
引用: