最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JavaScript獲取本機IP地址的實現(xiàn)方法

 更新時間:2025年10月29日 09:45:48   作者:多行不易  
JavaScript本身受限于瀏覽器安全機制無法直接獲取本機IP,但可通過WebRTC、Ajax請求等間接方式獲取公網(wǎng)IP,本文介紹了多種使用JS獲取IP的方法,需要的朋友可以參考下

引言

JavaScript本身受限于瀏覽器安全機制無法直接獲取本機IP,但可通過WebRTC、Ajax請求等間接方式獲取公網(wǎng)IP。本文介紹了多種使用JS獲取IP的方法,包括WebRTC API、跨域請求服務(wù)、Flash插件(已淘汰)、Web Workers和User Agent分析,并強調(diào)了在實際應(yīng)用中需注意用戶隱私與合規(guī)性問題。

js得到本機IP

1. JavaScript獲取本機IP的可行性分析

在瀏覽器環(huán)境中,JavaScript直接獲取本地IP地址面臨多重技術(shù)與安全限制。瀏覽器出于安全和隱私保護的考慮,限制了前端腳本對底層網(wǎng)絡(luò)信息的訪問權(quán)限。例如,傳統(tǒng)的 window 對象和 navigator 對象并未提供直接獲取本機IP地址的API接口。

此外,同源策略(Same-Origin Policy)也進一步限制了跨域數(shù)據(jù)訪問,防止惡意腳本竊取敏感信息。因此,JavaScript無法像在本地系統(tǒng)中那樣通過網(wǎng)絡(luò)接口直接讀取IP地址。

盡管如此,通過WebRTC、遠(yuǎn)程HTTP請求等技術(shù)手段,仍可以在一定程度上間接獲取用戶的公網(wǎng)IP地址。后續(xù)章節(jié)將圍繞這些方法展開具體實現(xiàn)與分析。

2. WebRTC API獲取公網(wǎng)IP的實現(xiàn)

WebRTC(Web Real-Time Communication)是一種在瀏覽器中實現(xiàn)點對點實時通信的技術(shù),其核心在于建立直接的網(wǎng)絡(luò)連接,繞過中間服務(wù)器,從而實現(xiàn)高效的音視頻傳輸。然而,除了用于音視頻通信之外,WebRTC 還提供了一種可以獲取客戶端公網(wǎng) IP 地址的方式。這一特性在特定場景下非常有用,例如用戶身份識別、地理位置推斷、P2P 通信等。

本章將深入探討如何利用 WebRTC API 實現(xiàn)公網(wǎng) IP 的獲取,包括其底層技術(shù)原理、具體實現(xiàn)步驟、兼容性分析以及潛在的局限性與風(fēng)險。我們將通過代碼示例、流程圖和參數(shù)說明,幫助開發(fā)者理解并掌握這項技術(shù)。

2.1 WebRTC技術(shù)原理概述

WebRTC 是一套瀏覽器原生支持的實時通信協(xié)議棧,它允許瀏覽器之間直接進行數(shù)據(jù)傳輸。WebRTC 的核心模塊包括音視頻采集、編解碼、網(wǎng)絡(luò)傳輸?shù)?。其中,網(wǎng)絡(luò)傳輸部分依賴于 ICE(Interactive Connectivity Establishment)協(xié)議來建立連接,這一過程涉及 STUN(Session Traversal Utilities for NAT)和 TURN(Traversal Using Relays around NAT)服務(wù)器的協(xié)助。

2.1.1 WebRTC的網(wǎng)絡(luò)協(xié)商機制

WebRTC 的網(wǎng)絡(luò)協(xié)商機制主要包括以下幾個步驟:

  1. 創(chuàng)建 RTCPeerConnection :建立連接的基礎(chǔ)對象。
  2. 生成 Offer/Answer SDP :通過 createOffer() 或 createAnswer() 生成會話描述協(xié)議(Session Description Protocol)。
  3. ICE Candidate 收集 :在連接建立過程中,收集本地和遠(yuǎn)程的 ICE 候選地址。
  4. 設(shè)置遠(yuǎn)程描述與添加候選地址 :將遠(yuǎn)程 SDP 設(shè)置到本地連接中,并添加遠(yuǎn)程 ICE 候選地址。
  5. 連接建立成功 :當(dāng) ICE 協(xié)商完成,連接建立成功。
WebRTC ICE協(xié)商流程圖(mermaid格式):
graph TD
    A[創(chuàng)建 RTCPeerConnection] --> B[生成 Offer SDP]
    B --> C[設(shè)置本地描述]
    C --> D[開始 ICE 候選地址收集]
    D --> E[獲取 ICE 候選地址]
    E --> F[通過信令服務(wù)器交換 Offer/Answer]
    F --> G[設(shè)置遠(yuǎn)程描述]
    G --> H[添加遠(yuǎn)程 ICE 候選地址]
    H --> I[ICE 連接建立成功]

2.1.2 ICE協(xié)議與NAT穿透原理

ICE(Interactive Connectivity Establishment)是一種用于建立點對點連接的協(xié)議框架,它結(jié)合了 STUN 和 TURN 技術(shù),幫助 WebRTC 在存在 NAT(Network Address Translation)的情況下建立連接。

  • STUN(Session Traversal Utilities for NAT) :用于發(fā)現(xiàn)客戶端的公網(wǎng) IP 和端口。
  • TURN(Traversal Using Relays around NAT) :當(dāng)直接連接失敗時,使用中繼服務(wù)器進行數(shù)據(jù)轉(zhuǎn)發(fā)。

NAT穿透原理簡述:

  • 客戶端通過 STUN 服務(wù)器獲取自己的公網(wǎng) IP 地址和端口。
  • 客戶端將這些信息作為 ICE 候選地址發(fā)送給對方。
  • 對方嘗試通過這些候選地址與本端建立連接。
  • 如果無法直接連接,則通過 TURN 服務(wù)器中繼通信。

2.2 使用WebRTC獲取本地公網(wǎng)IP

利用 WebRTC 獲取公網(wǎng) IP 的核心思想是:通過創(chuàng)建一個 RTCPeerConnection 對象,監(jiān)聽其 icecandidate 事件,從中提取出公網(wǎng) IP 地址。這種方法不依賴任何第三方服務(wù),也不需要用戶授權(quán),是一種相對輕量級的獲取方式。

2.2.1 創(chuàng)建RTCPeerConnection對象

在 WebRTC 中, RTCPeerConnection 是連接的核心對象。我們可以通過以下代碼創(chuàng)建它:

const configuration = {
    iceServers: [
        { urls: "stun:stun.l.google.com:19302" } // 使用 Google 的公共 STUN 服務(wù)器
    ]
};
 
const pc = new RTCPeerConnection(configuration);

