onClick JS не go к началу страницы - PullRequest
1 голос
/ 16 февраля 2020

У меня есть страница с начальным описанием, за которой следуют 2 кнопки, где пользователь может выбрать тип A или тип B. Они работают по «цели»: когда пользователь нажимает на typeA, появляется контент, относящийся к typeA, ниже кнопок; то же самое для typeB.

typeA является наиболее распространенным выбором, тогда, когда страница загружается, javascript эмулирует щелчок для typeA и открывает соответствующий контент. Чтобы избежать скрытия исходного описания, есть еще javascript для размещения страницы вверху. Работал на Chrome и Edge, а не на Firefox.

Я хотел бы повторить тот же процесс, когда пользователь нажимает: открывает соответствующий контент, но позиционирует страницу сверху или, по крайней мере, , показывая кнопки. Я думал, что событие onClick, вызывающее тот же js backToTop, сработало бы - но не.

Я поставил предупреждение на js и вошел туда, но не выполнил: всегда сохраняет содержимое выбранной кнопки в ее лучшей видимости .

Я пытался:

window.location.href = '#top';
window.scrollBy(0, -500);
document.html.scrollTop = document.documentElement.scrollTop = 0;

безуспешно.

Что я делаю не так?

<head>

<meta charset="UTF-8">
<title>TOP PAGE TEST</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
  
