คุณจะตรวจสอบ #hash ใน URL โดยใช้ JavaScript ได้อย่างไร


783

ฉันมีรหัส jQuery / JavaScript ที่ฉันต้องการเรียกใช้เฉพาะเมื่อมีแฮ็ก ( #) ลิงค์ยึดใน URL คุณจะตรวจสอบอักขระนี้โดยใช้ JavaScript ได้อย่างไร ฉันต้องการการทดสอบทั้งหมดที่จับได้ง่ายซึ่งจะตรวจพบ URL ดังนี้:

  • example.com/page.html#anchor
  • example.com/page.html#anotheranchor

โดยทั่วไปบางสิ่งบางอย่างตามแนวของ:

if (thereIsAHashInTheUrl) {        
    do this;
} else {
    do this;
}

หากใครสามารถชี้ให้ฉันในทิศทางที่ถูกต้องนั่นจะเป็นที่ชื่นชมมาก

คำตอบ:


1404

ง่าย:

if(window.location.hash) {
  // Fragment exists
} else {
  // Fragment doesn't exist
}

42
เพิ่มเติม: วัตถุ .location จะใช้ได้เฉพาะใน URL หน้าต่างปัจจุบันของคุณไม่สามารถทำเช่นนี้สำหรับ URL ที่กำหนดเอง (เช่นหนึ่งเก็บไว้ในตัวแปรสตริง)
แกเร็ ธ

64
นอกจากนี้คุณสมบัติตำแหน่งเช่น. hash และ. query ยังมีอยู่ในองค์ประกอบ <a> ด้วย
Gareth

19
.searchสามารถใช้ได้บนไม่<a> .queryjQuery $("<a/>").attr({ "href": "http://www.somewhere.com/a/b/c.html?qs=1#fragmenttest" })[0]ตัวอย่าง: .hash => "#fragmenttest"และ=.search ?qs=1จากนั้นกดคำถามแยกคำถามเพื่อดึงสิ่งอื่นนอกเหนือจากสตริง
patridge

1
@hitautodestruct: คำถามนี้ไม่เกี่ยวกับการเปลี่ยนแปลงแฮชไม่ว่าจะมีอยู่ในการโหลดหน้าหรือไม่
Gareth

2
@ กาเร็ ธ ใช่คุณพูดถูก เพิ่งตระหนักว่าการเชื่อมโยงผมโพสต์เป็นสำหรับเหตุการณ์และการไม่ได้hashchange window.location.hashแม้ว่า IE จะไม่รองรับหลัง <8
hitautodestruct


54

ใส่ต่อไปนี้:

<script type="text/javascript">
    if (location.href.indexOf("#") != -1) {
        // Your code in here accessing the string like this
        // location.href.substr(location.href.indexOf("#"))
    }
</script>

1
ขอบคุณ window.location.hash จะมีค่าก็ต่อเมื่อมีค่าต่อจาก # ตัวอย่างเช่น. //www.example.com# ส่งคืน '' เมื่อตรวจสอบแฮช
Jessy

33

หาก URI ไม่ใช่ตำแหน่งของเอกสารตัวอย่างนี้จะทำสิ่งที่คุณต้องการ

var url = 'example.com/page.html#anchor',
    hash = url.split('#')[1];

if (hash) {
    alert(hash)
} else {
    // do something else
}

+1 สำหรับ Javascript ไม่ทราบว่าสิ่งที่ออกจากขอบเขตเป็น :)
Dunc

2
@Dunc: อาร์เรย์ JS นั้นเป็นวัตถุ obj['0']การเข้าถึงพวกเขาโดยดัชนีเป็นเหมือนการเข้าถึงทรัพย์สินวัตถุเช่นดังนั้น: ใน JS สิ่งนี้เป็นจริง: arr[0] === arr['0']ดังนั้นหากไม่มีดัชนี / คีย์ค่าที่ส่งคืนจะไม่ถูกกำหนดแทนขอบเขต jsfiddle.net/web5me/Mw376
Marc Diethelm

21

คุณเคยลองสิ่งนี้หรือไม่?

if (url.indexOf('#') !== -1) {
    // Url contains a #
}

( urlURL ที่คุณต้องการตรวจสอบอยู่ชัด ๆ )