參數(shù)說明:

  • iceServers :配置 ICE 服務(wù)器地址,其中 stun.l.google.com:19302 是 Google 提供的公共 STUN 服務(wù)。
  • RTCPeerConnection :用于建立點對點連接的核心對象。

2.2.2 獲取ICE候選地址并解析IP

當(dāng) ICE 候選地址生成時,會觸發(fā) icecandidate 事件。我們可以通過監(jiān)聽該事件來獲取候選地址信息:

pc.onicecandidate = (event) => {
    if (event.candidate) {
        const candidate = event.candidate.candidate;
        console.log("ICE Candidate:", candidate);
 
        // 使用正則表達式提取 IP 地址
        const ipRegex = /([0-9]{1,3}(\.[0-9]{1,3}){3})|(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4})/;
        const match = candidate.match(ipRegex);
        if (match) {
            const ipAddress = match[0];
            console.log("檢測到公網(wǎng)IP地址:", ipAddress);
        }
    }
};
 
// 創(chuàng)建 Offer 并設(shè)置本地描述以觸發(fā) ICE 候選地址生成
pc.createOffer()
    .then(offer => pc.setLocalDescription(offer))
    .catch(err => console.error("創(chuàng)建 Offer 出錯:", err));

代碼邏輯分析:

  1. 監(jiān)聽 icecandidate 事件 :每當(dāng) ICE 候選地址生成時,事件對象中會包含 candidate 字段。
  2. 解析候選地址字符串 :每個 ICE 候選地址中都包含 IP 地址信息,我們通過正則表達式提取出來。
  3. 區(qū)分公網(wǎng)IP與局域網(wǎng)IP :根據(jù)候選地址的類型(如 host、srflx、relay),我們可以判斷該 IP 是否為公網(wǎng) IP。
  4. 創(chuàng)建 Offer 并設(shè)置本地描述 :觸發(fā) ICE 候選地址的生成。

2.2.3 兼容性與瀏覽器支持情況

WebRTC 是現(xiàn)代瀏覽器的標(biāo)準(zhǔn)功能,但不同瀏覽器對 ICE 候選地址的返回格式略有不同。以下是主流瀏覽器的兼容性支持情況:

瀏覽器支持情況備注
Chrome? 完全支持推薦使用
Firefox? 完全支持返回格式略有差異
Safari? 支持(需啟用 WebRTC)移動端默認(rèn)支持
Edge? 完全支持同 Chromium 內(nèi)核
Opera? 完全支持同 Chromium 內(nèi)核

注意:部分瀏覽器(如 Safari)在隱私保護模式下可能限制獲取公網(wǎng) IP 的能力。

2.3 WebRTC獲取IP的局限性與風(fēng)險

雖然 WebRTC 提供了一種無需用戶授權(quán)即可獲取公網(wǎng) IP 的方式,但其也存在一些局限性與潛在風(fēng)險,開發(fā)者在使用過程中應(yīng)予以重視。

2.3.1 局域網(wǎng)IP與公網(wǎng)IP的區(qū)分

在 ICE 候選地址中,通常包含以下幾種類型的 IP 地址:

類型含義示例
host本地局域網(wǎng) IP192.168.1.5
srflx通過 STUN 獲取的公網(wǎng) IP8.8.8.8
relay通過 TURN 獲取的中繼 IP192.0.2.1

因此,開發(fā)者需要通過判斷 candidate 字段中的 typ 參數(shù)來區(qū)分 IP 類型:

if (candidate.includes("typ srflx")) {
    // 該 IP 為公網(wǎng) IP
}

2.3.2 用戶隱私與瀏覽器權(quán)限控制

盡管 WebRTC 不需要用戶明確授權(quán)即可獲取 IP 地址,但這仍然涉及到用戶隱私問題。部分瀏覽器(如 Firefox)提供了隱私設(shè)置選項,可以限制 WebRTC 的使用。

隱私控制策略建議:

  • 在非必要場景下,避免主動獲取用戶 IP。
  • 在獲取 IP 前,明確告知用戶用途并獲取同意。
  • 避免長期存儲或濫用用戶 IP 數(shù)據(jù)。

2.3.3 未來API變更與兼容性問題

WebRTC 作為一個不斷發(fā)展的標(biāo)準(zhǔn),其 API 和行為可能會隨著瀏覽器版本更新而發(fā)生變化。例如:

  • Firefox 68+ :限制 WebRTC 獲取公網(wǎng) IP 的能力。
  • Chrome 77+ :新增隱私保護選項,允許用戶禁用 WebRTC。
  • Safari ITP(智能跟蹤預(yù)防) :限制 WebRTC 在隱私模式下的行為。

因此,開發(fā)者應(yīng)持續(xù)關(guān)注瀏覽器廠商的更新日志,并在生產(chǎn)環(huán)境中加入兼容性判斷與降級處理機制。

總結(jié)

本章詳細(xì)介紹了如何利用 WebRTC API 獲取公網(wǎng) IP 地址的技術(shù)原理與實現(xiàn)方式。通過創(chuàng)建 RTCPeerConnection 、監(jiān)聽 icecandidate 事件,并解析 ICE 候選地址,我們可以在不依賴第三方服務(wù)的情況下獲取用戶的公網(wǎng) IP。同時,我們也分析了該方法的局限性與隱私風(fēng)險,并提供了兼容性建議。

下一章將介紹通過 fetch Ajax 請求遠(yuǎn)程服務(wù)來獲取 IP 的方法,進一步拓展 IP 獲取的實現(xiàn)路徑。

3. 使用fetch/Ajax請求遠(yuǎn)程服務(wù)獲取IP

在現(xiàn)代前端開發(fā)中,使用 fetch Ajax 請求遠(yuǎn)程服務(wù)來獲取客戶端 IP 地址是一種常見且有效的方式。本章將從 IP 查詢服務(wù)的工作機制出發(fā),深入講解如何通過 HTTP 請求實現(xiàn) IP 獲取,并結(jié)合前后端協(xié)作的方式探討安全性與調(diào)用控制策略。

3.1 基于IP查詢服務(wù)的獲取原理

3.1.1 HTTP請求獲取客戶端IP的機制

當(dāng)客戶端通過瀏覽器發(fā)起 HTTP 請求訪問遠(yuǎn)程服務(wù)器時,服務(wù)器能夠獲取到客戶端的 IP 地址。這是由于 HTTP 協(xié)議中,請求頭信息包含了客戶端的源 IP。服務(wù)器端通過解析這些請求頭字段,即可獲取到客戶端的公網(wǎng) IP 地址。

工作流程圖