<style>
body,html {margin-left:auto; margin-right:auto;width:70%; font-family:verdana; font-size:1.2em;}
.menuFAQ {background:#aaa; font-size:2em; width:100%;}
    .menuFAQ ul {list-style-type:none; position:relative; margin-left:-40px; /* to avoid user agent chrome */}
.menuFAQ li {display:inline-block; margin-top:10px; margin-bottom:10px; width:49%; background:#fff; text-align:center; box-shadow:2px 3px 4px 0px rgba(170,170,170,1); font-weight:400; line-height:80px;}   
.menuFAQ li a {display:block; color:#020062; background:#fff; font-weight:400; text-decoration:none;}
.menuFAQ li .active,.menuFAQ li:hover a {color:#fff; font-weight:400; background-image:linear-gradient(#165686, #0f3a5a); }

:target {color:#fff;font-size:1em;}

div.items>div:not(:target) {display:none}
div.items>div:target {display:block; margin-left:auto; margin-right:auto; color:#000; border:1px solid #aaa;}
</style>
	
</head>
<body>
<div id="top">Top Page</div>

<br>textExp1<br>textExp2<br>textExp3<br>textExp4<br>textExp5

<div class="menuFAQ">
  <ul>
    <li><a id="preferedFAQ" onclick="backToTop()" class="target" href="#typeA">TypeA</a></li>
    <li><a                  onclick="backToTop()" class="target" href="#typeB">TypeB</a></li>
  </ul>
</div>

<div class="items">
  <div id="typeA">
    <nav>
      A long and variable text size to explain TypeA  <br>text1A<br>text2A<br>text3A<br>text4A<br>text5A<br>text6A<br>text7A<br>text8A<br>text9A<br>textAA<br>textBA<br>textCA<br>textDA
      <br>[...]
    </nav>
  </div>
</div>

<div class="items">
  <div id="typeB">
    <nav>
      A long and variable text size to explain TypeB
      <p>text1B</p><p>text2B</p><p>text3B</p>
      <br>[...]
    </nav>
  </div>
</div>

  
<script>
const allTargetLinks = document.querySelectorAll('.target')

allTargetLinks.forEach(targetLink => {
   targetLink.addEventListener('click', () => {
        allTargetLinks.forEach(targetLink => {
           targetLink.classList.remove('active')
        })
   targetLink.classList.add('active')
   })
})

window.onload = function() {assignPreferedFAQ()};

function assignPreferedFAQ() {
    document.getElementById("preferedFAQ").click();
    backToTop();
};
 
function backToTop() {
   //document.html.scrollTop = document.documentElement.scrollTop = 0;
   //document.body.scrollTop = document.documentElement.scrollTop = 0;
	
     document.body.scrollTop = 0;
     document.documentElement.scrollTop = 0;
};
</script>

Ответы [ 2 ]

1 голос
/ 06 марта 2020

У вас был настоящий беспорядок относительно того, как вы обрабатываете click события и атрибут href, то есть:

  • У вас был атрибут onclick в ваших ссылках, и вы добавляли еще один слушатель их в JS
  • Вы не event.preventDefault() в своей функции, и поведение браузера по умолчанию, когда вы нажимаете на ссылку, чтобы получить вам его href путь

Я немного прибрался и кое-что изменил. Поскольку нам нужно предотвратить поведение по умолчанию, селектор :target больше не будет работать, поэтому вместо этого я сделал то, что вы уже делали со ссылками, и добавил к вашему контенту класс active. clickHandler() теперь будет удалять и добавлять класс active по мере необходимости. В конце просто прокрутите вверх. Вот фрагмент:

document.querySelectorAll('.target').forEach(targetLink => targetLink.addEventListener('click', clickHandler, false));


function clickHandler(ev) {
  ev.preventDefault(); // prevent browser from automatically scrolling to href pos
  
  if (!ev.currentTarget.classList.contains('active')) {
    // disable active elements
    document.querySelector('.target.active').classList.remove('active');
    document.querySelector('.items div.active').classList.remove('active');

    // add class to the clicked on button and its corresponding content tab
    ev.currentTarget.classList.add('active');
    
    // to prevent pointless string slicing below, you'd have to store ids somewhere else i.e in the data-id attribute
    const id = ev.currentTarget.href.slice(ev.currentTarget.href.lastIndexOf('#') + 1);
    document.getElementById(id).classList.add('active');
  }
  
  window.scrollTo(0,0);
}
* {
  font-family: verdana;
  font-size: 1em;
}

.menuFAQ {
  background: #aaa;
  font-size: 2em;
  width: 100%;
}

.menuFAQ ul {
  list-style-type: none;
  text-align: center;
  padding: 0;

  /* to avoid user agent chrome */
}

.menuFAQ li {
  display: inline-block;
  width: 48%;
  margin-top: 10px;
  margin-bottom: 10px;
  background: #fff;
  text-align: center;
  box-shadow: 2px 3px 4px 0px rgba(170, 170, 170, 1);
  font-weight: 400;
  line-height: 80px;
}

.menuFAQ li a {
  display: block;
  color: #020062;
  background: #fff;
  font-weight: 400;
  text-decoration: none;
}

.menuFAQ li .active,
.menuFAQ li:hover a {
  color: #fff;
  font-weight: 400;
  background-image: linear-gradient(#165686, #0f3a5a);
}

div.items>div {
  display: none;
}

div.items>div.active {
  display: block;
  margin-left: auto;
  margin-right: auto;
  color: #000;
  border: 1px solid #aaa;
}
<div id="top">Top Page</div>

<br>textExp1<br>textExp2<br>textExp3<br>textExp4<br>textExp5

<div class="menuFAQ">
  <ul>
    <li><a class="target active" href="#typeA">TypeA</a></li>
    <li><a class="target" href="#typeB">TypeB</a></li>
  </ul>
</div>

<div class="items">
  <div class="active" id="typeA">
    <nav>
      A long and variable text size to explain TypeA <br>text1A<br>text2A<br>text3A<br>text4A<br>text5A<br>text6A<br>text7A<br>text8A<br>text9A<br>textAA<br>textBA<br>textCA<br>textDA
      <br>[...]
    </nav>
  </div>
</div>

<div class="items">
  <div id="typeB">
    <nav>
      A long and variable text size to explain TypeB
      <p>text1B</p>
      <p>text2B</p>
      <p>text3B</p>
      <br>[...]
    </nav>
  </div>
</div>

Обратите внимание, что вместо искусственного нажатия на загрузку страницы, теперь ваш контент просто загружается с классом active.

0 голосов
/ 16 февраля 2020

Надеюсь, это поможет вам.

< script >
  window.onload = function() {
    document.getElementById("preferedFAQ").click();
    backToTop();
  };

function backToTop() {
  document.documentElement.scrollTop = document.body.scrollTop = 0;
  //alert("enter backToTop");
  var elmnt = document.getElementById("top");
  var x = elmnt.scrollLeft;
  var y = elmnt.scrollTop;
}; <
/script>
body,
html {
  margin-left: auto;
  margin-right: auto;
  width: 70%;
  font-family: verdana;
  font-size: 1.2em;
}

.menuFAQ {
  background: #aaa;
  font-size: 2em;
  width: 100%;
}

.menuFAQ ul {
  list-style-type: none;
  position: relative;
  margin-left: -40px;
  /* to avoid user agent chrome */
}

.menuFAQ li {
  display: inline-block;
  margin-top: 10px;
  margin-bottom: 10px;
  width: 49%;
  background: #fff;
  text-align: center;
  box-shadow: 2px 3px 4px 0px rgba(170, 170, 170, 1);
  font-weight: 400;
  line-height: 80px;
}

.menuFAQ li a {
  display: block;
  color: #020062;
  background: #fff;
  font-weight: 400;
  text-decoration: none;
}

.menuFAQ li .active,
.menuFAQ li:hover a {
  color: #fff;
  font-weight: 400;
  background-image: linear-gradient(#165686, #0f3a5a);
}

:target {
  color: #fff;
  font-size: 1em;
}

div.items>div:not(:target) {
  display: none
}

div.items>div:target {
  display: block;
  margin-left: auto;
  margin-right: auto;
  color: #000;
  border: 1px solid #aaa;
}
<div id="top">Top Page</div> <br>textExp1<br>textExp2<br>textExp3<br>textExp4<br>textExp5<br>textExp6<br>textExp7<br>textExp8<br>textExp9<br>textExpA<br>textExpB<br>textExpC<br>textExpD
<br>textExpE

<div class="menuFAQ">
  <ul>
    <li><a id="preferedFAQ" onclick="backToTop()" class="target" href="#typeA">TypeA</a></li>
    <li><a onclick="backToTop()" class="target" href="#typeB">TypeB</a></li>
  </ul>
</div>

<div class="items">
  <div id="typeA">
    <nav>
      A long and variable text size to explain TypeA <br>text1A<br>text2A<br>text3A<br>text4A<br>text5A<br>text6A<br>text7A<br>text8A<br>text9A<br>textAA<br>textBA<br>textCA<br>textDA
      <br>[...]
    </nav>
  </div>
</div>

<div class="items">
  <div id="typeB">
    <nav>
      A long and variable text size to explain TypeB
      <p>text1B</p>
      <p>text2B</p>
      <p>text3B</p>
      <br>[...]
    </nav>
  </div>
  </di
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...