자바 스크립트를 사용하여 앵커 점프


129

매우 자주 발견되는 질문이 있습니다. 문제는 명백한 해결책을 찾을 수 없다는 것입니다.

앵커와 관련하여 두 가지 문제가 있습니다.

주요 목표는 앵커를 사용하여 페이지에서 점프하는 동안 해시없이 깔끔한 URL을 얻는 것입니다.

앵커의 구조는 다음과 같습니다.

<ul>
    <li><a href="#one">One</a></li>
    <li><a href="#two">Two</a></li>
    <li><a href="#three">Three</a></li>
</ul>

<div class="wrap">
    <a name="one">text 1</a>
    <a name="two">text 2</a>
    <a name="three" class="box">text 3</a>
</div>

링크 중 하나를 클릭하면 URL이 자동으로

www.domain.com/page#1

결국 이것은 다음과 같아야합니다.

www.domain.com/page

여태까지는 그런대로 잘됐다. 두 번째는 인터넷에서 해당 문제를 검색 할 때 javascript해결책으로 찾을 수 있습니다.

이 기능을 찾았습니다.

function jumpto(anchor){
    window.location.href = "#"+anchor;
}

그리고 그 기능을 다음과 같이 호출합니다.

<a onclick="jumpto('one');">One</a>

이전과 같은 것이 무엇입니까? URL에 해시를 추가합니다. 나는 또한 추가했다

<a onclick="jumpto('one'); return false;">

성공없이. 따라서이 문제를 해결하는 방법을 알려주는 사람이 있다면 정말 감사하겠습니다.

고마워


확실하지 않지만 점프 후 해시 속성에 수동으로 쓸 수 있습니다. 예를 들어 onclick 핸들러에서 시간 초과를 설정하여를 설정합니다 window.location.hash=''.
Jeff

같은 웹 페이지의 다른 섹션으로 이동할 때 URL에 #을 표시하고 싶지 않다는 의미입니까?
Roger Ng

2
이 경우 일반적으로 window.scrollTo또는 해당 jQuery 도우미에 의해 창의 scrollTop을 조작해야합니다 . stackoverflow.com/questions/6677035/jquery-scroll-to-element 또는 stackoverflow.com/questions/500336/…
Frank van Puffelen

@Jeff-당신이 할 location.hash=''경우, #남아 있습니다.
Derek 朕 會 功夫

그렇게하지 마십시오. 책갈피에 페이지를 저장할 때 해시가 좋습니다.
Marco Sulla

답변:


204

대상 요소의 좌표를 가져 와서 스크롤 위치를 설정할 수 있습니다. 그러나 이것은 너무 복잡합니다.

이를 수행하는 게으른 방법은 다음과 같습니다.

function jump(h){
    var url = location.href;               //Save down the URL without hash.
    location.href = "#"+h;                 //Go to the target element.
    history.replaceState(null,null,url);   //Don't like hashes. Changing it back.
}

이것은 replaceStateURL을 조작하는 데 사용 됩니다. IE 지원을 원한다면 복잡한 방법으로 수행해야합니다 .

function jump(h){
    var top = document.getElementById(h).offsetTop; //Getting Y of target element
    window.scrollTo(0, top);                        //Go there directly or some transition
}​

데모 : http://jsfiddle.net/DerekL/rEpPA/
전환이있는 또 하나 : http://jsfiddle.net/DerekL/x3edvp4t/

당신은 또한 사용할 수 있습니다 .scrollIntoView:

document.getElementById(h).scrollIntoView();   //Even IE6 supports this

(잘 거짓말 했어. 전혀 복잡하지 않아.)