sequenceDiagram
    用戶瀏覽器->>遠(yuǎn)程IP查詢服務(wù)器: 發(fā)起HTTP請求
    遠(yuǎn)程IP查詢服務(wù)器->>服務(wù)器端處理模塊: 解析請求來源IP
    服務(wù)器端處理模塊->>數(shù)據(jù)庫或緩存: 查詢IP地理位置等信息
    數(shù)據(jù)庫或緩存-->>服務(wù)器端處理模塊: 返回IP相關(guān)信息
    服務(wù)器端處理模塊-->>用戶瀏覽器: 返回JSON格式IP數(shù)據(jù)

核心機制說明:

  • 客戶端瀏覽器通過 fetch 或 XMLHttpRequest 向 IP 查詢服務(wù)發(fā)起請求。
  • 服務(wù)端接收到請求后,從 TCP/IP 層獲取客戶端的源 IP。
  • 服務(wù)端可進一步查詢 IP 的地理位置、運營商、國家城市等信息。
  • 返回結(jié)構(gòu)化數(shù)據(jù)(如 JSON)供前端解析和使用。

3.1.2 常見IP查詢API的使用方式

以下是一些常見的 IP 查詢服務(wù)接口及其調(diào)用方式:

服務(wù)提供商API地址返回格式是否免費備注
ipifyhttps://api.ipify.org?format=jsonJSON? 免費僅返回 IP 地址
ip-api.comhttp://ip-api.com/json/JSON? 免費包含地理位置信息
ipinfo.iohttps://ipinfo.io/jsonJSON? 免費包含地理位置和運營商
ipdata.cohttps://api.ipdata.coJSON? 有限制提供更詳細(xì)的數(shù)據(jù),需注冊

示例:使用 ipify 獲取公網(wǎng) IP

fetch('https://api.ipify.org?format=json')
  .then(response => response.json())
  .then(data => {
    console.log('Public IP:', data.ip);
  })
  .catch(error => {
    console.error('獲取IP失敗:', error);
  });

代碼邏輯分析:

  • 使用 fetch() 向 ipify 發(fā)起 GET 請求。
  • 使用 .then(response => response.json()) 將響應(yīng)體轉(zhuǎn)換為 JSON 格式。
  • .then(data => console.log(...)) 打印出 IP 地址。
  • .catch(error => ...) 捕獲請求過程中的異常,如網(wǎng)絡(luò)錯誤或 CORS 問題。

該方式簡單易用,適合快速獲取客戶端公網(wǎng) IP,但依賴第三方服務(wù)的可用性與穩(wěn)定性。

3.2 前端調(diào)用IP查詢接口的實現(xiàn)

3.2.1 fetch API的調(diào)用與數(shù)據(jù)解析

在現(xiàn)代瀏覽器中, fetch 是一種推薦的異步請求方式,支持 Promise 風(fēng)格的語法,易于與 async/await 結(jié)合使用。

示例:使用 async/await 獲取 IP 并解析數(shù)據(jù)

async function getPublicIP() {
  try {
    const response = await fetch('https://ipinfo.io/json');
    if (!response.ok) {
      throw new Error(`HTTP error! status: ${response.status}`);
    }
    const data = await response.json();
    console.log('IP地址:', data.ip);
    console.log('地理位置:', data.region, data.country);
    console.log('運營商:', data.org);
  } catch (error) {
    console.error('獲取IP失敗:', error);
  }
}
 
getPublicIP();

逐行代碼解讀: 

  1. async function getPublicIP() 定義一個異步函數(shù)。
  2. const response = await fetch(...) 發(fā)起請求并等待響應(yīng)。
  3. if (!response.ok) 檢查響應(yīng)狀態(tài)碼是否為 2xx。
  4. const data = await response.json() 將響應(yīng)內(nèi)容解析為 JSON。
  5. 打印出 IP、地區(qū)、國家和運營商等信息。
  6. catch (error) 捕獲并處理異常。

3.2.2 跨域請求與CORS策略處理

由于 IP 查詢服務(wù)通常部署在第三方服務(wù)器上,因此前端請求可能會受到 CORS(跨域資源共享) 策略的限制。

常見問題及解決方案:

問題描述解決方案
No ‘Access-Control-Allow-Origin’ header present響應(yīng)頭中未設(shè)置允許跨域訪問的域名服務(wù)端需設(shè)置 Access-Control-Allow-Origin: * 或指定域名
Preflight request failed瀏覽器發(fā)送的 OPTIONS 請求被拒絕服務(wù)端應(yīng)支持 OPTIONS 方法并返回 200 狀態(tài)碼
CORS blocked due to credentials請求中攜帶了憑據(jù)(cookies、Authorization)設(shè)置 credentials: 'omit' 或服務(wù)端允許憑據(jù)

示例:帶 credentials 控制的 fetch 請求

fetch('https://ipinfo.io/json', {
  method: 'GET',
  headers: {
    'Content-Type': 'application/json'
  },
  credentials: 'omit' // 避免發(fā)送 cookies 或認(rèn)證信息
})
  .then(response => response.json())
  .then(data => console.log(data));

3.3 后端服務(wù)端獲取IP與前端聯(lián)動

3.3.1 后端如何獲取客戶端真實IP

在前后端分離的架構(gòu)中,前端無法直接獲取客戶端 IP,此時可借助后端服務(wù)獲取真實 IP。

Node.js Express 示例:

const express = require('express');
const app = express();
 
app.get('/api/ip', (req, res) => {
  const clientIP = req.headers['x-forwarded-for'] || req.connection.remoteAddress;
  res.json({ ip: clientIP });
});
 
app.listen(3000, () => {
  console.log('Server is running on port 3000');
});

代碼邏輯分析:

  • req.headers['x-forwarded-for'] 獲取代理服務(wù)器傳遞的客戶端 IP。
  • req.connection.remoteAddress 獲取 TCP 層的原始 IP 地址。
  • 返回 JSON 格式的 IP 數(shù)據(jù)。

3.3.2 前后端配合實現(xiàn)IP獲取與校驗

前端調(diào)用后端接口獲取 IP 的同時,后端可進行 IP 的合法性校驗、頻率控制、防刷等操作。

示例:前后端聯(lián)動獲取 IP 并記錄日志

前端代碼:

fetch('/api/ip')
  .then(response => response.json())
  .then(data => {
    console.log('Your IP is:', data.ip);
  });

后端代碼:

let ipRequests = {};
 
app.get('/api/ip', (req, res) => {
  const clientIP = req.headers['x-forwarded-for'] || req.connection.remoteAddress;
 
  // 限制每分鐘請求次數(shù)
  const now = Date.now();
  if (!ipRequests[clientIP] || now - ipRequests[clientIP] > 60000) {
    ipRequests[clientIP] = now;
    res.json({ ip: clientIP });
  } else {
    res.status(429).json({ error: '請求頻率過高,請稍后再試' });
  }
});

3.3.3 安全性與API調(diào)用頻率控制

為了防止 IP 接口被濫用或攻擊,需采取以下安全措施:

安全措施實現(xiàn)方式
請求頻率限制使用令牌桶或滑動窗口算法限制單位時間內(nèi)的請求次數(shù)
IP 黑名單將惡意 IP 加入黑名單并拒絕其請求
訪問日志記錄記錄每次請求的 IP、時間、用戶代理等信息以供審計
身份認(rèn)證機制對敏感接口進行 Token 驗證或 API Key 校驗

示例:使用 Redis 實現(xiàn)頻率控制

const redis = require('redis');
const client = redis.createClient();
 
app.get('/api/ip', (req, res) => {
  const clientIP = req.headers['x-forwarded-for'] || req.connection.remoteAddress;
 
  client.get(clientIP, (err, count) => {
    if (err) return res.status(500).json({ error: '內(nèi)部服務(wù)器錯誤' });
 
    if (count && parseInt(count) >= 5) {
      return res.status(429).json({ error: '請求頻率過高' });
    }
 
    client.incr(clientIP, (err) => {
      if (err) return res.status(500).json({ error: '內(nèi)部服務(wù)器錯誤' });
      client.expire(clientIP, 60); // 1分鐘過期
      res.json({ ip: clientIP });
    });
  });
});

邏輯說明:

  • 使用 Redis 存儲每個 IP 的請求次數(shù)。
  • 每次請求時增加計數(shù)器。
  • 若超過閾值(如5次/分鐘),返回 429 錯誤。
  • 設(shè)置 Redis 鍵的過期時間為 60 秒,實現(xiàn)滑動窗口限流。

本章詳細(xì)介紹了如何通過 fetch Ajax 請求遠(yuǎn)程服務(wù)來獲取客戶端 IP,并結(jié)合前后端聯(lián)動方式實現(xiàn)安全可控的 IP 獲取機制。下一章將探討通過 Web Workers 實現(xiàn)多線程通信以獲取 IP 的方式,進一步提升性能與安全性。

4. Flash插件獲取IP的歷史實現(xiàn)方式(不推薦)

在現(xiàn)代Web技術(shù)尚未成熟之前,Adobe Flash 曾是實現(xiàn)豐富交互體驗的核心技術(shù)之一。Flash 插件具備較強的本地網(wǎng)絡(luò)訪問能力,這使得開發(fā)者在特定場景下可以通過 Flash 插件獲取用戶的本地IP地址。本章將回顧 Flash 插件在IP獲取中的歷史實現(xiàn)方式,分析其技術(shù)原理、局限性以及被淘汰的原因,并探討其對現(xiàn)代Web開發(fā)的啟示。

4.1 Flash時代的IP獲取技術(shù)

Flash 插件的 ActionScript 腳本語言在早期版本中提供了對本地網(wǎng)絡(luò)資源的訪問能力,這使得開發(fā)者可以利用 Flash 插件探測用戶的本地IP地址。與瀏覽器原生JavaScript不同,F(xiàn)lash插件在運行時具備更高的權(quán)限控制能力,尤其在早期版本中對本地網(wǎng)絡(luò)通信的限制較少。

4.1.1 ActionScript與Socket通信

ActionScript 是 Flash 插件中用于編寫交互邏輯的腳本語言,其版本 3.0 引入了 flash.net.Socket 類,允許開發(fā)者創(chuàng)建 TCP/UDP 套接字連接。通過這一特性,F(xiàn)lash 應(yīng)用可以與本地主機建立連接,從而探測本地網(wǎng)絡(luò)接口信息。

以下是一個基于 ActionScript 3 的示例代碼片段,展示了如何通過 Socket 與本地主機通信:

import flash.net.Socket;
import flash.events.Event;
import flash.events.IOErrorEvent;

var socket:Socket = new Socket();
socket.addEventListener(Event.CONNECT, onConnect);
socket.addEventListener(IOErrorEvent.IO_ERROR, onError);

try {
    socket.connect("127.0.0.1", 8080); // 嘗試連接本地主機
} catch (e:Error) {
    trace("連接失敗:" + e.message);
}

function onConnect(event:Event):void {
    trace("已連接到本地主機");
    socket.writeUTFBytes("GET /ip HTTP/1.1\r\nHost: localhost\r\n\r\n");
    socket.flush();
}

function onError(event:IOErrorEvent):void {
    trace("IO錯誤:" + event.text);
}

代碼解析與邏輯分析:

  • Socket類 :使用 flash.net.Socket 類創(chuàng)建一個TCP套接字,嘗試連接到本地主機(127.0.0.1)的指定端口(如8080)。
  • 事件監(jiān)聽器 :注冊 Event.CONNECT 和 IOErrorEvent.IO_ERROR 事件監(jiān)聽器,用于處理連接成功或失敗的情況。
  • 通信流程 :一旦連接成功,通過 writeUTFBytes 向本地服務(wù)器發(fā)送HTTP請求,嘗試獲取IP信息。
  • 錯誤處理 :通過異常捕獲機制處理連接失敗的情況,并輸出錯誤信息。

參數(shù)說明:

參數(shù)名說明
"127.0.0.1"本地回環(huán)地址,用于測試本地網(wǎng)絡(luò)接口
8080本地服務(wù)監(jiān)聽的端口號,需確保本地有服務(wù)在運行
onConnect連接成功后的回調(diào)函數(shù)
onError連接失敗或通信錯誤的回調(diào)函數(shù)

雖然該代碼并不能直接獲取本地IP地址,但它展示了 Flash 插件在本地網(wǎng)絡(luò)通信中的靈活性。通過與本地服務(wù)交互,F(xiàn)lash 插件可以間接獲取本機IP地址。

4.1.2 Flash插件的本地網(wǎng)絡(luò)訪問能力

Flash 插件在設(shè)計之初為了實現(xiàn)富媒體交互和遠(yuǎn)程通信功能,賦予了插件一定的本地網(wǎng)絡(luò)訪問權(quán)限。尤其是在早期版本中,F(xiàn)lash 插件可以通過本地策略文件(如 crossdomain.xml )繞過瀏覽器的同源策略限制,訪問本地資源。

本地策略文件機制

Flash 插件在嘗試訪問本地或遠(yuǎn)程資源時,會首先檢查目標(biāo)域下的 crossdomain.xml 文件。例如,若 Flash 應(yīng)用嘗試訪問 http://localhost:8080 ,它會查找 http://localhost:8080/crossdomain.xml 文件,判斷是否允許跨域訪問。

<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
    <allow-access-from domain="*" />
</cross-domain-policy>

該策略文件允許來自任意域的 Flash 應(yīng)用訪問本地資源,從而實現(xiàn)本地IP探測功能。

Flash插件與本地IP探測的結(jié)合方式

通過 Flash 插件發(fā)起的本地 Socket 連接或 HTTP 請求,可以訪問本地服務(wù)并獲取本機IP地址。例如:

Flash 插件調(diào)用本地服務(wù)(如 Python 腳本或 Node.js 服務(wù)),由服務(wù)端獲取本地IP并返回給 Flash。 Flash 插件解析返回的IP地址,并通過 JavaScript 通信機制將結(jié)果回傳給前端頁面。

這種機制在早期 Web 開發(fā)中曾被廣泛用于獲取本地IP地址,尤其是在瀏覽器尚未提供 WebRTC 等現(xiàn)代網(wǎng)絡(luò)API之前。

4.2 Flash插件的局限與淘汰原因

盡管 Flash 插件在IP獲取中曾發(fā)揮重要作用,但其安全風(fēng)險、性能問題以及瀏覽器廠商的逐步淘汰,使其不再適用于現(xiàn)代Web開發(fā)。

4.2.1 安全漏洞與瀏覽器支持終止

Flash 插件因頻繁出現(xiàn)安全漏洞而飽受詬病。Adobe 官方在2020年底正式宣布終止對 Flash Player 的支持,并建議用戶卸載插件。以下是 Flash 插件安全問題的幾個關(guān)鍵點:

  • 內(nèi)存泄漏與緩沖區(qū)溢出 :Flash 插件存在多起因內(nèi)存管理不當(dāng)導(dǎo)致的漏洞,攻擊者可利用這些漏洞執(zhí)行任意代碼。
  • 跨域策略繞過 :Flash 插件的 crossdomain.xml 機制曾被黑客利用,繞過瀏覽器同源策略,實施跨站請求偽造(CSRF)攻擊。
  • 沙箱逃逸 :攻擊者通過 Flash 插件的漏洞突破瀏覽器沙箱,獲取系統(tǒng)權(quán)限。

由于這些安全問題,主流瀏覽器(如 Chrome、Firefox、Safari)逐步移除了對 Flash 插件的支持。

4.2.2 用戶權(quán)限與插件啟用門檻

Flash 插件的啟用需要用戶手動授權(quán),且在現(xiàn)代瀏覽器中默認(rèn)禁用。用戶必須主動點擊“允許”按鈕才能加載 Flash 內(nèi)容,這導(dǎo)致 Flash 插件的使用門檻較高。

此外,用戶隱私意識的增強也使得 Flash 插件的本地網(wǎng)絡(luò)訪問功能遭到質(zhì)疑。許多用戶出于安全考慮,直接選擇禁用 Flash 插件,導(dǎo)致基于 Flash 的IP獲取方式失效。

瀏覽器兼容性對比表:

瀏覽器是否支持 Flash默認(rèn)啟用安全建議
Chrome已完全移除
Firefox已停止支持
Safari僅兼容舊版本
Edge已切換為 Chromium 內(nèi)核

4.3 從Flash到現(xiàn)代Web技術(shù)的演進

Flash 插件的退出標(biāo)志著瀏覽器原生能力的崛起?,F(xiàn)代Web技術(shù)如 WebRTC、Fetch API、Web Workers 等提供了更安全、高效的替代方案,使得無需依賴第三方插件即可完成IP獲取等操作。

4.3.1 技術(shù)替代路徑與歷史教訓(xùn)

Flash 插件的淘汰并非偶然,而是Web技術(shù)發(fā)展的必然結(jié)果。以下是一些關(guān)鍵的替代路徑與歷史教訓(xùn):

  • WebRTC :通過 ICE 協(xié)議與 NAT 穿透機制,現(xiàn)代瀏覽器可以直接獲取本機公網(wǎng)IP,無需依賴插件。
  • Fetch API :通過遠(yuǎn)程IP查詢服務(wù)(如 ipinfo.io ),前端可輕松獲取客戶端IP地址。
  • Web Workers :將IP獲取邏輯放在后臺線程中,提升性能與安全性。

這些現(xiàn)代技術(shù)不僅避免了 Flash 插件的安全問題,還提供了更靈活的編程接口與更好的用戶體驗。

4.3.2 現(xiàn)代瀏覽器對Flash的兼容性處理

雖然 Flash 插件已正式退出歷史舞臺,但部分瀏覽器仍提供兼容性處理機制,以支持舊有內(nèi)容:

  • Flash模擬器 :如 Ruffle,是一個開源 Flash 模擬器,可在現(xiàn)代瀏覽器中運行 Flash 內(nèi)容。
  • 本地沙箱環(huán)境 :某些企業(yè)級瀏覽器支持在沙箱環(huán)境中運行 Flash 插件,以滿足特定需求。
  • HTML5轉(zhuǎn)換工具 :Adobe 提供了將 Flash 內(nèi)容轉(zhuǎn)換為 HTML5 的工具鏈,幫助企業(yè)遷移舊系統(tǒng)。

盡管如此,出于安全與性能考慮,開發(fā)者應(yīng)避免繼續(xù)使用 Flash 插件進行IP獲取等操作。

總結(jié)性流程圖:Flash插件獲取IP的技術(shù)演進

graph TD
    A[Flash插件獲取IP] --> B[ActionScript Socket通信]
    B --> C[本地策略文件crossdomain.xml]
    C --> D[與本地服務(wù)通信獲取IP]
    D --> E[Flash安全漏洞頻發(fā)]
    E --> F[瀏覽器逐步移除支持]
    F --> G[現(xiàn)代Web技術(shù)替代]
    G --> H[WebRTC、Fetch API、Web Workers]

該流程圖清晰展示了 Flash 插件獲取IP的技術(shù)路徑及其最終被淘汰的過程,體現(xiàn)了Web技術(shù)從插件依賴走向原生支持的演進趨勢。

5. Web Workers與服務(wù)器通信獲取IP的方式

在現(xiàn)代前端開發(fā)中,Web Workers 作為一種實現(xiàn)多線程處理的技術(shù)手段,為前端復(fù)雜計算任務(wù)、異步通信提供了強有力的支撐。尤其是在處理如 IP 獲取這類網(wǎng)絡(luò)請求時,利用 Web Workers 可以有效避免阻塞主線程,提高頁面響應(yīng)速度與用戶體驗。本章將深入探討如何在 Web Workers 中實現(xiàn)與服務(wù)器通信獲取 IP 的完整流程,分析其性能優(yōu)勢與安全性控制策略,并結(jié)合代碼示例展示具體實現(xiàn)方式。

5.1 Web Workers多線程通信機制

Web Workers 是 HTML5 提供的一種瀏覽器后臺線程機制,允許開發(fā)者在主線程之外運行腳本,從而避免因耗時任務(wù)阻塞頁面渲染。其核心機制在于將任務(wù)從主線程中剝離,獨立運行于 Worker 線程中,并通過 postMessage() 方法實現(xiàn)線程間的通信。

5.1.1 Worker線程的基本結(jié)構(gòu)

