Skrivet med hjälp av Better SweClockers
Få fram lokalt IP-nummer som stringvariabel (JavaScript)
Använd [code] när du postar kod.
window.RTCPeerConnection = window.RTCPeerConnection || window.mozRTCPeerConnection || window.webkitRTCPeerConnection; //compatibility for firefox and chrome
var pc = new RTCPeerConnection({iceServers:[]}), noop = function(){};
pc.createDataChannel(""); //create a bogus data channel
pc.createOffer(pc.setLocalDescription.bind(pc), noop); // create offer and set local description
pc.onicecandidate = function(ice){ //listen for candidate events
if(!ice || !ice.candidate || !ice.candidate.candidate) return;
var myIP = /([0-9]{1,3}(\.[0-9]{1,3}){3}|[a-f0-9]{1,4}(:[a-f0-9]{1,4}){7})/.exec(ice.candidate.candidate)[1];
console.log('my IP: ', myIP);
pc.onicecandidate = noop;
};
Vi kan se att de har lagt IP-adressen i myIP. Låt oss slå in existerande kod i en funktion vi kan använda:
function getLocalIPAddress() {
window.RTCPeerConnection = window.RTCPeerConnection || window.mozRTCPeerConnection || window.webkitRTCPeerConnection; //compatibility for firefox and chrome
var pc = new RTCPeerConnection({iceServers:[]}), noop = function(){};
pc.createDataChannel(""); //create a bogus data channel
pc.createOffer(pc.setLocalDescription.bind(pc), noop); // create offer and set local description
var myIP;
pc.onicecandidate = function(ice){ //listen for candidate events
if(!ice || !ice.candidate || !ice.candidate.candidate) return;
myIP = /([0-9]{1,3}(\.[0-9]{1,3}){3}|[a-f0-9]{1,4}(:[a-f0-9]{1,4}){7})/.exec(ice.candidate.candidate)[1];
pc.onicecandidate = noop;
};
return myIP;
}
Att jag har flyttat deklarationen av myIP beror på att den måste finnas i den yttre funktionens scope, annars kan vi inte returnera den. Från början fanns den bara i den inre funktionens (temporärt pc.onicecandidate) scope.
@Alling: Ah, jag hittade ingen tagg för det i menyn ovanför meddelanderutan, så antog att det inte fanns någon tagg för kod. Tack!
Jag vill slutligen kunna skriva in en localhost-adress i en textruta och sedan klicka på en knapp som då ersätter "localhost" med mitt lokala IP-nummer. Jag har skrivit lite jQuery som kan byta ut ett ord i textrutan mot ett annat och sedan kopiera detta. Jag försöker sätta in funktionen i koden så att "localhost" blir IP-numret, men jag har troligtvis gjort någonting väldigt fel, eftersom jag får undefined.
function getLocalIPAddress() {
window.RTCPeerConnection = window.RTCPeerConnection || window.mozRTCPeerConnection || window.webkitRTCPeerConnection; //compatibility for firefox and chrome
var pc = new RTCPeerConnection({iceServers:[]}), noop = function(){};
pc.createDataChannel(""); //create a bogus data channel
pc.createOffer(pc.setLocalDescription.bind(pc), noop); // create offer and set local description
var myIP;
pc.onicecandidate = function(ice){ //listen for candidate events
if(!ice || !ice.candidate || !ice.candidate.candidate) return;
myIP = /([0-9]{1,3}(\.[0-9]{1,3}){3}|[a-f0-9]{1,4}(:[a-f0-9]{1,4}){7})/.exec(ice.candidate.candidate)[1];
pc.onicecandidate = noop;
};
return myIP;
}
//Clicking button
$("button").click(function() {
$("input").removeClass("enter");
$("input").addClass("enter");
var $textArea = $("input");
//Entered texts value
var oldText = $textArea.val();
//Entered texts value, with words replaced
var newText = oldText.replace("localhost", getLocalIPAddress());
//Replace old value with new value and select it
$textArea.val(newText).select();
//Copy new text to clipboard and view new text in textarea
document.execCommand('copy');
$textArea.val(newText);
});
Vad gör jag fel? Antar att jag måste konvertera funktionens resultat till en string eller så?
Som jag ser det hämtas ip addressen i eventhandlern onicecandidate, det sker ju asynkront så värdet som returneras från getLocalIpAddress är undefined för att det är inte satt vid det tillfället.
Enklast skickar man ju in en function till getLocalIpAddress som körs när resultatet är klart
function getLocalIPAddress(success) {
window.RTCPeerConnection = window.RTCPeerConnection || window.mozRTCPeerConnection || window.webkitRTCPeerConnection; //compatibility for firefox and chrome
var pc = new RTCPeerConnection({iceServers:[]}), noop = function(){};
pc.createDataChannel(""); //create a bogus data channel
pc.createOffer(pc.setLocalDescription.bind(pc), noop); // create offer and set local description
pc.onicecandidate = function(ice){ //listen for candidate events
if(!ice || !ice.candidate || !ice.candidate.candidate) return;
myIP = /([0-9]{1,3}(\.[0-9]{1,3}){3}|[a-f0-9]{1,4}(:[a-f0-9]{1,4}){7})/.exec(ice.candidate.candidate)[1];
pc.onicecandidate = noop;
success(myIP);
};
}
//Clicking button
$("button").click(function() {
var $textArea = $("input");
//Entered texts value
var oldText = $textArea.val();
getLocalIPAddress( function (ip) {
//Entered texts value, with words replaced
var newText = oldText.replace("localhost", ip);
console.log(newText);
//Replace old value with new value and select it
$textArea.val(newText).select();
//Copy new text to clipboard and view new text in textarea
document.execCommand('copy');
$textArea.val(newText);
} );
});
Som jag ser det hämtas ip addressen i eventhandlern onicecandidate, det sker ju asynkront så värdet som returneras från getLocalIpAddress är undefined för att det är inte satt vid det tillfället.
Enklast skickar man ju in en function till getLocalIpAddress som körs när resultatet är klart
function getLocalIPAddress(success) {
window.RTCPeerConnection = window.RTCPeerConnection || window.mozRTCPeerConnection || window.webkitRTCPeerConnection; //compatibility for firefox and chrome
var pc = new RTCPeerConnection({iceServers:[]}), noop = function(){};
pc.createDataChannel(""); //create a bogus data channel
pc.createOffer(pc.setLocalDescription.bind(pc), noop); // create offer and set local description
pc.onicecandidate = function(ice){ //listen for candidate events
if(!ice || !ice.candidate || !ice.candidate.candidate) return;
myIP = /([0-9]{1,3}(\.[0-9]{1,3}){3}|[a-f0-9]{1,4}(:[a-f0-9]{1,4}){7})/.exec(ice.candidate.candidate)[1];
pc.onicecandidate = noop;
success(myIP);
};
}
//Clicking button
$("button").click(function() {
var $textArea = $("input");
//Entered texts value
var oldText = $textArea.val();
getLocalIPAddress( function (ip) {
//Entered texts value, with words replaced
var newText = oldText.replace("localhost", ip);
console.log(newText);
//Replace old value with new value and select it
$textArea.val(newText).select();
//Copy new text to clipboard and view new text in textarea
document.execCommand('copy');
$textArea.val(newText);
} );
});
Där fick jag också lära mig något. Testade inte min kod (för det går inte på iOS) och tänkte inte alls på att originalkoden var asynkron, trots att det egentligen var tydligt. Tack så mycket!
Skickades från m.sweclockers.com
Skrivet med hjälp av Better SweClockers
- Igår Nvidia: "Energieffektiva RTX 4060 sparar hundralappar" 33
- Igår MSI Geforce RTX 4060 Ventus 2X OC – bra prestanda vid 1080p men medioker kylare 43
- Igår Noctua släpper monteringsram för "deliddade" Ryzen 7000-processorer 15
- Igår Nvidias nästa arkitektur för Geforce kommer år 2025 58
- 27 / 6 Afox släpper kompakt Geforce RTX 4090 36
- Igår Veckans fråga: Vilket operativsystem föredrar du? 72
- Igår Bilar med smarta inslag ger fler dumma fel 56
- 27 / 6 Telekombranschen: "Smarta glasögon ersätter telefoner inom fem år" 88
- 26 / 6 Lastpass-användare rasar – kan inte logga in 59
- 26 / 6 Inet frågar SweClockers – Vad skulle du vilja förbättra på Inet.se? 53
- Trasig hårddisk, webhallen. Kan jag reklamera efter 2 år och 2 månader?11
- Börjar min router att dö?8
- Ert dyraste ” datormisstag”?401
- Ny dator och skärm ca 40 000kr6
- Komplett SweC-Bonanza 7 - Jul i Juli -edition - Diskussion97
- Fel post (dödsbo)7
- Dagens fynd — Diskussionstråden45403
- Får inte ut rätt hastighet5
- Vad har ni i lön?12143
- Vad lyssnar du på just nu?12613
- Säljes Star Wars Jedi AMD kod
- Säljes Trasig Xiaomi Mi Electric Scooter (M365) Svart
- Säljes 5800x3D + x570 Meg Unify + be quiet! Dark Rock Slim
- Säljes AMD ASUS DUAL RX6700XT
- Säljes Dell OptiPlex 7010
- Säljes Datordelar: i5 9600k + 1070 GTX mm.
- Säljes 1080 TI | Vattenblock | 1TB SSD | Apple Watch 4 Stainless | Hörlurar | Mikrofon
- Säljes Intressekoll: Xbox Series S 512Gb samt Switch Oled 64Gb Vit
- Säljes Gamingdator RTX 3090, i9-10900K, 32GB ram
- Säljes KFA2 RTX 3080 Ti SG Nytt i kartong
- Nvidia: "Energieffektiva RTX 4060 sparar hundralappar"34
- MSI Geforce RTX 4060 Ventus 2X OC – bra prestanda vid 1080p men medioker kylare43
- Veckans fråga: Vilket operativsystem föredrar du?72
- Bilar med smarta inslag ger fler dumma fel56
- Noctua släpper monteringsram för "deliddade" Ryzen 7000-processorer15
- Nvidias nästa arkitektur för Geforce kommer år 202558
- Microsoft vill strömma Windows från molnet70
- Starfield utvecklas med AMD:s välsignelse144
- Telekombranschen: "Smarta glasögon ersätter telefoner inom fem år"88
- En av tre svenskar använder annonsblockerare79
Externa nyheter
Spelnyheter från FZ
- Alan Wake och CoD: Kallt krig snart på PS Plus, enligt läcka idag
- Red Dead Redemption åldersmärkt igen i Korea – det spekuleras i remaster idag
- Fallout London flyttas för att slippa Starfield-konkurrensen idag
- Minecraft-filmen kan ha hittat sin Steve – Pedro "The Last of Us-Joel" Pascal idag
- Stor Diablo IV-patch släppt, mer XP och ombalanserade klasser idag