มีวิธีใดในการรับ URL โดยไม่มีสตริงการสืบค้น


268

ฉันมี URL http://localhost/dms/mduserSecurity/UIL/index.php?menu=true&submenu=true&pcode=1235เหมือน

ฉันต้องการรับ URL โดยไม่มีสตริงการสืบค้น: http://localhost/dms/mduserSecurity/UIL/index.php.

มีวิธีการนี้ใน JavaScript หรือไม่? ขณะนี้ฉันกำลังใช้document.location.hrefงานอยู่ แต่จะคืนค่า URL ทั้งหมด


2
อาจเป็นไปได้ซ้ำกับการลบการสอบถามออกจาก URL
Alex Angas

คำตอบ:


348

ลองสิ่งนี้: window.location.href.split('?')[0]


12
@ Lincoln - เพราะอะไร ฉันไม่เห็นเหตุผลว่าสิ่งนี้จะไม่ปลอดภัย มันยังอยู่ในสเปค (ทั้งสเป็คสำหรับ window.location.href ใดที่ควรส่งคืนและสเปคสำหรับการทำงานของ URL) ดังนั้นจึงไม่ควรมีปัญหาใด ๆ ในอนาคต มันอ่านและเข้าใจได้ง่ายขึ้นสำหรับโค้ดที่ชัดเจนกว่า มันสั้นลงสำหรับโค้ดที่เล็กกว่า และท้ายที่สุดมันมีความเข้มข้นน้อยกว่าและซับซ้อนน้อยกว่าคำตอบของเฟลิกซ์ การไม่พูดว่าเฟลิกซ์ผิด แต่ผมกำลังบอกว่าไม่มีตัวอย่างที่เฉพาะเจาะจงเกี่ยวกับความล้มเหลว / ความไม่มั่นคงที่คำตอบนี้ดีกว่าในทุก ๆ ด้าน
Jimbo Jonny

1
คุณควรใช้ window.location.pathname
..etc

