• Events (事件監聽、ready、自定義事件)
  • Array 陣列相關 (each, map, inArray, isArray)
  • Utils 功能型 (Date(), ParseJSON, trim())
  • AJAX (JSON, POST, Request)
  • 通用選擇器

  • JQ 選擇器才可使用 JQ方法,勿混用
  • JQ 可一次多選多個子元素並作處理
  • JS 使用doqsAll 需要迴圈去套用樣式、設置監聽或事件代理處理
  •   // JS
      document.querySelector('.')
      document.querySelectorAll('.')
      $('.test') 
    

    DOM選擇器

  • JQ限定 找首 $(el).first()
  •   // 找父
      $(el).parent();
      el.parentNode
      // JQ 找子,只找下一層
      $(el).children()
      // 回傳 NodeList 可先 Array.From() 轉成陣列
      el.children
      // 找子/後代
      $(el).find('li');
      el.querySelectorAll('li');
      // JQ 限定
      $(el).first()
      // 找兄弟
      $(el).siblings();
      Array.prototype.filter.call(el.parentNode.children, function(child){
        return child !== el;
      // 找上、下個兄弟節點
      $(el).prev();
      $(el).next();
      el.nextElementSibling
      el.previousElementSibling
    

    取得 HTML, 屬性, Style, Text

    HTML, 屬性, Style, Text

      // 設定 DOM 內容
      $(el).html(string)
      el.innerHTML = string
      // 取得 HTML
      $(el).html()
      el.innerHTML
      // 取得 Outer HTML (包含自己)
      $('<div>').append($(el).clone()).html();
      el.outerHTML
      // 取得屬性
      $(el).attr('color');
      el.getAttribute('color');
      // 設定屬性
      $(el).attr('tabindex', 3);
      el.setAttribute('tabindex', 3);
      // 取得Style 用-而非駝峰
      $(el).css('background-color')
      getComputedStyle(el)['background-color'];
      // 設定Style
      $(el).css('border-width', '20px');
      // 最好使用Class
      el.style.borderWidth = '20px';
      // 取得文字
      $(el).text();
      el.textContent
      // 設定文字
      $(el).text(string);
      el.textContent = string;
    

    CSS Class操作

  • IE9- 無法使用ClassList,相容寫法整理在下
  •   // JS
      el.classList.add('show')
      el.classList.remove('show')
      el.classList.toggle('show')
      el.classList.contains('show')
      $(el).addClass('show')
      $(el).removeClass('show')
      $(el).toggleClass('show')
      $(el).hasClass('show')
    
      // JS Add Class (IE8 寫法)
      if(el.classList) {
        el.classList.add(className)
      } else {
        el.className += ' ' + className
      // Has Class  (IE8 寫法)
      $(el).hasClass(className);
      if (el.classList) {
        el.classList.contains(className);
      } else {
        new RegExp('(^| )' + className + '( |$)', 'gi').test(el.className)
      // Remove Class (IE8 寫法)
      if (el.classList) {
        el.classList.remove(className);
      } else {
        el.className = el.className.replace(new RegExp('(^|\\b)' + className.split(' ').join('|') + '(\\b|$)', 'gi'), ' ');
      // Toggle Class (IE9+ 寫法)
      if (el.classList) {
        el.classList.toggle(className);
      } else {
        var classes = el.className.split(' ');
        var existingIndex = classes.indexOf(className);
        if (existingIndex >= 0)
          classes.splice(existingIndex, 1);
          classes.push(className);
        el.className = classes.join(' ');
    

    CSS 位置、大小 (取得/設定)

  • scrollTop [元素頂端和ViewPort最頂端之間的距離]
  • getBoundingClientRect() [Viewport 的 相對位置]
  • getComputedStyle() [計算運算後的元素各Style]
  • 上面幾個有空會寫一篇文整理一波

      // 取得位置
      $(el).position();
      {left: el.offsetLeft, top: el.offsetTop}
      // Viewport 的 相對位置
      var offset = el.offset();
        top: offset.top - document.body.scrollTop,
        left: offset.left - document.body.scrollLeft
      // JS
      el.getBoundingClientRect()
      // Outer Height
      $(el).outerHeight();
      el.offsetHeight
      // Outer Height + Margin
      $(el).outerHeight(true);
      function outerHeight(el) {
        var height = el.offsetHeight;
        var style = getComputedStyle(el);
        height += parseInt(style.marginTop) + parseInt(style.marginBottom);
        return height;
      outerHeight(el);
      // Outer Width
      $(el).outerWidth()
      el.offsetWidth
      // Outer Width + Margin 可與 上面的合併用帶入參數判斷
      $(el).outerWidth(true);
      function outerWidth(el) {
        var width = el.offsetWidth;
        var style = getComputedStyle(el);
        width += parseInt(style.marginLeft) + parseInt(style.marginRight);
        return width;
      outerWidth(el);
      // Offset
      $(el).offset();
      var rect = el.getBoundingClientRect();
        top: rect.top + document.body.scrollTop,
        left: rect.left + document.body.scrollLeft
      // Offset Parent
      $(el).offsetParent();
      el.offsetParent || el
    

    Effect (show/fade/fadeIn)

  • show / fade
  • fadeIn 原生寫法不是很懂
  • 動畫可用 animate.css + js 去給 Class 實現
  •   $(el).show()
      $(el).hide()
      el.style.display = ''
      el.style.display = 'none'
      $(el).fadeIn()
      function fadeIn(el) {
        el.style.opacity = 0
        var last = +new Date()
        var tick = function() {
          el.style.opacity = +el.style.opacity + (new Date() - last) / 400
          last = +new Date()
          if (+el.style.opacity < 1) {
            (window.requestAnimationFrame && requestAnimationFrame(tick)) || setTimeout(tick, 16)
        tick()
      fadeIn(el)
    

    DOM 操作 (刪除/改變/複製)

  • cloneNode 參數 true:深拷貝(含子) false:淺拷貝 (僅複製自身)
  • 複製後 還是要做插入的動作
  • 使用 clone 要注意是否會造成 一樣的ID 切記!!
  •   // 刪除子元素
      $(el).remove();
      // JS Old
      el.parentNode.removeChild(el);
      // JS IE 不支援
      el.remove()
      // 用 OO 取代自身
      $(el).replaceWith(string);
      el.outerHTML = string;
      // 複製節點
      $(el).clone();
      el.cloneNode(true);
      // 清空父元素之下
      $(el).empty()
      el.innerHTML = ''
    

    DOM 操作 (判斷)

  • 判斷節點是否符合
  • 判斷節點是否符合選擇器
  • 判斷子是否存在
  • 判斷子是否為其子元素
  •   // 判斷節點是否符合
      $(el).is($(otherEl));
      el === otherEl
      if (e.target.classList.contains('')) { }
      if (e.target.tagName.toLowerCase() === 'a') {}
      // 判斷節點是否符合選擇器
      $(el).is('.my-class');
      var matches = function(el, selector) {
        return (el.matches || el.matchesSelector || el.msMatchesSelector || el.mozMatchesSelector || el.webkitMatchesSelector || el.oMatchesSelector).call(el, selector);
      matches(el, '.my-class');
      // 判斷子是否存在
      $(el).find(selector).length;
      el.querySelector(selector) !== null
      // 判斷子是否為其子元素
      $.contains(el, child);
      if((el !== child) && el.contains(child))
    

    DOM 操作 (建立/插入/順序)

  • insertAdjacentHTML DOM插入萬金油
  • JS creatElement('p')
  • JS prepend / append (同JQ寫法,但IE不支援)
  • prepend / append 若元素存在,會進行移動
  • JS appendChild / insertBefore (IE支援版)
  •   // JS 建立元素
      document.creatElement('p')
      // 插入前
      $(parent).prepend(el);
      // JS OLD
      parent.insertBefore(el, parent.firstChild);
      // JS IE不支援
      el.prepend()
      // 插入父元素下
      $(parent).append(el);
      // JS OLD
      parent.appendChild(el);
      // JS IE不支援
      el.append()
      // 插入其前、後
      $(el).after(htmlString)
      $(el).before(htmlString)
    

    insertAdjacentHTML (DOM插入萬金油)

  • 動作有四種(設定position參數)
  • beforebegin: 加在 elem 之前
  • afterbegin: 加在 elem 裡面,首個子元素之前
  • beforeend: 加在 elem 裡面,末個子元素之後
  • afterend: 加在 elem 之後
  •   el.insertAdjacentHTML( position , htmlString)
    

    DOM 操作 (迴圈執行)

      // 迴圈執行
      $(selector).each(function(i, el){ });
      const elements = document.querySelectorAll(selector);
      Array.prototype.forEach.call(elements, function(el, i){  });
      // 符合的元素才執行
      $(selector).filter(filterFn)
      Array.prototype.filter.call(document.querySelectorAll(selector), filterFn)
    

    Events

  • on off 事件監聽 掛載 & 移除
  • 自定義事件 沒用過 (求放過...)
  • 關鍵字搜尋 Trigger Custom / Trigger Native

      // on off 事件監聽
      $(el).on('click', Func)
      el.addEventListener('click', Func)
      $(el).off('click', Func)
      el.removeEventListener('click', Func)
      // Ready
      $(document).ready(function(){ })
      // 作者 ready
      function ready(fn) {
        if (document.attachEvent ? document.readyState === "complete" : document.readyState !== "loading"){
        } else {
          document.addEventListener('DOMContentLoaded', fn)
      // 個人寫法
      ;(function () {
        document.addEventListener('DOMContentLoaded', () => {})
    

    Array 陣列相關

  • forEach / filter / map
  • $.grep 等同 ES6 Filter
  • inArray 找 Array 內的內容
  • isArray 判斷是否為陣列
  • LearnMore 可以看看我撰寫的其他篇陣列整理
      // 判斷是否為陣列
      $.isArray(arr)
      Array.isArray(arr)
      $.each(arr, function(i, item){ })
      arr.forEach(function(item, i){ })
      $.map(arr, function(value, index){ })
      arr.map(function(value, index){ })
      // 找項目
      $.inArray(item, arr)
      // indexOf 回傳-1表找不到
      arr.indexOf(item)
    

    Utils 功能型

  • 時間 Now
  • Parse JSON
  • trim 字串去除前後的空白
  • P.S. 其他看不是很懂 待補.....
    Bind, Deep Extend, Extend, Parse Html, Type

      // 時間 Now
      $.now()
      Date.now()
      // Parse JSON
      $.parseJSON(string)
      JSON.parse(string)
      // Trim
      $.trim(string)
      string.trim()
    
  • 原生 JS 用 XMLHttpRequest 支援度最高
  • 推薦使用 axios
        // JS XHR 範例
        getData('https://jsonplaceholder.typicode.com/users')
        function getData(url) {
          const xhr = new XMLHttpRequest()
          xhr.open('GET', url, true)
          // onreadystatechange & onload 則一即可
          xhr.onload = function () {
            if (xhr.status === 200) {
              console.log(this.responseText)
          xhr.onreadystatechange = function () {
            if (this.readyState === 4 && this.status === 200) {
              console.table(JSON.parse(this.responseText))
            } else if (this.status === 404) {
              console.log('Not Found')
          xhr.onerror = function () {
            console.log('Request Error...')
          xhr.send()
    
      // JSON
      $.getJSON('/my/url', function(data) { })
      // JS 使用 XHR
      // POST
      $.ajax({
        type: 'POST',
        url: '/my/url',
        data: data
      // JS XHR
      const request = new XMLHttpRequest()
      request.open('POST', '/my/url', true)
      request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded charset=UTF-8')
      request.send(data)
      // Request
      $.ajax({
        type: 'GET',
        url: '/my/url',
        success: function(resp) { },
        error: function() { }
      // JS 使用 XHR
    

    YOU MIGHT NOT NEED JQUERY
    jQuery Cheat Sheet

  •