Динамически добавлять return false ко всем якорям с помощью # (с javascript или jquery)

У меня есть следующее меню в HTML:

На данный момент у меня есть жестко запрограммированныйonclick = "return false" прямо в HTML (см. Ниже). Я читал, что это плохая практика. Я хотел бы знать, как добавить return false (или e.preventdefault) ко всем привязкам с href # с jquery и / или javascript.

<div id = "bar" >
<label id = "toggle-label" for = "toggle-1">Menu</label>
<input type = "checkbox" id = "toggle-1">
    <ul class = "menu">
            <li><a href = "/">Home</a></li>
            <li><a href = "#" onclick = "return false;">Item with sub</a>
                <ul>
                    <li><a href = "https://google.com" target = "_blank">Sub 1.1</a></li>
                      <li><a href = "/something">Sub 1.2</a></li>
                </ul>
            </li>

            <li><a href = "#" onclick = "return false;">Item with sub-sub</a>
                <ul>
                    <li><a href = "/something">service-1</a></li>
                    <li><a href = "#" onclick = "return false;">Item with sub</a>
                        <ul>
                            <li><a href = "/something">sub sub 1</a></li>
                            <li><a href = "/something">sub sub 2</a></li>
                            <li><a href = "/something">sub sub 3</a></li>
                        </ul>
                    </li>
                    <li><a href = "/electrical">Electrical</a></li>
                </ul>
            </li>

                <li><a href = "/pricing">Pricing</a></li>
                <li><a href = "/contact">Contact Us</a></li>

    </ul>

</div>

Какую проблему вы пытаетесь решить, возвращая false по ссылке? Я знаю, что это отменяет действие, но вы не объяснили, какая проблема позволяет ссылке проходить через причины.

Taplar 13.11.2018 18:38

Когда это меню просматривается на маленьких экранах, щелчок, например, Товар с суб заставит страницу прокручиваться вверх из-за # в теге привязки.

Hakkelaar 13.11.2018 18:41

Хорошо, тогда следующий вопрос будет заключаться в том, какова цель создания ссылок на эти элементы, если они не собираются ничего делать?

Taplar 13.11.2018 18:42

Хороший вопрос. Только Товар с суб и Товар с подпунктом должны иметь #. Остальные должны пойти, например, в /contact и тому подобное.

Hakkelaar 13.11.2018 18:58

Я думаю, вы упускаете мою точку зрения. Вы размещаете якорную разметку на своей странице, но эффективно убиваете их от каких-либо действий. Единственная возможная причина, по которой вы это сделаете, - если бы вы использовали теги привязки, чтобы соответствовать какому-то стилю css по умолчанию на странице для ссылок. В этом случае, вместо того, чтобы «исправлять» ссылки, скорее всего, было бы лучше не делать их ссылками и использовать css для стилизации их так, как вы хотите, чтобы они выглядели.

Taplar 13.11.2018 19:00

Кажется, вам не хватает точки мой. Я изменил пример выше, чтобы продемонстрировать, что только несколько пунктов меню получают href #. Убивают только тех.

Hakkelaar 14.11.2018 19:23

Таким образом, только они не будут ссылками, что устранит необходимость их убивать. Вы еще не объяснили, почему все списки обязательно, без исключения, всегда должны быть ссылками. Даже те, которые никогда не должны использоваться в качестве ссылки

Taplar 14.11.2018 19:25

Я видел много руководств, в которых учат устанавливать для href элемента a значение #, если это просто родительский элемент, который не должен никуда связываться, а действует только как кнопка, чтобы показать его дочерним элементам. Например, когда вы составляете меню в Wordpress.

Hakkelaar 14.11.2018 19:52

Это все еще не отвечает Зачем, вы в первую очередь заставляете элементы быть ссылками. Установка href = "#" является допустимым случаем, если вы собираетесь прикрепить к ним логику страницы, например, вы нажимаете родительскую ссылку, и в результате у вас есть javascript, который обнаруживает вложенную вспомогательную логику или что-то в этом роде. Таким образом получается смысл. На это есть причина. В этом случае нет причины, по которой это должны быть ссылки в вашей разметке. Вы не придаете им никакой лишней логики. Единственная дополнительная логика, которую вы добавляете, - это убивать их как ссылки.

Taplar 14.11.2018 19:55

Да, точно. Это допустимый случай использования href = #. Но опять же, ваша логика не делает этого. Он вообще не использует ссылки.

Taplar 14.11.2018 19:58

Вы видели, что я изменил код в своем вопросе, чтобы показать, что в моем меню делает есть действительные ссылки?

Hakkelaar 14.11.2018 20:01

Мы не говорим о настоящих ссылках. Речь идет о ссылках href = "#". То, что у вас есть настоящие ссылки, не означает, что все должен быть ссылкой. Я не понимаю, почему вы продолжаете ссылаться на настоящие ссылки.

Taplar 14.11.2018 20:02

Хорошо. Вы предлагаете мне изменить parent-items с a на div или что-то в этом роде?

Hakkelaar 14.11.2018 20:03

да. Div или span или что-то в этом роде. Возможно, вам не понадобится родительский тег. li, являющегося родительским для нереальных ссылок, может быть достаточно. Я просто хочу убедиться, что вы понимаете, что происходит, и определить, действительно ли вам нужны эти ненастоящие теги a. Если вы этого не сделаете, этот вопрос об исправлении не нужен, :)

Taplar 14.11.2018 20:05

