나는 이것이 가능하지 않을 수도 있다고 생각하며 최선을 다해 설명 할 것입니다. 다음으로 제어되는 탭 (jquery 기반)이 포함 된 페이지가 있습니다.
이전 질문에서 다른 사용자가 제공 한대로이 코드를 사용하고 있습니다.
<script type="text/javascript">
$(function() {
$('html, body').animate({scrollTop:0}); // this is my "fix"
var tabContent = $(".tab_content");
var tabs = $("#menu li");
var hash = window.location.hash;
tabContent.not(hash).hide();
if(hash=="") {
$('#tab1').fadeIn();
}
tabs.find('[href=' + hash + ']').parent().addClass('active');
tabs.click(function() {
$(this).addClass('active').siblings().removeClass('active');
tabContent.hide();
var activeTab = $(this).find("a").attr("href");
$(activeTab).fadeIn();
return false;
});
});
</script>
이 코드는 “탭”페이지를 직접 방문 할 때 잘 작동합니다.
그러나 다른 페이지의 개별 탭에 연결해야합니다. 이렇게하려면 코드 window.location.hash
에 적절한 탭이 표시됩니다.
페이지는 “return false”때문에 앵커로 “점프”하지 않습니다.
그러나이 이벤트는 클릭 이벤트에서만 트리거됩니다. 따라서 다른 페이지에서 “탭”을 방문하면 “점프”효과가 트리거됩니다. 이 문제를 해결하기 위해 자동으로 페이지 상단으로 스크롤하지만, 이런 일이 발생하지 않았 으면합니다.
페이지가로드 될 때 “return false”를 시뮬레이션하여 앵커 “점프”가 발생하지 않도록하는 방법이 있습니까?
이것이 충분히 명확하기를 바랍니다.
감사
답변
수정 사항이 작동하지 않습니까? 질문을 올바르게 이해했는지 잘 모르겠습니다. 데모 페이지가 있습니까? 시도해 볼 수 있습니다.
if (location.hash) {
setTimeout(function() {
window.scrollTo(0, 0);
}, 1);
}
편집 : Windows의 Firefox, IE 및 Chrome에서 테스트되고 작동합니다.
편집 2 : 블록 setTimeout()
내부 로 이동 if
, @vsync 소품.
답변
여기 내 대답을 참조하십시오 : Stackoverflow 답변
트릭은 해시 태그를 최대한 빨리 제거하고 자신의 용도로 값을 저장하는 것입니다.
코드의 해당 부분을 $ () 또는 $ (window) .load () 함수에 넣지 않는 것이 중요합니다. 너무 늦고 브라우저가 이미 태그로 이동했기 때문입니다.
// store the hash (DON'T put this code inside the $() function, it has to be executed
// right away before the browser can start scrolling!
var target = window.location.hash,
target = target.replace('#', '');
// delete hash so the page won't scroll to it
window.location.hash = "";
// now whenever you are ready do whatever you want
// (in this case I use jQuery to scroll to the tag after the page has loaded)
$(window).on('load', function() {
if (target) {
$('html, body').animate({
scrollTop: $("#" + target).offset().top
}, 700, 'swing', function () {});
}
});
답변
어떤 탭에 있는지 추적하는 다른 방법이 있습니다. 아마도 쿠키 또는 숨겨진 필드의 값 등을 설정합니다.
페이지가로드되는 동안 점프하는 것을 원하지 않으면 해시 대신 다른 옵션 중 하나를 사용하는 것이 좋습니다. 해시를 선호하는 주된 이유는 정확히 원하는 것을 허용하기 때문입니다. ‘차단하고 싶어요.
또 다른 요점-해시 링크가 문서의 태그 이름과 일치하지 않으면 페이지가 점프하지 않으므로 해시를 계속 사용하려면 태그 이름이 다르게 지정되도록 콘텐츠를 조작 할 수 있습니다. 일관된 접두사를 사용하면 Javascript를 사용하여 그 사이를 이동할 수 있습니다.
도움이 되었기를 바랍니다.
답변
dave1010의 솔루션을 사용했지만 $ (). ready 함수 안에 넣었을 때 약간 불안했습니다. 그래서 나는 이것을했다 : ($ (). ready 내부가 아님)
if (location.hash) { // do the test straight away
window.scrollTo(0, 0); // execute it straight away
setTimeout(function() {
window.scrollTo(0, 0); // run it a bit later also for browser compatibility
}, 1);
}
답변
-
주소에 http://site.com/#abc 해시가 있고 id = “abc”인 요소가 표시
<element id="abc" />
되면 브라우저가 이동합니다 . 따라서 기본적으로 요소를 숨겨야합니다 .. 페이지에 id = hash로 표시된 요소가 없으면 브라우저가 점프하지 않습니다.<element id="anchor" style="display: none" />
-
URL에서 해시를 확인한 다음 prrpopriate 요소 (기본적으로 숨겨져 있음)를 찾아 표시하는 스크립트를 만듭니다.
-
onclick 이벤트를 링크에 바인딩하여 기본 “해시 유사 링크”동작을 비활성화하고 onclick 이벤트
return false;
의 결과로 지정 합니다.
탭을 구현할 때 다음과 같이 작성했습니다.
<script>
$(function () {
if (location.hash != "") {
selectPersonalTab(location.hash);
}
else {
selectPersonalTab("#cards");
}
});
function selectPersonalTab(hash) {
$("#personal li").removeClass("active");
$("a[href$=" + hash + "]").closest("li").addClass("active");
$("#personaldata > div").hide();
location.hash = hash;
$(hash).show();
}
$("#personal li a").click(function (e) {
var t = e.target;
if (t.href.indexOf("#") != -1) {
var hash = t.href.substr(t.href.indexOf("#"));
selectPersonalTab(hash);
return false;
}
});
</script>
답변
어떤 답변도 저에게 충분하지 않습니다. 페이지가 닻을 내리고 일부 솔루션의 경우 맨 위로 이동하는 것을 보며 일부 답변은 전혀 작동하지 않으며 몇 년 동안 변경 될 수 있습니다. 내 기능이 누군가에게 도움이되기를 바랍니다.
/**
* Prevent automatic scrolling of page to anchor by browser after loading of page.
* Do not call this function in $(...) or $(window).on('load', ...),
* it should be called earlier, as soon as possible.
*/
function preventAnchorScroll() {
var scrollToTop = function () {
$(window).scrollTop(0);
};
if (window.location.hash) {
// handler is executed at most once
$(window).one('scroll', scrollToTop);
}
// make sure to release scroll 1 second after document readiness
// to avoid negative UX
$(function () {
setTimeout(
function () {
$(window).off('scroll', scrollToTop);
},
1000
);
});
}
답변
더티 CSS는 앵커를 사용할 때마다 위로 스크롤되도록 수정합니다 (스크롤 점프에 앵커를 계속 사용하려는 경우에는 유용하지 않으며 딥 링크에 매우 유용함).
.elementsWithAnchorIds::before {
content: "";
display: block;
height: 9999px;
margin-top: -9999px; //higher thin page height
}
