JavaScript是一種廣泛使用的腳本語(yǔ)言,可以在網(wǎng)頁(yè)中實(shí)現(xiàn)各種功能。其中,獲取內(nèi)網(wǎng)ip是一種比較實(shí)用的技能,可以幫助網(wǎng)站管理者監(jiān)控用戶(hù)連接的網(wǎng)絡(luò),也可以用于局域網(wǎng)內(nèi)部通訊的需要。今天我們就來(lái)講一講如何使用JavaScript獲取內(nèi)網(wǎng)ip。
首先,我們來(lái)看看常見(jiàn)的獲取ip的方法。如果使用Ajax從服務(wù)器端獲取ip,這樣的代碼通常長(zhǎng)這個(gè)樣子:
$.getJSON("https://api.ipify.org/?format=json", function(data) { console.log(data.ip); });
這種方法可以獲取外網(wǎng)ip,但是無(wú)法獲取內(nèi)網(wǎng)ip。那么該如何獲取內(nèi)網(wǎng)ip呢?
一種常見(jiàn)的方法是使用WebRTC(Web Real-Time Communication),利用其內(nèi)置的API獲取本地網(wǎng)絡(luò)信息。具體的代碼如下:
var pc = new RTCPeerConnection(); pc.createDataChannel(""); pc.createOffer(function(sdp) { var regex = /(\d+\.\d+\.\d+\.\d+)/; var matches = sdp.sdp.match(regex); console.log(matches[1]); pc.setLocalDescription(sdp); }, function onerror() {} );
以上代碼使用RTCPeerConnection對(duì)象,獲取本地網(wǎng)絡(luò)信息,并從中提取出ip,并在控制臺(tái)中打印出來(lái)。代碼執(zhí)行后,控制臺(tái)會(huì)輸出類(lèi)似于“192.168.1.100”的ip地址。
不過(guò),需要注意的是,上述代碼只能在支持WebRTC的瀏覽器中使用。目前大多數(shù)瀏覽器都已經(jīng)支持WebRTC,但為了更好的兼容性,我們?cè)趯?shí)際應(yīng)用中還需要考慮一些額外的因素。
我們可以使用一個(gè)簡(jiǎn)單的技巧來(lái)確定是否支持WebRTC,代碼如下:
var SUPPORTS_WEBRTC = (function() { try { var pc = new RTCPeerConnection(); pc.createDataChannel(""); pc.createOffer(function(){}, function(){}); return true; } catch(e) { return false; } })();
上述代碼會(huì)嘗試使用RTCPeerConnection創(chuàng)建一個(gè)數(shù)據(jù)通道,如果成功,說(shuō)明該瀏覽器支持WebRTC;否則,不支持。
除此以外,我們還可以通過(guò)服務(wù)器端來(lái)獲取內(nèi)網(wǎng)ip。如下面的代碼所示:
var xhr = new XMLHttpRequest(); xhr.open('GET', 'https://ipinfo.io/json', true); xhr.onload = function () { var result = JSON.parse(xhr.responseText); console.log(result.ip); }; xhr.send();
上述代碼使用XMLHttpRequest對(duì)象,向一個(gè)公共API(https://ipinfo.io/)發(fā)送請(qǐng)求,獲取ip地址,并打印到控制臺(tái)中。需要注意的是,該方法依賴(lài)于服務(wù)器端,如果服務(wù)器掛了或者被封鎖了,該方法就無(wú)法使用。
總之,以上是幾種最常見(jiàn)的獲取內(nèi)網(wǎng)ip的方法,每種方法都有其優(yōu)劣之處,根據(jù)實(shí)際情況選擇合適的方法即可。