22
@JimboJonny @Marcel นี่ไม่ได้จัดการตัวระบุส่วน (เช่น#คำศัพท์ในstackoverflow.com/questions/5817505#5817548 ) คุณจะต้องใช้ regex หรือใช้หลายฟังก์ชั่น. split () ซึ่งทำให้คุณเสียคุณค่าในการใช้คำตอบนี้ "ง่าย" ในการล้าง URL ได้รับสิ่งนี้เป็นเทคนิคที่เกินขอบเขตของคำถาม แต่ฉันบอกว่ามันยังเกี่ยวข้อง
andrewb

2
ในขณะที่มันถูกต้องที่นี่ไม่ได้จัดการกับตัวระบุชิ้นส่วนผู้ถามไม่ได้ขอ URL ที่ถูกสุขลักษณะอย่างสมบูรณ์ เขาขอ URL ที่ไม่มีสตริงข้อความค้นหาเป็นพิเศษและคำตอบนี้ให้สิ่งนั้นทุกประการ URL เดียวกันโดยที่ลบสตริงข้อความค้นหาออก
Drew Major

383

อ่านเกี่ยวกับWindow.locationและLocationอินเทอร์เฟซ:

var url = [location.protocol, '//', location.host, location.pathname].join('');

27
หรือถ้าใช้ es6 คุณสามารถใช้สตริงตัวอักษร ${location.protocol}//${location.host}${location.pathname}
alexreardon

แม้ว่าจะทราบว่าpathnameอาจจะวางชั้นนำ/(จนกระทั่ง IE 11?) Ah, IE เป็นเกล็ดหิมะเสมอใช่มั้ย
ruffin

36
location.toString().replace(location.search, "")

12
นี่เป็นคำตอบที่ไม่คุ้มค่ามาก มันเป็นสิ่งเดียวที่ตอบคำถามได้อย่างแท้จริง แม้แต่ตัวเลือกที่สั้นกว่า:location.href.replace(location.search, '')
Guido Bouman

2
มีชิ้นส่วนอะไรบ้างเช่น domain.com/?x=1#top
Onur Topal

2
มีคำตอบ 10 ข้อสำหรับคำถามนี้ มีเพียงหนึ่งคนเท่านั้นที่เก็บรักษาแฮช ( ซึ่งไม่มีอยู่ใน URL ที่มีการถามคำถาม ) เหตุใดจึงมีความคิดเห็นสองข้อชี้ให้เห็นว่าคำตอบนี้ไม่ได้รักษาแฮชที่ไม่มีอยู่ แต่ไม่ใช่ของอื่น ๆ
เควนติน

14
var url = window.location.origin + window.location.pathname;

5
โหวตต่ำเนื่องจากไม่รองรับที่มาใน IE11 :-(
จอร์จ

6
ทำไมคุณต้องลงคะแนนบางอย่างเพียงเพราะมันไม่ทำงานในเบราว์เซอร์ที่เฉพาะเจาะจง หลายแห่งยังคงใช้ IE10 เป็นมาตรฐานเนื่องจากแอปพลิเคชันที่ใช้
แบรด

1
ทำงานใน IE11.309.16299.0
Ryan Burbidge


5

ลอง:

document.location.protocol + '//' +
document.location.host +
document.location.pathname;

(หมายเหตุ: .hostแทนที่จะ.hostnameรวมพอร์ตไว้ด้วยหากจำเป็น)



4

เพียงแค่ตัดสายโดยใช้การแยก (วิธีที่ง่าย):

var myString = "http://localhost/dms/mduserSecurity/UIL/index.php?menu=true&submenu=true&pcode=1235"
var mySplitResult = myString.split("?");
alert(mySplitResult[0]);

3

ในการรับทุกส่วนของ URL ยกเว้นการสืบค้น:

var url = (location.origin).concat(location.pathname).concat(location.hash);

โปรดทราบว่านี่รวมถึงแฮชด้วยเช่นกันหากมี (ฉันทราบว่าไม่มีแฮชใน URL ตัวอย่างของคุณ แต่ฉันได้รวมแง่มุมนั้นเพื่อความครบถ้วน) เพื่อกำจัดความยุ่งเหยิงเพียงแค่แยก.concat(location.hash)แต่ยกเว้น

เป็นวิธีปฏิบัติที่ดีกว่าที่จะใช้concatเพื่อเข้าร่วมสตริง Javascript ด้วยกัน (มากกว่า+): ในบางสถานการณ์มันหลีกเลี่ยงปัญหาเช่นความสับสนในประเภท



1

นี่คือวิธีการสองวิธี:

<script type="text/javascript">
    var s="http://localhost/dms/mduserSecurity/UIL/index.php?menu=true&submenu
                                =true&pcode=1235";

    var st=s.substring(0, s.indexOf("?"));

    alert(st);

    alert(s.replace(/\?.*/,''));
</script>


0

เพียงเพิ่มสองบรรทัดนี้ไปที่ $ (document). ready ใน JS ดังต่อไปนี้:

$(document).ready(function () {
 $("div.sidebar nav a").removeClass("active");
        $('nav a[href$="'+ window.location.pathname.split("?")[0] +'"]').addClass('active');
});

มันจะดีกว่าที่จะใช้เครื่องหมายดอลลาร์ ($) (ลงท้ายด้วย)

$('nav a[href$

แทน (^) (เริ่มต้นด้วย)

$('nav a[href^

เพราะถ้าคุณใช้เครื่องหมาย (^) และคุณมี URL ที่ซ้อนกันในเมนูนำทาง (เช่น "/ account" และ "/ account / role")

มันจะทำงานทั้งสองอย่าง


0

ถ้าคุณใช้ dot net core 3.1 แสดงว่ารองรับตัวพิมพ์เล็กและตัวพิมพ์ใหญ่เส้นทางที่ขนาดตัวพิมพ์ดังนั้นวิธีก่อนหน้านี้จะไม่เป็นประโยชน์หากรูทีนเป็นตัวอักษรขนาดเล็กและผู้ใช้เขียนรูทีนด้วยตัวพิมพ์ใหญ่

ดังนั้นรหัสต่อไปนี้มีประโยชน์มาก:

$(document).ready(function () {
    $("div.sidebar nav a").removeClass("active");
    var urlPath = window.location.pathname.split("?")[0];
    var nav = $('div.sidebar nav a').filter(function () {
        return $(this).attr('href').toLowerCase().indexOf(urlPath.toLocaleLowerCase()) > -1;
    });
    $(nav).each(function () {
        if ($(this).attr("href").toLowerCase() == urlPath.toLocaleLowerCase())
            $(this).addClass('active');
    });
});
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.