17
$('#myanchor').click(function(){
    window.location.hash = "myanchor"; //set hash
    return false; //disables browser anchor jump behavior
});
$(window).bind('hashchange', function () { //detect hash change
    var hash = window.location.hash.slice(1); //hash to string (= "myanchor")
    //do sth here, hell yeah!
});

สิ่งนี้จะช่วยแก้ปัญหา)


ชอบคำตอบนี้เนื่องจากการผสม JS + JQ ข้ามเบราว์เซอร์และโซลูชันที่เรียบง่าย
Arthur Kushman



6

นี่คือสิ่งที่คุณสามารถทำได้เพื่อตรวจสอบการเปลี่ยนแปลงของแฮชเป็นระยะ ๆ จากนั้นเรียกใช้ฟังก์ชันเพื่อประมวลผลค่าแฮช

var hash = false; 
checkHash();

function checkHash(){ 
    if(window.location.hash != hash) { 
        hash = window.location.hash; 
        processHash(hash); 
    } t=setTimeout("checkHash()",400); 
}

function processHash(hash){
    alert(hash);
}

11
นั่นเป็นเพียงสิ่งจำเป็นในเช่น 6 + 7 อัลเบราว์เซอร์อื่น ๆ ได้รวมเหตุการณ์
onhashchange

@Tokimon - เยี่ยมมาก! ฉันไม่รู้ แต่ฉันคิดว่าเรายังต้องให้การสนับสนุน IE เวอร์ชันเก่าเหล่านั้น
Emmanuel

1
ใช่เศร้า ... แม้ IE 8 จะไม่หายไปในเร็ว ๆ นี้เนื่องจาก IE 9 ไม่รองรับบน XP :(
Tokimon

1
modernizr.comใช้กิจกรรม hashchange บนเบราว์เซอร์รุ่นเก่า (พร้อมด้วยคุณสมบัติที่ทันสมัยอื่น ๆ )
guigouz

4
นี้ไม่ได้เป็นรหัสที่แนะนำที่ทั้งหมด: setTimeout(checkHash, 400)อย่างน้อยควรจะ: พลัสเบราว์เซอร์ที่ทันสมัยมีเหตุการณ์เพื่อให้คุณสามารถทำhashchange window.addEventListener('hashchange', function(){ … })ในที่สุดการรั่วไหลของhashตัวแปรทั่วโลกก็เป็นอีกวิธีปฏิบัติที่ไม่แนะนำแม้ว่าจะเป็นตัวอย่างที่ดีก็ตาม
ลุงทอม

5

คนส่วนใหญ่ตระหนักถึงคุณสมบัติของ URL ใน document.location เยี่ยมมากถ้าคุณสนใจในหน้าปัจจุบันเท่านั้น แต่คำถามคือเกี่ยวกับความสามารถในการแยกวิเคราะห์จุดยึดบนหน้าไม่ใช่ตัวหน้า

สิ่งที่คนส่วนใหญ่ดูเหมือนจะพลาดคือคุณสมบัติ URL เดียวกันนั้นยังมีให้ใช้กับจุดยึดองค์ประกอบ:

// To process anchors on click    
jQuery('a').click(function () {
   if (this.hash) {
      // Clicked anchor has a hash
   } else {
      // Clicked anchor does not have a hash
   }
});

// To process anchors without waiting for an event
jQuery('a').each(function () {
   if (this.hash) {
      // Current anchor has a hash
   } else {
      // Current anchor does not have a hash
   }
});

5
function getHash() {
  if (window.location.hash) {
    var hash = window.location.hash.substring(1);

    if (hash.length === 0) { 
      return false;
    } else { 
      return hash; 
    }
  } else { 
    return false; 
  }
}

3
ควรที่จะไม่ "hash.length" ซึ่งตรงข้ามกับ "hash.length ()" หรือไม่ :)
นาธานพิตแมน


3

ความคิดเห็นของนกกระทาและแกเร็ ธ ดังกล่าวข้างต้นนั้นเยี่ยมมาก พวกเขาสมควรได้รับคำตอบแยกต่างหาก เห็นได้ชัดว่าคุณสมบัติแฮชและการค้นหามีอยู่ในวัตถุลิงก์ HTML:

<a id="test" href="foo.html?bar#quz">test</a>
<script type="text/javascript">
   alert(document.getElementById('test').search); //bar
   alert(document.getElementById('test').hash); //quz