1
쥐 !! 링크가 깨진 :-( 내가 JS 바이올린 영원히 거기에 머물렀다 생각
Mawg는 분석 재개 모니카 말한다

1
@Mawg 분명히 /showURL 끝에 add를 사용하는 기능을 제거했습니다 .
Derek 朕 會 功夫

11
"IE6조차도 이것을 지원합니다"는 내가 본 최고의 의견입니다.
Josh

3
@Black "jQuery"요소는 없습니다. 쿼리에서 첫 번째 요소를 가져 오려면을 수행하십시오 $(mySelector)[0].scrollIntoView().
Derek 朕 會 功夫

4
의 경우 1+입니다 scrollIntoView. 1- 마지막으로 언급했습니다.
Yay295

12

훨씬 간단한 해결책이라고 생각합니다.

window.location = (""+window.location).replace(/#[A-Za-z0-9_]*$/,'')+"#myAnchor"

이 방법은 웹 사이트를 다시로드 하지 않으며 화면 판독기에 필요한 앵커에 초점 을 설정합니다 .


그리고 IE에서 거의 작동하지 않는 것은 모든 IE에서 작동합니다.)
Adam111p

5
나는 결국window.location = window.location.origin + window.location.pathname + '#hash';
Alex

이것은 나를 위해 페이지를 다시로드했습니다. 수락 된 답변은 효과가 있었지만 더 짧기를 바랍니다.
HoldOffHunger 2016 년

3

댓글에 대한 담당자가 충분하지 않습니다.

앵커가 설정 name했지만 id설정하지 않은 경우 (권장하지 않지만 야생에서 발생하는 경우) 선택한 답변의 getElementById () 기반 메소드가 작동 하지 않습니다.

문서 마크 업 (예 : 웹 확장)을 제어 할 수없는 경우 염두에 두어야 할 사항입니다.

location선택한 답변 의 기반 방법을 다음과 location.replace같이 단순화 할 수도 있습니다 .

function jump(hash) { location.replace("#" + hash) }

1

당신이 할 때 때문에

window.location.href = "#"+anchor;

새 페이지를로드하면 다음을 수행 할 수 있습니다.

<a href="#" onclick="jumpTo('one');">One</a>
<a href="#" id="one"></a>

<script>

    function getPosition(element){
        var e = document.getElementById(element);
        var left = 0;
        var top = 0;

        do{
            left += e.offsetLeft;
            top += e.offsetTop;
        }while(e = e.offsetParent);

        return [left, top];
    }

    function jumpTo(id){    
        window.scrollTo(getPosition(id));
    }

</script>

3
해시를 추가하면 새 페이지가 될 것이라고 생각하지 않습니다.
Derek 朕 會 功夫

5
페이지를 다시로드하지 않습니다.
Derek 朕 會 功夫

페이지를 다시로드하지 않는 것이 맞습니다. 크롬 콘솔에서 시도하고 파비콘이 다시로드됩니다.
Jonathan Vukovich-Tribouharet

최신 Firefox에서는 해시 변경으로 인해 src 속성에서 iFrame을 다시로드해야합니다. 나는 이것을 브라우저 버그라고 생각하지만 알고 있어야 할 것입니다.
Beejor

1

클릭하면 디스플레이 대화 상자가 열리고 검색하려는 내용을 쓸 수 있으며 페이지의 해당 위치로 이동하라는 프롬프트 버튼이 있습니다. 자바 스크립트를 사용하여 헤더에 응답합니다.

.html 파일에서 나는 가지고있다 :

<button onclick="myFunction()">Load Prompt</button>
<span id="test100"><h4>Hello</h4></span>

.js 파일에서 나는

function myFunction() {
    var input = prompt("list or new or quit");

    while(input !== "quit") {
        if(input ==="test100") {
            window.location.hash = 'test100';
            return;
// else if(input.indexOf("test100") >= 0) {
//   window.location.hash = 'test100';
//   return;
// }
        }
    }
}

내가 쓸 때 test100을 프롬프트로, 그것은 내가 html 파일에 스팬 ID = "test100을"이있는 위치로 이동합니다.

Chrome을 사용합니다.

참고 :이 아이디어는 같은 페이지에서

<a href="#test100">Test link</a>

클릭하면 앵커로 전송됩니다. 경험에서 여러 번 작동하려면 페이지를 다시로드해야합니다.

stackoverflow (그리고 아마도 stackexchange) 사람들에게 신용은 내가 모든 비트와 조각을 모은 방법을 기억할 수 없습니다. ☺

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.