Worker 線程本質(zhì)上是一個獨立運行的 JavaScript 文件,它不能訪問 DOM,也不能直接修改頁面內(nèi)容,但可以執(zhí)行計算、發(fā)起網(wǎng)絡(luò)請求等任務(wù)。

基本結(jié)構(gòu)如下:

// worker.js
self.onmessage = function(event) {
    console.log('收到主線程消息:', event.data);
    // 執(zhí)行具體任務(wù),如發(fā)起IP獲取請求
    fetch('https://api.example.com/ip')
        .then(response => response.json())
        .then(data => {
            self.postMessage(data);
        });
};

在主線程中創(chuàng)建并啟動 Worker:

// main.js
const worker = new Worker('worker.js');
 
worker.onmessage = function(event) {
    console.log('收到Worker返回的IP數(shù)據(jù):', event.data);
};
 
worker.postMessage('開始獲取IP');

參數(shù)說明:

  • new Worker('worker.js') :創(chuàng)建一個新的 Worker 實例,加載指定腳本。
  • worker.postMessage() :向 Worker 發(fā)送消息。
  • self.onmessage :Worker 線程監(jiān)聽來自主線程的消息。
  • self.postMessage() :Worker 向主線程發(fā)送消息。

5.1.2 主線程與Worker線程的數(shù)據(jù)交互

Web Workers 通過消息傳遞機制進行通信,所有傳遞的數(shù)據(jù)都必須是可序列化的(即不能包含函數(shù)、循環(huán)引用等)。通常使用 JSON 格式進行數(shù)據(jù)交換。

通信流程圖(mermaid):

sequenceDiagram
    主線程->>Worker線程: postMessage(啟動任務(wù))
    Worker線程->>服務(wù)器: fetch 請求獲取IP
    服務(wù)器-->>Worker線程: 返回IP數(shù)據(jù)
    Worker線程->>主線程: postMessage(返回結(jié)果)

代碼邏輯分析: 主線程創(chuàng)建 Worker :使用 new Worker() 加載指定腳本文件。 主線程發(fā)送指令 :調(diào)用 postMessage() 向 Worker 發(fā)送啟動指令。 Worker 接收指令 :通過 self.onmessage 接收消息,觸發(fā) fetch 請求。 Worker 發(fā)送結(jié)果 :獲取 IP 數(shù)據(jù)后,通過 self.postMessage() 將結(jié)果返回主線程。 主線程接收結(jié)果 :通過 onmessage 接收數(shù)據(jù)并進行展示或處理。

這種方式有效地將 IP 獲取任務(wù)從主線程中剝離,避免阻塞頁面渲染,同時保持了通信的異步性與高效性。

5.2 在Worker中發(fā)起IP獲取請求

在 Web Workers 中發(fā)起網(wǎng)絡(luò)請求是完全可行的, fetch API 與 XMLHttpRequest 都支持在 Worker 環(huán)境中使用。相比 XMLHttpRequest , fetch 更加簡潔現(xiàn)代,且支持 Promise,更適合現(xiàn)代異步編程。

5.2.1 使用fetch與Worker結(jié)合的可行性

fetch 在 Worker 中的行為與主線程一致,支持異步獲取數(shù)據(jù)。唯一不同的是 Worker 無法訪問 document window 對象,因此不能直接操作 DOM。

示例代碼:

// worker.js
self.onmessage = function(event) {
    if (event.data === 'getIP') {
        fetch('https://api.example.com/ip')
            .then(response => response.json())
            .then(ipData => {
                self.postMessage({ status: 'success', data: ipData });
            })
            .catch(error => {
                self.postMessage({ status: 'error', message: error.message });
            });
    }
};

代碼逐行解讀:

  • self.onmessage :監(jiān)聽主線程發(fā)來的消息。
  • if (event.data === 'getIP') :判斷消息內(nèi)容,決定是否執(zhí)行 IP 獲取。
  • fetch('https://api.example.com/ip') :發(fā)起 GET 請求獲取 IP。
  • .then(response => response.json()) :解析響應(yīng)為 JSON 格式。
  • .then(ipData => {...}) :獲取 IP 數(shù)據(jù)后,通過 postMessage 返回。
  • .catch(error => {...}) :捕獲異常并返回錯誤信息。

5.2.2 異步處理IP數(shù)據(jù)并返回主線程

Worker 獲取到 IP 數(shù)據(jù)后,需通過 postMessage 將其返回主線程。為了增強代碼可讀性,建議使用統(tǒng)一的消息格式,例如:

// worker.js
self.postMessage({ type: 'ip_result', ip: '192.0.2.1' });

在主線程中接收并處理:

// main.js
worker.onmessage = function(event) {
    if (event.data.type === 'ip_result') {
        document.getElementById('ip-display').textContent = event.data.ip;
    }
};

流程圖(mermaid):

sequenceDiagram
    主線程->>Worker: 發(fā)送獲取IP指令
    Worker->>API服務(wù)器: 發(fā)起fetch請求
    API服務(wù)器-->>Worker: 返回IP數(shù)據(jù)
    Worker->>主線程: 返回IP結(jié)果
    主線程->>DOM: 更新頁面顯示

5.3 Worker通信的性能與安全性分析

雖然 Web Workers 在提升性能方面具有顯著優(yōu)勢,但在實際應(yīng)用中也需關(guān)注其資源占用與安全性問題。

5.3.1 多線程下的資源占用與性能優(yōu)化

Web Workers 確實提升了任務(wù)執(zhí)行效率,但也會占用額外的內(nèi)存和 CPU 資源。特別是在高并發(fā)場景下,如多個 Worker 同時運行,可能造成資源浪費。

性能優(yōu)化建議:

優(yōu)化策略說明
按需創(chuàng)建Worker僅在需要時創(chuàng)建 Worker,避免無謂的資源占用
復(fù)用Worker多次任務(wù)復(fù)用同一個 Worker,減少創(chuàng)建銷毀開銷
控制并發(fā)數(shù)設(shè)置最大 Worker 數(shù)量,防止資源耗盡
合理終止Worker任務(wù)完成后主動調(diào)用 worker.terminate() 釋放資源

示例代碼:

// 使用單個Worker處理多個任務(wù)
const worker = new Worker('worker.js');
 
function getIP() {
    worker.postMessage('getIP');
}
 
worker.onmessage = function(event) {
    console.log('獲取到IP:', event.data);
    // 任務(wù)完成后終止Worker(可選)
    // worker.terminate();
};

5.3.2 Worker中網(wǎng)絡(luò)請求的安全控制策略

盡管 Web Workers 無法訪問 DOM,但其發(fā)起的網(wǎng)絡(luò)請求仍需考慮安全性問題,尤其是在跨域請求時。

安全控制建議:

安全策略說明
使用HTTPS所有請求應(yīng)通過 HTTPS 加密傳輸,防止中間人攻擊
CORS控制后端需設(shè)置合適的 CORS 策略,限制請求來源
請求白名單前端可維護請求地址白名單,避免請求惡意服務(wù)
Token認(rèn)證對于需認(rèn)證的接口,Worker 中應(yīng)攜帶合法 Token
防止濫用控制請求頻率,避免 Worker 被用于惡意爬蟲等行為

跨域請求示例:

// worker.js
fetch('https://api.example.com/ip', {
    method: 'GET',
    headers: {
        'Authorization': 'Bearer ' + localStorage.getItem('token')
    }
})
.then(response => response.json())
.then(data => self.postMessage(data))
.catch(error => self.postMessage({ error: error.message }));

注意事項:

  • localStorage 是主線程對象,Worker 中無法直接訪問,需通過主線程傳遞 token。
  • 若需持久化 token,可考慮使用 IndexedDB 或通過主線程傳參。

改進方案:

// main.js
const token = localStorage.getItem('token');
worker.postMessage({ action: 'getIP', token: token });
// worker.js
self.onmessage = function(event) {
    const { action, token } = event.data;
    if (action === 'getIP') {
        fetch('https://api.example.com/ip', {
            headers: {
                'Authorization': 'Bearer ' + token
            }
        })
        .then(response => response.json())
        .then(data => self.postMessage(data));
    }
};

通過這種方式,Worker 可以安全地攜帶認(rèn)證信息發(fā)起請求,而不會暴露敏感數(shù)據(jù)。

本章從 Web Workers 的基本原理出發(fā),詳細(xì)介紹了其在 IP 獲取中的應(yīng)用方式,包括線程通信機制、異步請求處理流程、性能優(yōu)化策略以及安全控制手段。通過合理使用 Web Workers,不僅可以提升前端任務(wù)執(zhí)行效率,還能增強頁面的響應(yīng)能力與用戶體驗。在實際開發(fā)中,應(yīng)根據(jù)項目需求靈活選擇是否引入 Worker,并結(jié)合安全策略保障數(shù)據(jù)傳輸?shù)陌踩浴?/p>

6. 獲取用戶IP時的隱私保護與合規(guī)注意事項

6.1 用戶隱私保護與IP數(shù)據(jù)的敏感性

隨著互聯(lián)網(wǎng)技術(shù)的發(fā)展,用戶隱私保護成為全球關(guān)注的焦點。IP地址作為用戶在網(wǎng)絡(luò)中的唯一標(biāo)識符,雖然不是傳統(tǒng)意義上的敏感個人信息,但在許多法律框架中(如歐盟《通用數(shù)據(jù)保護條例》GDPR 和美國《加州消費者隱私法案》CCPA)中,它被明確界定為“個人可識別信息”(PII)。這意味著開發(fā)者在獲取、處理和存儲用戶IP地址時,必須遵循嚴(yán)格的隱私合規(guī)要求。

6.1.1 IP地址是否屬于個人敏感信息

在不同法律體系中,IP地址的敏感性有所不同。例如:

  • GDPR (歐盟):將靜態(tài)IP地址視為個人數(shù)據(jù),特別是當(dāng)該IP可以與特定自然人建立關(guān)聯(lián)時。
  • CCPA (美國加州):將IP地址歸類為“標(biāo)識符”類別的個人信息,允許用戶請求刪除或了解其使用情況。
  • 中國《個人信息保護法》 :將IP地址視為“個人信息”,要求在收集、使用時獲得用戶同意,并確保數(shù)據(jù)安全。

因此,在前端開發(fā)中獲取用戶IP地址時,不能簡單視為“技術(shù)行為”,而應(yīng)從法律角度審慎對待。

6.1.2 GDPR、CCPA等法規(guī)對IP的定義

6.2 合規(guī)使用IP數(shù)據(jù)的最佳實踐

法規(guī)名稱是否將IP視為個人數(shù)據(jù)說明
GDPR靜態(tài)IP可識別用戶身份,需取得同意
CCPA歸類為“標(biāo)識符”,用戶有權(quán)知曉和刪除
中國《個人信息保護法》獲取需授權(quán),使用需目的明確、最小化

在實際開發(fā)中,獲取用戶IP地址往往是為了實現(xiàn)地理位置識別、訪問控制、日志記錄等用途。但必須遵循以下合規(guī)原則:

6.2.1 明確用戶知情權(quán)與同意機制

在獲取用戶IP之前,必須通過清晰的隱私政策或彈窗提示,告知用戶:

  • 為何需要IP地址;
  • 如何使用這些數(shù)據(jù);
  • 是否會與其他方共享;
  • 用戶是否可以撤回同意。

例如,使用 Cookie 或本地存儲前需要用戶點擊“同意”。

// 示例:判斷用戶是否已同意收集IP
function isUserConsented() {
    return localStorage.getItem('ip_consent') === 'true';
}
 
if (!isUserConsented()) {
    // 顯示隱私提示彈窗
    showConsentDialog();
}

6.2.2 數(shù)據(jù)最小化原則與IP存儲策略

即使獲得用戶授權(quán),也應(yīng)遵循“數(shù)據(jù)最小化”原則,即只收集和存儲完成業(yè)務(wù)目標(biāo)所必需的數(shù)據(jù)。例如:

  • 不應(yīng)長期保留用戶IP;
  • 不應(yīng)在前端緩存IP地址;
  • 不應(yīng)將IP地址與用戶賬戶進行長期綁定,除非用戶明確授權(quán)。

6.3 技術(shù)實現(xiàn)中的隱私增強措施

6.3.1 匿名化處理與IP脫敏技術(shù)

在某些場景中,開發(fā)者只需要用戶的地理位置信息,而非完整的IP地址。此時可以采用以下脫敏方式:

  • IP地址截斷 :如 IPv4 地址 192.168.1.100 可以僅保留前兩段 192.168.x.x ;
  • 哈希處理 :使用不可逆哈希函數(shù)對IP進行處理,防止直接識別用戶;
  • 代理中轉(zhuǎn) :通過服務(wù)器中轉(zhuǎn)獲取IP,前端不直接獲取原始IP。
// 示例:對IP進行哈希處理(使用crypto庫)
const crypto = require('crypto');
 
function hashIP(ip) {
    return crypto.createHash('sha256').update(ip).digest('hex');
}
 
const hashedIP = hashIP('192.168.1.100');
console.log(hashedIP); // 輸出:哈希后的字符串

6.3.2 避免IP地址的長期存儲與濫用

前端應(yīng)避免將IP地址存儲在瀏覽器本地,如 localStorage、sessionStorage、IndexedDB 中。如需記錄日志,建議在服務(wù)器端處理,并設(shè)置數(shù)據(jù)保留周期。