Хорошо, есть над чем подумать. Однако, насколько я знаю, это очень нормальная практика, чтобы сделать все элементами в li вашего a, просто для того, чтобы стилизовать их все вместе в css. Если вы добавляете span или div, вы должны стилизовать их отдельно. Меню, которые динамически создаются Wordpress, даже не имеют возможности создавать пункты меню, отличные от a. Буквально на первом сайте, который я открываю, есть элементы, не связанные с родительским меню, с a и #: canva.com/create/restaurant-menu

Hakkelaar 14.11.2018 20:07

Это не делает это хорошей практикой. Существует множество сайтов с плохим дизайном. И в дополнение к этому, большинство веб-сайтов не принимают во внимание, как разметка на их веб-сайтах будет (не) работать с программами чтения с экрана и другими программами обеспечения доступности, на которые полагаются пользователи, у которых есть проблемы со зрением или мобильностью, чтобы иметь возможность использовать их веб-сайты. Наличие поддельных ссылок на странице, которая ничего не делает, - очень быстрый способ запутать эти программы и сделать веб-сайты менее доступными для этих пользователей.

Taplar 14.11.2018 20:12

В следующий раз, когда у меня будет возможность составить меню вручную (и мне не придется иметь дело с динамически создаваемыми меню с a href с #), я подумаю о том, что вы сказали. Кстати, a заставляет браузер менять курсор на руку. Это еще одна вещь, которую нужно имитировать с помощью css cursor:hand.

Hakkelaar 14.11.2018 20:20

С CSS нетрудно сделать.

Taplar 14.11.2018 20:25

Хорошо, вы меня убедили. Мне действительно не нравится тот факт, что в моем меню есть a, которые на самом деле не являются ссылками, и какую функциональность я должен убить дополнительным и странным javascript, из которого я действительно не знаю, что он делает.

Hakkelaar 14.11.2018 20:32
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
19
109
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

выберите все якоря с href='#' с помощью селектора jQuery, затем добавьте к ним прослушиватель onclick.

var anchors = $("a[href='#']")
anchors.on("click", (ev) => {
  ev.preventDefault(); 
  console.clear()
  console.info("anchor clicked");
  return false
})
<script src = "https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id = "bar" >
<label id = "toggle-label" for = "toggle-1">Menu</label>
<input type = "checkbox" id = "toggle-1">
  <ul class = "menu">
    <li><a href = "#">Home</a></li>
    <li><a href = "#">Item with sub</a>
        <ul>
          <li><a href = "https://google.com" target = "_blank">Sub 1.1</a></li>
          <li><a href = "#">Sub 1.2</a></li>
        </ul>
    </li>
    <li><a href = "#">Item with sub-sub</a>
      <ul>
        <li><a href = "#">service-1</a></li>
        <li><a href = "#">Item with sub</a>
          <ul>
            <li><a href = "#">sub sub 1</a></li>
            <li><a href = "#">sub sub 2</a></li>
            <li><a href = "#">sub sub 3</a></li>
          </ul>
        </li>
        <li><a href = "#">Electrical</a></li>
      </ul>
    </li>
    <li><a href = "#">Pricing</a></li>
    <li><a href = "#">Contact Us</a></li>
  </ul>
</div>

Кажется, это отлично работает. Могу я спросить, в чем разница между return false и preventDefault()?

Hakkelaar 13.11.2018 18:48

return false предотвращает дефолт и останавливает распространение. Так что на самом деле вызов по умолчанию для предотвращения не нужен

Taplar 13.11.2018 18:49

да, это почти то же самое, используйте только один из них, я добавил оба только в качестве примеров использования.

Calvin Nunes 13.11.2018 18:50

@Taplar Является ли return false похожей на php-functions exit (); и / или die () ;? Чтобы остановить весь дальнейший код?

Hakkelaar 13.11.2018 19:00

Нет, die влияет на работу всего скрипта. return false влияет только на событие, обрабатываемое в данный момент.

Taplar 13.11.2018 19:00

$('li a[href = "#"]').on('click', function(event){ event.preventDefault(); });

Вы можете попробовать это.

это очень просто, вы можете попробовать это

нужно не только пытаться, но и понимать, и пытаться делать иначе, чем это.

$('a[href = "#"]').click(function (event) {
        return false;
});
<script src = "https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id = "bar" >
  <label id = "toggle-label" for = "toggle-1">Menu</label>
  <input type = "checkbox" id = "toggle-1">
      <ul class = "menu">
              <li><a href = "#">Home</a></li>
              <li><a href = "#" onclick = "return false;">Item with sub</a>
                  <ul>
                      <li><a href = "https://google.com" target = "_blank">Sub 1.1</a></li>
                        <li><a href = "#">Sub 1.2</a></li>
                  </ul>
              </li>

              <li><a href = "#" onclick = "return false;">Item with sub-sub</a>
                  <ul>
                      <li><a href = "#">service-1</a></li>
                      <li><a href = "#" onclick = "return false;">Item with sub</a>
                          <ul>
                              <li><a href = "#">sub sub 1</a></li>
                              <li><a href = "#">sub sub 2</a></li>
                              <li><a href = "#">sub sub 3</a></li>
                          </ul>
                      </li>
                      <li><a href = "#">Electrical</a></li>
                  </ul>
              </li>

                  <li><a href = "#">Pricing</a></li>
                  <li><a href = "#">Contact Us</a></li>

      </ul>

  </div>

тогда сделай это [href = "#"] 'его простой чувак

dev_ramiz_1707 13.11.2018 18:47

Другие вопросы по теме