jQuery方法實現

来源:http://www.cnblogs.com/unclekeith/archive/2017/08/02/7275049.html
-Advertisement-
Play Games

children 原生JavaScript中,如果希望找到某個元素的子元素,只能通過Node類型上的children方法一步一步獲取。如 這種方法很不好,因為js和html並未解耦,當html結構發生改變時,js也需要發生相應的變化。 jQuery有一個children方法,可以傳入一個參數,此時會 ...


children

原生JavaScript中,如果希望找到某個元素的子元素,只能通過Node類型上的children方法一步一步獲取。如

let li = document.querySelector('ul').children[0].
let anchor = li.children[0]
...

這種方法很不好,因為js和html並未解耦,當html結構發生改變時,js也需要發生相應的變化。

jQuery有一個children方法,可以傳入一個參數,此時會返回需要查找到的那個元素。具體用法children用法

下麵是我實現的類children的方法,實現原理是:遞歸回調children函數,當兩個DOM節點相等時,就返回該節點。否則返回null,表示找不到。

childrens (ele, selector) {
  let [target, child, isChild, isChildList, i] = []
  target = ele instanceof Object ? ele : document.querySelector(ele)
  child = target.querySelector(selector)
  isChildList = target.children
  for (i = 0; i < isChildList.length; i++) {
    isChild = isChildList[i]
    if (isChild === child) {
      return isChild
    }
    if (isChild.children.length >= 1) {
      // 遞歸回調children函數,遞歸的原因是某個子節點可能還存在一個或多個子節點。
      isChild = this.childrens(isChild, selector)
      return isChild
    }
  }
  return null
}

$.extend()實現深淺複製

function copyObject () {
    let i = 1,
        target = arguments[0] || {},
        deep = false,
        length = arguments.length,
        name, options, src, copy,
        copyIsArray, clone;

    // 如果第一個參數的數據類型是Boolean類型
    // target往後取第二個參數
    if (typeof target === 'boolean') {
        deep = target;
        // 使用||運算符,排除隱式強制類型轉換為false的數據類型
        // 如'', 0, undefined, null, false等
        // 如果target為以上的值,則設置target = {}
        target = arguments[1] || {};
        i++;
    }

    // 如果target不是一個對象或數組或函數
    if (typeof target !== 'object' && !(typeof target === 'function')) {
        target = {};
    }

    // 如果arguments.length === 1 或
    // typeof arguments[0] === 'boolean',
    // 且存在arguments[1],則直接返回target對象
    if (i === length) {
        return target;
    }

    // 迴圈每個源對象
    for (; i < length; i++) {
        // 如果傳入的源對象是null或undefined
        // 則迴圈下一個源對象
        if (typeof (options = arguments[i]) != null) {
            // 遍歷所有[[emuerable]] === true的源對象
            // 包括Object, Array, String
            // 如果遇到源對象的數據類型為Boolean, Number
            // for in迴圈會被跳過,不執行for in迴圈
            for (name in options) {
                // src用於判斷target對象是否存在name屬性
                src = target[name];
                // copy用於複製
                copy = options[name];
                // 判斷copy是否是數組
                copyIsArray = Array.isArray(copy);
                if (deep && copy && (typeof copy === 'object' || copyIsArray)) {
                    if (copyIsArray) {
                        copyIsArray = false;
                        // 如果目標對象存在name屬性且是一個數組
                        // 則使用目標對象的name屬性,否則重新創建一個數組,用於複製
                        clone = src && Array.isArray(src) ? src : [];
                    } else {
                        // 如果目標對象存在name屬性且是一個對象
                        // 則使用目標對象的name屬性,否則重新創建一個對象,用於複製
                        clone = src && typeof src === 'object' ? src : {};
                    }
                    // 深複製,所以遞歸調用copyObject函數
                    // 返回值為target對象,即clone對象
                    // copy是一個源對象
                    target[name] = copyObject(deep, clone, copy);
                } else if (copy !== undefined){
                    // 淺複製,直接複製到target對象上
                    target[name] = copy;
                }
            }
        }
    }
    // 返回目標對象
    return target;
}

期待噢:)

持續更新中...


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前段時間在利用工作之餘開發了tomato timer這個蕃茄鐘,然後部署到github.io上,由於greatway太厲害,偶爾會有打不開的情況。上周末對比做了擴展和改進,使其成為chrome的插件,或者成為桌面app。 chrome插件的使用與開發 一、如何安裝與使用: 1、下載tomato ti ...
  • 上一節我們學習瞭如何用路徑繪製各種形狀,但我們只能用預設的顏色和線條。這節就來學習設置不同的顏色和線條樣式。 顏色 設置顏色主要有兩個屬性: fillStyle = color 設置填充顏色 strokeStyle = color 設置描邊顏色 顏色值可以用十六進位也可以用一些內置的顏色字元,還可以 ...
  • 當設置canvas的寬度和高度時,只有內嵌css有效,外部css會出現拉伸的情況,例如: 顯示情況如下: 該效果與我們預想的不同,此時有兩種修改方案: (1)在代碼js中添加設置寬高屬性的代碼設置寬度和高度: (2)除去外部css中設置寬高屬性的代碼,給canvas標簽直接添加寬度和高度屬性: 最後 ...
  • 平穩退化和漸進增強原則平穩退化 : 如果正確的使用了JavaScript腳本,就可以讓訪問者在他們的瀏覽器不支持JavaScript的情況下仍能順利的瀏覽你的網站。 這就是所謂的平穩退化(graceful degradation),就是說,雖然某些功能無法使用,但最基本的操作仍能順利完成。漸進增強: ...
  • 在項目開發過程中,我們經常會碰到通過介面返回一個地址,同時在新的tab頁面打開一個網址的情況,最直觀的想法就是通過window.open(url)的方式,打開一個新的頁面,但是大部分瀏覽器會遭遇攔截。因為大部分現代的瀏覽器(泛指 Chrome / Firefox / IE 10+ / Safari) ...
  • 在項目中,經常會遇到多個相互依賴的非同步請求。如有a,b,c三個ajax請求,b需要依賴a返回的數據,c又需要a和b請求返回的數據。如果採用請求嵌套請求的方式自然是不可取的。導致代碼難以維護,如何請求很多。會出現很多問題。 Promise就是解決多個非同步請求的問題。 Promise是ES6提供的一個對 ...
  • 一,單個文件的上傳 1.html/jsp頁面 2.過濾器解決中文亂碼問題 package com.ser; import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; impor ...
  • 參考資料:http://www.cnblogs.com/shaoting/p/7148240.html 下一個項目公司也打算使用react native.大致看了下原型設計,寫幾個小demo先試試水.特此記錄下. 1.微信及朋友圈分享.QQ及朋友圈分享,微博分享,微信支付,支付寶支付. 2.導航條漸 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...