// 不推薦的存儲方式
localStorage.setItem('user_ip', '192.168.1.100');
 
// 推薦方式:臨時處理,不存儲
function processIP(ip) {
    console.log('當(dāng)前用戶IP:', ip);
    // 僅用于當(dāng)前會話分析,不持久化
}

6.4 前端IP獲取功能的倫理與責(zé)任

6.4.1 開發(fā)者的責(zé)任邊界與用戶信任

作為前端開發(fā)者,在實現(xiàn)IP獲取功能時,需明確自身責(zé)任邊界:

  • 確保用戶知情并同意;
  • 不利用IP地址進行非法追蹤或行為分析;
  • 遵守平臺方(如瀏覽器廠商、廣告網(wǎng)絡(luò))的隱私政策。

用戶信任是產(chǎn)品成功的基礎(chǔ),濫用IP地址可能導(dǎo)致用戶流失和法律風(fēng)險。

6.4.2 IP獲取與數(shù)據(jù)合規(guī)審查流程

企業(yè)級項目中應(yīng)建立完整的合規(guī)審查流程,包括:

  1. 數(shù)據(jù)采集審查 :確認(rèn)IP采集目的是否合法、是否最小化;
  2. 數(shù)據(jù)處理審查 :是否進行匿名化、是否加密傳輸;
  3. 數(shù)據(jù)存儲審查 :是否長期保存、是否可刪除;
  4. 用戶權(quán)利響應(yīng)機制 :是否支持用戶查詢、刪除其IP數(shù)據(jù);
  5. 第三方接口審查 :調(diào)用的IP查詢服務(wù)是否合規(guī)、是否泄露數(shù)據(jù)。
graph TD
    A[用戶訪問頁面] --> B{是否同意收集IP?}
    B -- 是 --> C[獲取IP并進行哈希處理]
    B -- 否 --> D[跳過IP采集流程]
    C --> E[發(fā)送至服務(wù)器日志系統(tǒng)]
    E --> F[設(shè)定7天自動刪除策略]

通過以上流程圖可以看出,前端IP獲取功能需要與后端、法務(wù)、產(chǎn)品團隊協(xié)同設(shè)計,形成閉環(huán)合規(guī)機制。

以上就是JavaScript獲取本機IP地址的實現(xiàn)方法的詳細(xì)內(nèi)容,更多關(guān)于JavaScript獲取本機IP地址的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • JS自定義混合Mixin函數(shù)示例

    JS自定義混合Mixin函數(shù)示例

    這篇文章主要介紹了JS自定義混合Mixin函數(shù),涉及javascript面向?qū)ο蟪绦蛟O(shè)計中函數(shù)與屬性操作相關(guān)技巧,需要的朋友可以參考下
    2016-11-11
  • js的window.showModalDialog及window.open用法實例分析

    js的window.showModalDialog及window.open用法實例分析

    這篇文章主要介紹了js的window.showModalDialog及window.open用法,實例分析了window.showModalDialog與window.open方法的定義、功能與使用技巧,需要的朋友可以參考下
    2015-01-01
  • 深度解析JavaScript箭頭函數(shù)與普通函數(shù)兩種工作方式

    深度解析JavaScript箭頭函數(shù)與普通函數(shù)兩種工作方式

    本文全面剖析了ES6箭頭函數(shù)與傳統(tǒng)普通函數(shù)的核心差異,最后給出了根據(jù)不同場景選擇函數(shù)類型的實用建議,適合開發(fā)者深入理解兩種函數(shù)的工作機制及適用邊界,感興趣的朋友跟隨小編一起看看吧
    2025-09-09
  • JS實現(xiàn)三個層重疊點擊互相切換的方法

    JS實現(xiàn)三個層重疊點擊互相切換的方法

    這篇文章主要介紹了JS實現(xiàn)三個層重疊點擊互相切換的方法,涉及JavaScript動態(tài)操作頁面定位屬性的相關(guān)技巧,需要的朋友可以參考下
    2015-10-10
  • JS實現(xiàn)圖片懶加載(lazyload)過程詳解

    JS實現(xiàn)圖片懶加載(lazyload)過程詳解

    這篇文章主要介紹了JS實現(xiàn)圖片懶加載(lazyload)過程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-04-04
  • JavaScript 異步調(diào)用框架 (Part 5 - 鏈?zhǔn)綄崿F(xiàn))

    JavaScript 異步調(diào)用框架 (Part 5 - 鏈?zhǔn)綄崿F(xiàn))

    在上一篇文章里面,我們?yōu)楫惒秸{(diào)用框架設(shè)計了一種鏈?zhǔn)秸{(diào)用方式,來增強異步調(diào)用隊列的代碼可讀性,現(xiàn)在我們就來編寫實現(xiàn)這部分功能的代碼。
    2009-08-08
  • JS面向?qū)ο缶幊袒A(chǔ)篇(三) 繼承操作實例詳解

    JS面向?qū)ο缶幊袒A(chǔ)篇(三) 繼承操作實例詳解

    這篇文章主要介紹了JS面向?qū)ο缶幊汤^承操作,結(jié)合實例形式詳細(xì)分析了JS面向?qū)ο罄^承的具體概念、原理、實現(xiàn)方法及操作注意事項,需要的朋友可以參考下
    2020-03-03
  • 搞定immutable.js詳細(xì)說明

    搞定immutable.js詳細(xì)說明

    Immutable Data是指一旦被創(chuàng)造后,就不可以被改變的數(shù)據(jù)。通過使用Immutable Data,可以讓我們更容易的去處理緩存、回退、數(shù)據(jù)變化檢測等問題,簡化我們的開發(fā)
    2016-05-05
  • JS指定音頻audio在某個時間點進行播放

    JS指定音頻audio在某個時間點進行播放

    這篇文章主要介紹了JS指定音頻audio在某個時間點進行播放,獲取當(dāng)前音頻audio的長度,音頻時長格式轉(zhuǎn)化,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-11-11
  • JS未跨域操作iframe里的DOM

    JS未跨域操作iframe里的DOM

    這篇文章主要介紹了JS未跨域操作iframe里的DOM 的相關(guān)資料,非常不錯具有參考借鑒價值,需要的朋友可以參考下
    2016-06-06

最新評論

同仁县| 宁阳县| 雷波县| 建水县| 赤水市| 宿迁市| 沧源| 谢通门县| 上思县| 辉县市| 五大连池市| 略阳县| 伊通| 买车| 湖口县| 武乡县| 颍上县| 井研县| 德清县| 盐边县| 隆安县| 承德县| 铁岭市| 黄山市| 东丰县| 玉林市| 金湖县| 永康市| 临邑县| 怀化市| 永川市| 积石山| 五指山市| 江达县| 竹北市| 肥乡县| 泽库县| 东山县| 松桃| 博湖县| 观塘区|