</script>

หรือ

<a href="bar.html?foo" onclick="alert(this.search)">SAY FOO</a>

หากคุณต้องการสิ่งนี้กับตัวแปรสตริงปกติและมี jQuery อยู่รอบตัวสิ่งนี้ควรทำงาน:

var mylink = "foo.html?bar#quz";

if ($('<a href="'+mylink+'">').get(0).search=='bar')) {
    // do stuff
}

(แต่อาจจะมากไปหน่อย .. )


3

การขว้างนี่ในที่นี่เป็นวิธีสำหรับการสรุปคุณสมบัติของตำแหน่งจากสตริงที่คล้ายกับ URI โดยพลการ แม้ว่าจะwindow.location instanceof Locationเป็นจริงการพยายามเรียกใช้Locationจะบอกคุณว่ามันเป็นตัวสร้างที่ผิดกฎหมาย คุณยังสามารถได้รับสิ่งที่ต้องการhash, query, protocolฯลฯ โดยการตั้งค่าสตริงของคุณเป็นhrefทรัพย์สินขององค์ประกอบ DOM สมอซึ่งจากนั้นจะมีส่วนร่วมทุกคุณสมบัติที่อยู่กับwindow.locationสมอซึ่งจากนั้นจะมีส่วนร่วมทุกคุณสมบัติที่อยู่กับ

วิธีที่ง่ายที่สุดในการทำเช่นนี้คือ:

var a = document.createElement('a');
a.href = string;

string.hash;

เพื่อความสะดวกฉันได้เขียนห้องสมุดเล็ก ๆ ที่ใช้สิ่งนี้เพื่อแทนที่Locationนวกรรมิกดั้งเดิมด้วยสิ่งที่จะใช้สตริงและสร้างwindow.locationวัตถุที่คล้ายกัน: Location.js


1

โดยปกติแล้วการคลิกจะไปก่อนการเปลี่ยนแปลงสถานที่ตั้งดังนั้นหลังจากคลิกจะเป็นการดีที่คุณจะต้อง setTimeOut เพื่อรับการอัพเดท window.location.hash

$(".nav").click(function(){
    setTimeout(function(){
        updatedHash = location.hash
    },100);
});

หรือคุณสามารถฟังตำแหน่งด้วย:

window.onhashchange = function(evt){
   updatedHash = "#" + evt.newURL.split("#")[1]
};

ฉันเขียนปลั๊กอิน jQueryที่ทำในสิ่งที่คุณต้องการ

มันเป็นเราเตอร์สมอง่าย ๆ


1

นี่คือฟังก์ชั่นง่าย ๆ ที่คืนค่าtrueหรือfalse(มี / ไม่มีแฮชแท็ก):

var urlToCheck = 'http://www.domain.com/#hashtag';

function hasHashtag(url) {
    return (url.indexOf("#") != -1) ? true : false;
}

// Condition
if(hasHashtag(urlToCheck)) {
    // Do something if has
}
else {
    // Do something if doesn't
}

ผลตอบแทนtrueในกรณีนี้

ตามความคิดเห็นของ @ jon-skeet


0

นี่เป็นวิธีง่ายๆในการทดสอบ URL ของหน้าปัจจุบัน:

  function checkHash(){
      return (location.hash ? true : false);
  }

-2

บางครั้งคุณได้รับข้อความค้นหาแบบเต็มเช่น "#anchorlink? firstname = mark"

นี่คือสคริปต์ของฉันเพื่อรับค่าแฮช:

var hashId = window.location.hash;
hashId = hashId.match(/#[^?&\/]*/g);

returns -> #anchorlink

6
ไม่สามารถทำได้เนื่องจากแฮชจะถูกต่อท้ายสตริงเคียวรีและไม่ถูกส่งไปยังเซิร์ฟเวอร์ แฮชเวลาเดียวเท่านั้นที่จะปรากฏขึ้นก่อนที่สตริงข้อความค้นหาคือเมื่อคุณแก้ไข URL ด้วยมือ

1
ใช่ แต่บางครั้งคนส่ง URL ในรูปแบบนี้ นี่เป็นเพียงเพื่อให้คุณสามารถรับค่าแฮชเท่านั้นและละเลยผู้อื่น :)
markg
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.