Bagaimana cara mem-parsing URL ke hostname dan path di javascript?

379

Saya ingin mengambil string

var a = "http://example.com/aa/bb/"

dan mengolahnya menjadi objek sedemikian rupa

a.hostname == "example.com"

dan

a.pathname == "/aa/bb"
freddiefujiwara
sumber
11
Jika Anda bekerja pada URL saat ini, Anda dapat mengakses hostnamedan pathnamelangsung dari locationobjek.
rvighne
1
bagaimana dengan "lastPathPart"?
Victor
Bukan regex tetapi Modul Python tldextract melakukan hal ini: github.com/john-kurkowski/tldextract
Oliver Oliver

Jawaban:

395

Cara modern:

new URL("http://example.com/aa/bb/")

Mengembalikan objek dengan properti hostnamedan pathname, bersama dengan beberapa lainnya .

Argumen pertama adalah URL relatif atau absolut; jika itu relatif, maka Anda perlu menentukan argumen kedua (URL dasar). Misalnya, untuk URL relatif ke halaman saat ini:

new URL("/aa/bb/", location)

Selain browser, API ini juga tersedia di Node.js sejak v7, hingga require('url').URL.

rvighne
sumber
7
Bagus! URL relatif mematahkannya ... :( new URL('/stuff?foo=bar#baz')->SyntaxError: Failed to construct 'URL': Invalid URL
lakenen
56
Teknologi eksperimental: IE tidak mendukung ini! developer.mozilla.org/en-US/docs/Web/API/URL/…
cwouter
10
@cwouter: Tidak berfungsi di Edge, yang menggantikan IE
rvighne
4
ini adalah cara untuk melakukannya, edge sudah 3 versi di atas yaitu jadi tidak masalah
Claudiu Creanga
7
Fakta bahwa JavaScript tidak memiliki cara
bawaan
365
var getLocation = function(href) {
    var l = document.createElement("a");
    l.href = href;
    return l;
};
var l = getLocation("http://example.com/path");
console.debug(l.hostname)
>> "example.com"
console.debug(l.pathname)
>> "/path"
freddiefujiwara
sumber
14
Apakah Anda yakin ini adalah solusi yang kompatibel lintas-browser?
cllpse
70
Perlu dicatat bahwa, meskipun ini dapat membantu / menjawab poster asli, jawaban ini hanya akan berfungsi untuk orang yang melakukan pekerjaan JS di browser, karena ini bergantung pada DOM untuk melakukan tugasnya.
Adam Batkin
4
Contoh lain dari kesederhanaan, di samping kecerdikan.
Saeed Neamati
26
Tidak berfungsi di IE jika href bersifat relatif. l.hostname akan kosong. Jika Anda hanya memberikan URL lengkap maka ini akan berfungsi.
Derek Prior
7
Bahkan dengan URL absolut, IE (diuji pada IE 11) berperilaku berbeda dari Chrome dan Firefox. IE pathnamemenghapus slash utama, sementara browser lain tidak. Jadi Anda akan berakhir dengan /pathatau path, tergantung pada browser Anda.
TrueWill
299

ditemukan di sini: https://gist.github.com/jlong/2428561

var parser = document.createElement('a');
parser.href = "http://example.com:3000/pathname/?search=test#hash";

parser.protocol; // => "http:"
parser.host;     // => "example.com:3000"
parser.hostname; // => "example.com"
parser.port;     // => "3000"
parser.pathname; // => "/pathname/"
parser.hash;     // => "#hash"
parser.search;   // => "?search=test"
parser.origin;   // => "http://example.com:3000"
Joseph Oster
sumber
11
Perhatikan bahwa jika Anda hanya ingin mendapatkan bagian yang diuraikan dari lokasi browser saat ini, kedua baris pertama menjadi parser = location;dan semua baris berikut berfungsi. Sudah mencoba di Chrome dan IE9 sekarang.
Lee Meador
9
Perhatikan juga bahwa pathnametidak termasuk garis miring di IE. Sosok pergi. : D
nevelis
3
Untuk IE, gunakan "/" + parser.pathname
sbose
Peringatan: itu akan kembali http:bahkan jika Anda lulus hanya domain.comke href (tanpa protokol apa pun). Saya ingin menggunakan ini untuk memeriksa apakah protokolnya hilang, dan jika demikian saya bisa menambahkannya, tetapi mengasumsikan http: jadi tidak dapat menggunakannya untuk tujuan ini.
Max Hodges
Hostname sebenarnya termasuk protokol. Uji pada Chrome versi terbaru.
AndroidDev
109

Berikut adalah fungsi sederhana menggunakan regexp yang meniru aperilaku tag.

Pro

  • perilaku yang dapat diprediksi (tidak ada masalah lintas browser)
  • tidak perlu DOM
  • ini sangat singkat.

Cons

  • Regexp agak sulit dibaca

-

function getLocation(href) {
    var match = href.match(/^(https?\:)\/\/(([^:\/?#]*)(?:\:([0-9]+))?)([\/]{0,1}[^?#]*)(\?[^#]*|)(#.*|)$/);
    return match && {
        href: href,
        protocol: match[1],
        host: match[2],
        hostname: match[3],
        port: match[4],
        pathname: match[5],
        search: match[6],
        hash: match[7]
    }
}

-

getLocation("http://example.com/");
/*
{
    "protocol": "http:",
    "host": "example.com",
    "hostname": "example.com",
    "port": undefined,
    "pathname": "/"
    "search": "",
    "hash": "",
}
*/

getLocation("http://example.com:3000/pathname/?search=test#hash");
/*
{
    "protocol": "http:",
    "host": "example.com:3000",
    "hostname": "example.com",
    "port": "3000",
    "pathname": "/pathname/",
    "search": "?search=test",
    "hash": "#hash"
}
*/

EDIT:

Berikut ini rincian ekspresi reguler

var reURLInformation = new RegExp([
    '^(https?:)//', // protocol
    '(([^:/?#]*)(?::([0-9]+))?)', // host (hostname and port)
    '(/{0,1}[^?#]*)', // pathname
    '(\\?[^#]*|)', // search
    '(#.*|)$' // hash
].join(''));
var match = href.match(reURLInformation);
Rems
sumber
4
Tidak berfungsi dengan URL relatif apa pun. Apakah Anda mengikuti RFC-3986 saat membuat regexp? > getLocation ("// example.com/"); null> getLocation ("/ pathname /? search"); null> getLocation ("/ pathname /"); null> getLocation ("relatif"); null
gregers
2
Saya suka bagaimana ini tidak menggunakan DOM, tetapi titik memiliki poin yang baik. Akan lebih baik jika ini dapat menangani jalur relatif. Anda harus menggunakan window.location (sebuah elemen) untuk mengisi bagian yang kosong dan menambahkan kode. Dalam hal ini, metode tersebut akan menjadi munafik. Kecuali ada alternatif, tidak yakin bagaimana ini bisa diselesaikan dengan sempurna.
Turbo
Menambahkan kunci href dengan url asli, ini memberikan konsistensi pada objek kembali dengan implementasi dom.
mattdlockyer
2
Jika seseorang perlu mem-parsing URL relatif di sini adalah regexp yang diperbarui: / ^ (? :( https? \:) \ / \ /)? (([^: \ /? #] *) (?: \: ([0 0 -9] +))?) ([\ /] {0,1} [^? #] *) (\? [^ #] * |) (#. * |) $ /
shlensky
75
var loc = window.location;  // => "http://example.com:3000/pathname/?search=test#hash"

mengembalikan currentUrl.

Jika Anda ingin meneruskan string Anda sebagai url ( tidak berfungsi di IE11 ):

var loc = new URL("http://example.com:3000/pathname/?search=test#hash")

Maka Anda dapat menguraikannya seperti:

loc.protocol; // => "http:"
loc.host;     // => "example.com:3000"
loc.hostname; // => "example.com"
loc.port;     // => "3000"
loc.pathname; // => "/pathname/"
loc.hash;     // => "#hash"
loc.search;   // => "?search=test"
Peter Graham
sumber
60

Jawaban freddiefujiwara cukup bagus tetapi saya juga perlu mendukung URL relatif dalam Internet Explorer. Saya datang dengan solusi berikut:

function getLocation(href) {
    var location = document.createElement("a");
    location.href = href;
    // IE doesn't populate all link properties when setting .href with a relative URL,
    // however .href will return an absolute URL which then can be used on itself
    // to populate these additional fields.
    if (location.host == "") {
      location.href = location.href;
    }
    return location;
};

Sekarang gunakan untuk mendapatkan properti yang dibutuhkan:

var a = getLocation('http://example.com/aa/bb/');
document.write(a.hostname);
document.write(a.pathname);

Contoh JSFiddle: http://jsfiddle.net/6AEAB/

Claus
sumber
4
Ini harus menjadi jawaban yang diterima. Penggunaan penanganan URL relatif-hingga-mutlak sangat pintar. +1
L0j1k
Tampaknya bukan pertama kali tautan JSFiddle mati: stackoverflow.com/questions/25179964/…
Claus
3
Ini bekerja dengan baik, namun saya punya satu pembaruan yang saya harap akan membantu orang lain. Saya menggunakan ini untuk memeriksa asal pada permintaan postMessage dan ketika port adalah port default (80 atau 443), tidak ditambahkan ke jalan. Saya memeriksanya secara kondisional ketika membuat URL saya: var locationHost = (location.port !== '80' && location.port !== '443') ? location.host : location.hostname; var locationOrigin = location.protocol + '//' + locationHost;
rhoster
2
Saya membuat komentar ini di tempat lain pada varian yang lebih populer dari solusi ini, tetapi karena ini adalah solusi favorit saya, saya ingin mengulanginya di sini. Di IE11, memiliki nama pengguna di href akan menyebabkan semua properti ini membaca untuk membuat kesalahan keamanan. Contoh: " example.com " akan berfungsi dengan baik. Tetapi " [email protected] " atau " username: [email protected] " akan berusaha untuk merujuk salah satu properti lain dari elemen anchor (contoh: hash) untuk gagal dan membuat kesalahan yang menjengkelkan.
Clippy
17

js-uri (tersedia di Google Code) mengambil URL string dan menyelesaikan objek URI darinya:

var some_uri = new URI("http://www.example.com/foo/bar");

alert(some_uri.authority); // www.example.com
alert(some_uri);           // http://www.example.com/foo/bar

var blah      = new URI("blah");
var blah_full = blah.resolve(some_uri);
alert(blah_full);         // http://www.example.com/foo/blah
Rex M
sumber
Terima kasih!!! tapi saya ingin uri = Lokasi baru (" example.com/aa/bb" ) typeof (window.location) == typeof (uri)
freddiefujiwara
Karena window.location adalah string, saya tidak benar-benar melihat bagaimana itu mungkin atau bermanfaat. Mengapa jenis-jenis ini harus cocok ketika Anda dapat dengan mudah mengkonversi dari satu ke yang lain?
Rex M
developer.mozilla.org/en/DOM/window.location api sangat bagus !! jadi saya harap mengkonversi objek String ke window.location
freddiefujiwara
1
Pengaturan window.location mengubah browser sehingga tidak akan terjadi.
epascarello
1
Hmm itu benar. window.location bukan string, tetapi dapat ditugaskan dari string. Saya tidak yakin apakah itu dapat ditiru, saya sudah mencoba menugaskan prototipe lokasi ke objek uri baru tapi itu tidak berhasil.
Rex M
12

Bagaimana dengan ekspresi reguler sederhana?

url = "http://www.example.com/path/to/somwhere";
urlParts = /^(?:\w+\:\/\/)?([^\/]+)(.*)$/.exec(url);
hostname = urlParts[1]; // www.example.com
path = urlParts[2]; // /path/to/somwhere
svestka
sumber
Cobalah mengurai sesuatu yang valid //user:[email protected]/path/x?y=zdan Anda akan melihat mengapa ekspresi reguler yang sederhana tidak memotongnya. Sekarang melempar sesuatu yang tidak valid ke dalamnya dan itu harus menyelamatkan dengan cara yang dapat diprediksi juga.
Mikko Rantalainen
Regex sederhana adalah untuk masalah sederhana :) Tetapi tidak terdengar bagi saya bahwa url seperti ini tidak dapat diparse oleh regex, itu hanya akan membutuhkan beberapa penyesuaian lagi. Tapi saya mungkin akan pergi ke perpustakaan jika saya membutuhkan sesuatu yang lebih kompleks dan anti peluru.
svestka
12

hari ini saya menemukan masalah ini dan saya menemukan: URL - MDN Web APIs

var url = new URL("http://test.example.com/dir/subdir/file.html#hash");

Pengembalian ini:

{ hash:"#hash", host:"test.example.com", hostname:"test.example.com", href:"http://test.example.com/dir/subdir/file.html#hash", origin:"http://test.example.com", password:"", pathname:"/dir/subdir/file.html", port:"", protocol:"http:", search: "", username: "" }

Berharap kontribusi pertama saya membantu Anda!

A. Moynet
sumber
Jawaban
rangkap
6
Ya tapi pria di atas baru saja memperbarui awser-nya di tahun 2017, saya, saya mempostingnya di 2016.
A. Moynet
Ah, salahku, maaf
Martin van Driel
9

Ini adalah versi yang saya salin dari https://gist.github.com/1847816 , tetapi ditulis ulang sehingga lebih mudah untuk dibaca dan didebug. Tujuan menyalin data jangkar ke variabel lain bernama "hasil" adalah karena data jangkar cukup panjang, dan dengan demikian menyalin sejumlah nilai ke hasil akan membantu menyederhanakan hasil.

/**
 * See: https://gist.github.com/1847816
 * Parse a URI, returning an object similar to Location
 * Usage: var uri = parseUri("hello?search#hash")
 */
function parseUri(url) {

  var result = {};

  var anchor = document.createElement('a');
  anchor.href = url;

  var keys = 'protocol hostname host pathname port search hash href'.split(' ');
  for (var keyIndex in keys) {
    var currentKey = keys[keyIndex]; 
    result[currentKey] = anchor[currentKey];
  }

  result.toString = function() { return anchor.href; };
  result.requestUri = result.pathname + result.search;  
  return result;

}
Biagio Arobba
sumber
6

Penguraian URL lintas-browser , bekerja di sekitar masalah jalur relatif untuk IE 6, 7, 8 dan 9:

function ParsedUrl(url) {
    var parser = document.createElement("a");
    parser.href = url;

    // IE 8 and 9 dont load the attributes "protocol" and "host" in case the source URL
    // is just a pathname, that is, "/example" and not "http://domain.com/example".
    parser.href = parser.href;

    // IE 7 and 6 wont load "protocol" and "host" even with the above workaround,
    // so we take the protocol/host from window.location and place them manually
    if (parser.host === "") {
        var newProtocolAndHost = window.location.protocol + "//" + window.location.host;
        if (url.charAt(1) === "/") {
            parser.href = newProtocolAndHost + url;
        } else {
            // the regex gets everything up to the last "/"
            // /path/takesEverythingUpToAndIncludingTheLastForwardSlash/thisIsIgnored
            // "/" is inserted before because IE takes it of from pathname
            var currentFolder = ("/"+parser.pathname).match(/.*\//)[0];
            parser.href = newProtocolAndHost + currentFolder + url;
        }
    }

    // copies all the properties to this object
    var properties = ['host', 'hostname', 'hash', 'href', 'port', 'protocol', 'search'];
    for (var i = 0, n = properties.length; i < n; i++) {
      this[properties[i]] = parser[properties[i]];
    }

    // pathname is special because IE takes the "/" of the starting of pathname
    this.pathname = (parser.pathname.charAt(0) !== "/" ? "/" : "") + parser.pathname;
}

Penggunaan ( demo JSFiddle di sini ):

var myUrl = new ParsedUrl("http://www.example.com:8080/path?query=123#fragment");

Hasil:

{
    hash: "#fragment"
    host: "www.example.com:8080"
    hostname: "www.example.com"
    href: "http://www.example.com:8080/path?query=123#fragment"
    pathname: "/path"
    port: "8080"
    protocol: "http:"
    search: "?query=123"
}
acdcjunior
sumber
5

Bagi mereka yang mencari solusi modern yang berfungsi di IE, Firefox, DAN Chrome:

Tidak satu pun dari solusi ini yang menggunakan elemen hyperlink akan berfungsi sama di chrome.Jika Anda memberikan url yang tidak valid (atau kosong) ke chrome, itu akan selalu mengembalikan host tempat skrip dipanggil. Jadi di IE Anda akan mendapatkan kosong, sedangkan di Chrome Anda akan mendapatkan localhost (atau apa pun).

Jika Anda mencoba melihat pengarah, ini menipu. Anda harus memastikan bahwa host yang Anda dapatkan ada di url asli untuk menangani ini:

    function getHostNameFromUrl(url) {
        // <summary>Parses the domain/host from a given url.</summary>
        var a = document.createElement("a");
        a.href = url;

        // Handle chrome which will default to domain where script is called from if invalid
        return url.indexOf(a.hostname) != -1 ? a.hostname : '';
    }
KingOfHypocrites
sumber
Ini adalah hal yang sangat penting untuk dipertimbangkan!
2rs2ts
Ini benar-benar memecah url relatif, meskipun!
lakenen
4

Cara AngularJS - biola di sini: http://jsfiddle.net/PT5BG/4/

<!DOCTYPE html>
<html>
<head>
    <title>Parse URL using AngularJS</title>
</head>
<body ng-app ng-controller="AppCtrl" ng-init="init()">

<h3>Parse URL using AngularJS</h3>

url: <input type="text" ng-model="url" value="" style="width:780px;">

<ul>
    <li>href = {{parser.href}}</li>
    <li>protocol = {{parser.protocol}}</li>
    <li>host = {{parser.host}}</li>
    <li>hostname = {{parser.hostname}}</li>
    <li>port = {{parser.port}}</li>
    <li>pathname = {{parser.pathname}}</li>
    <li>hash = {{parser.hash}}</li>
    <li>search = {{parser.search}}</li>
</ul>

<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.0.6/angular.min.js"></script>

<script>
function AppCtrl($scope) {

    $scope.$watch('url', function() {
        $scope.parser.href = $scope.url;
    });

    $scope.init = function() {
        $scope.parser = document.createElement('a');
        $scope.url = window.location;
    }

}
</script>

</body>
</html>
Joseph Oster
sumber
2
Akan lebih sudut jika Anda akan menggunakan $documentdan $windowlayanan
Cherniv
3

Solusi sederhana dan kuat menggunakan pola modul. Ini termasuk perbaikan untuk IE di mana pathnametidak selalu memiliki forward-slash ( /).

Saya telah membuat Gist bersama dengan JSFiddle yang menawarkan parser yang lebih dinamis. Saya sarankan Anda memeriksanya dan memberikan umpan balik.

var URLParser = (function (document) {
    var PROPS = 'protocol hostname host pathname port search hash href'.split(' ');
    var self = function (url) {
        this.aEl = document.createElement('a');
        this.parse(url);
    };
    self.prototype.parse = function (url) {
        this.aEl.href = url;
        if (this.aEl.host == "") {
           this.aEl.href = this.aEl.href;
        }
        PROPS.forEach(function (prop) {
            switch (prop) {
                case 'hash':
                    this[prop] = this.aEl[prop].substr(1);
                    break;
                default:
                    this[prop] = this.aEl[prop];
            }
        }, this);
        if (this.pathname.indexOf('/') !== 0) {
            this.pathname = '/' + this.pathname;
        }
        this.requestUri = this.pathname + this.search;
    };
    self.prototype.toObj = function () {
        var obj = {};
        PROPS.forEach(function (prop) {
            obj[prop] = this[prop];
        }, this);
        obj.requestUri = this.requestUri;
        return obj;
    };
    self.prototype.toString = function () {
        return this.href;
    };
    return self;
})(document);

Demo

Keluaran

{
 "protocol": "https:",
 "hostname": "www.example.org",
 "host": "www.example.org:5887",
 "pathname": "/foo/bar",
 "port": "5887",
 "search": "?a=1&b=2",
 "hash": "section-1",
 "href": "https://www.example.org:5887/foo/bar?a=1&b=2#section-1",
 "requestUri": "/foo/bar?a=1&b=2"
}
{
 "protocol": "ftp:",
 "hostname": "www.files.com",
 "host": "www.files.com:22",
 "pathname": "/folder",
 "port": "22",
 "search": "?id=7",
 "hash": "",
 "href": "ftp://www.files.com:22/folder?id=7",
 "requestUri": "/folder?id=7"
}
Pak Polywhirl
sumber
3

Kenapa tidak menggunakannya?

        $scope.get_location=function(url_str){
        var parser = document.createElement('a');
        parser.href =url_str;//"http://example.com:3000/pathname/?search=test#hash";
        var info={
            protocol:parser.protocol,   
            hostname:parser.hostname, // => "example.com"
            port:parser.port,     // => "3000"
            pathname:parser.pathname, // => "/pathname/"
            search:parser.search,   // => "?search=test"
            hash:parser.hash,     // => "#hash"
            host:parser.host, // => "example.com:3000"      
        }
        return info;
    }
    alert( JSON.stringify( $scope.get_location("http://localhost:257/index.php/deploy/?asd=asd#asd"),null,4 ) );
tanthuc
sumber
3

Anda juga dapat menggunakan parse_url()fungsi dari Locutus proyek (mantan php.js).

Kode:

parse_url('http://username:password@hostname/path?arg=value#anchor');

Hasil:

{
  scheme: 'http',
  host: 'hostname',
  user: 'username',
  pass: 'password',
  path: '/path',
  query: 'arg=value',
  fragment: 'anchor'
}
Andrey Rudenko
sumber
1
url itu tidak bekerja untuk saya, tetapi saya menemukannya di sini github.com/hirak/phpjs/blob/master/functions/url/parse_url.js
Stan Quinn
@StanQuinn, itu karena php.js mengubah namanya menjadi Locutus. Saya telah memperbarui jawaban saya dengan tautan baru.
Andrey Rudenko
3
function parseUrl(url) {
    var m = url.match(/^(([^:\/?#]+:)?(?:\/\/((?:([^\/?#:]*):([^\/?#:]*)@)?([^\/?#:]*)(?::([^\/?#:]*))?)))?([^?#]*)(\?[^#]*)?(#.*)?$/),
        r = {
            hash: m[10] || "",                   // #asd
            host: m[3] || "",                    // localhost:257
            hostname: m[6] || "",                // localhost
            href: m[0] || "",                    // http://username:password@localhost:257/deploy/?asd=asd#asd
            origin: m[1] || "",                  // http://username:password@localhost:257
            pathname: m[8] || (m[1] ? "/" : ""), // /deploy/
            port: m[7] || "",                    // 257
            protocol: m[2] || "",                // http:
            search: m[9] || "",                  // ?asd=asd
            username: m[4] || "",                // username
            password: m[5] || ""                 // password
        };
    if (r.protocol.length == 2) {
        r.protocol = "file:///" + r.protocol.toUpperCase();
        r.origin = r.protocol + "//" + r.host;
    }
    r.href = r.origin + r.pathname + r.search + r.hash;
    return m && r;
};
parseUrl("http://username:password@localhost:257/deploy/?asd=asd#asd");

Ia berfungsi dengan url absolut dan relatif

Nikolay
sumber
abc://username:[email protected]:123/path/data?key=value&key2=value2#fragid1
山 茶树 和 葡萄 树
@ 山 茶树 和 葡萄 树 Saya telah memperbarui kode untuk menangani subkomponen userinfo dengan benar. Terima kasih atas komentar Anda, saya tidak melihat masalah itu sebelumnya
Nikolay
cinta regex ini
Kunal
2

Berhenti menciptakan kembali roda. Gunakan https://github.com/medialize/URI.js/

var uri = new URI("http://example.org:80/foo/hello.html");
// get host
uri.host(); // returns string "example.org:80"
// set host
uri.host("example.org:80");
Hugo Sequeira
sumber
5
Karena setiap kali Anda ingin menyelesaikan masalah ... menggunakan perpustakaan? Oke ... (tidak)
jiminikiz
4
Tidak selalu (sebenarnya hampir tidak pernah) tetapi URL sangat sulit untuk diuraikan, ada banyak detail di RFC. Lebih baik menggunakan perpustakaan yang telah digunakan dan diuji oleh ribuan orang.
Hugo Sequeira
Bagaimana kalau hanya menggunakan apa yang ada di dalamnya, alih-alih menyuruh orang lain menemukan kembali roda dengan perpustakaan? Lihat stackoverflow.com/a/24006120/747739
Phil
Tidak ada dukungan IE11 untuk fungsi bawaan, sehingga pustaka ini sangat baik. Mengatakan tidak pernah menggunakan perpustakaan sama dengan mengatakan kita seharusnya tidak pernah menggunakan jQuery dan hanya menulis kode asli, yang benar-benar konyol. Setiap pengembang memiliki kasus penggunaan yang berbeda, tidak ada cara 'terbaik', kadang-kadang vanilla / asli bekerja dengan baik, kadang-kadang tidak ... sesuatu yang masih harus dipelajari oleh 92% pengembang.
tno2007
1

Cukup gunakan pustaka url.js (untuk web dan node.js).

https://github.com/websanova/js-url

url: http://example.com?param=test#param=again

url('?param'); // test
url('#param'); // again
url('protocol'); // http
url('port'); // 80
url('domain'); // example.com
url('tld'); // com

etc...
rampok
sumber
1

hack sederhana dengan jawaban pertama

var getLocation = function(href=window.location.href) {
    var l = document.createElement("a");
    l.href = href;
    return l;
};

ini dapat digunakan bahkan tanpa argumen untuk mengetahui getLocation nama host saat ini (). nama host akan memberikan nama host saat ini

sooraj
sumber