前端經常使用代碼片斷(二)

最後更新於2019年1月13日

前端經常使用代碼片斷(一) 點這裏
前端經常使用代碼片斷(二) 點這裏
前端經常使用代碼片斷(三) 點這裏
前端經常使用代碼片斷(四) 點這裏
前端經常使用代碼片斷(五) 點這裏
前端經常使用代碼片斷(六) 點這裏javascript


1.數組去重

方法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]

2.數組不是原始數據類型

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


3.兩個數組內的元素相加

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]

4.一個數組插入到另外一個數組

經過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]

5.數字排序

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)

6.replace替換字符串

let s = "bob"
const replaced = s.replace('b', 'l')
replaced === "lob"
s === "bob"

我以爲這是一件好事,由於我不喜歡函數改變它們的輸入。 你還應該知道 replace 只會替換第一個匹配的字符串:

若是你想替換全部匹配的字符串,你可使用帶/g標誌的正則表達式 :

"bob".replace(/b/g, 'l') === 'lol' // 替換全部匹配的字符串

7. 比較的時候要注意

// 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]是兩個獨立的數組。它們只是剛好包含相同的值。它們具備不一樣的引用,沒法用===相比較。


8. 閉包

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. Boom. 解決了.
let和var的不一樣在於做用域。var的做用域是最近的函數塊,let的做用域是最近的封閉塊,封閉塊能夠小於函數塊(若是不在任何塊中,則let和var都是全局的)。(來源)
  • 替代方法: 用 bind:
Greeters.push(console.log.bind(null, i))

9.當點擊 複製 按鈕的時候, 將選中的文字複製到粘貼板上

clipboard.png

<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() 方法, 該方法的大概用途是 對選中區域 進行一些操做


10.JS獲取textarea中剩餘字數

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'));
});

11.js中的點擊事件

//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所指向的方法,
//只是調用方法而已,並未觸發事件

12.清除浮動clearfix一種寫法(stylus)

.clearfix
  display :inline-block
  &:after
    display :block
    content:"."
    height:0
    line-height: 0
    clear :both
    visibility :hidden

13.星星評分計算

不少商品評價中都會涉及評分,再根據評分計算星星個數

clipboard.png

現介紹一種方法:

每一個都是單個星星,分爲clipboard.pngclipboard.pngclipboard.png三種.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;//返回數組

14.關閉頁面彈框提示

相似下圖效果
clipboard.png

window.onbeforeunload=function (){
   var warning = "請確認保存後再退出哦!";
   return warning;
}
//注:如今不能彈出自定義的信息,暫時不知道緣由,
//後續會追蹤這個問題(若是你知道能夠留下評論)
//關閉頁面時的一些清楚緩存,ajax退出登陸等操做能夠寫在函數裏

15.封裝jsonp

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) : ''
}

16.firefox 加入toolTip提示信息後 頁面抖動

在firefox中 默認頁面不超過一頁是沒有滾動條的 加入頁面中某些元素會臨時改變頁面高度 好比用了toolTip 之類的提示小工具 就會出現滾動條時有時無 致使頁面抖動

clipboard.png

解決方法: 添加css代碼

body{
  overflow: -moz-scrollbars-vertical;
}

17.判斷遊覽器內核,自動添加前綴實現css屬性兼容

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)
}

18.添加className

// 爲元素添加類名
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)
}

19.獲取或設置data- 屬性

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)
  }
}

20.基於jq的datatables(兼容ie8)基本配置

描述:採用基於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
                }]
            });
        }
引用:

誰說Javascript簡單的? – Hacker Noon

相關文章
相關標籤/搜索