#javascript #jquery #html #css
#javascript #jquery #HTML #css
Вопрос:
Я использовал этот точный код для другого элемента div, и он работает отлично. Когда я решил добавить тот же код в другой элемент div с другим идентификатором, он регистрирует, что элемент был нажат, но он не добавляет и не удаляет ни один из классов.
$('#quoteClick').click(function(){
$('#cbox-1').addClass('displayCboxBackground');
$('#cbox-2').removeClass('displayCboxBackground');
$('#cbox-3').removeClass('displayCboxBackground');
$('#dbox-1').addClass('displayBlock');
$('#dbox-2').removeClass('displayBlock');
$('#dbox-3').removeClass('displayBlock');
console.log("clicked");
});
Структура html выглядит следующим образом:
<div id="cbox-1">
<div id="dbox-1">
content...
</div>
</div>
<div id="cbox-2">
<div id="dbox-2">
content...
</div>
</div>
<div id="cbox-3">
<div id="dbox-3">
<div id="quoteClick">
a quote
</div>
</div>
</div>
JSFiddle: https://jsfiddle.net/m81c23cx/1 /
В скрипке вы можете видеть, что содержимое будет меняться при нажатии на каждый заголовок. При нажатии на элемент «quoteClick» я хочу, чтобы он менялся на содержимое второго заголовка точно так же, как это происходит при нажатии на второй заголовок.
Я вижу в консоли Chrome, что когда я нажимаю на элемент div, он выделяет все классы, но не изменяет ни один из них. У меня есть jQuery внутри document.ready()
функции, поэтому он должен ожидать загрузки DOM, и он отлично работает, когда я просто записываю строки в консоль.
Комментарии:
1. Вы получаете
clicked
текст в консоли при нажатии кнопки?2. Не могли бы вы также предоставить нам свой HTML
3. Вы также можете предоставить JSFiddle, где проблема может быть воспроизведена.
4. Вы уверены, что у вас нет нескольких элементов с одинаковым идентификатором?
5. Предоставьте свой фрагмент или скрипку, тогда его легко решить
Ответ №1:
Я удивлен, что никто на самом деле не подвергал сомнению ваше использование идентификаторов (вместо того, чтобы предлагать вам перепроверить дубликаты). Причина, по которой этот код трудно отлаживать, заключается в том, что он слишком сложный. В результате вам будет сложно исправить проблемы, подобные этой, и в будущем.
Отбросьте это, сделайте это лучше. Я даже не просматривал вашу скрипку. Вместо этого я собираюсь предложить вам полностью изменить свой подход.
Обновите свой HTML и используйте классы вместо идентификаторов. Что-то похожее на это:
<div class="cbox">
<div class="dbox">
content...
</div>
</div>
<div class="cbox">
<div class="dbox">
content...
</div>
</div>
<div class="cbox">
<div class="dbox">
<div id="quoteAdvert">
a quote
</div>
</div>
</div>
Обновите свой JavaScript и используйте this
для получения контекста текущего поля:
$('.cbox').click( function cboxClicked () {
// Remove the previous class from all .cbox amp; .dbox elements; we don't care which
$('.cbox').removeClass('displayCboxBackground')
$('.dbox').removeClass('displayBlock')
// Add a new class to the clicked .cbox amp; it's child .dbox
$(this).addClass('displayCboxBackground')
$(this).children('.dbox').addClass('displayBlock')
})
В чем прелесть этого? У вас может быть 1000 ящиков, он все равно будет работать. Нет необходимости добавлять какие-либо дополнительные строки кода.
Вот скрипка, показывающая это в действии.
Комментарии:
1. Предложения по дублированию были до того, как в вопросе появилась какая-либо ссылка на скрипку. Ваше решение правильное, красота кодов имеет значение, и простота должна управлять любым файлом JS, в противном случае он становится мусором. И в любом случае, в скрипке, я думаю, все происходит правильно, но в файле CSS нет класса CSS
displayCboxBackground
, поэтому ничего не происходит, просто переместите класс из элемента в другой.
Ответ №2:
Приведенный вами пример кода не соответствует созданному вами jsfiddle.
В вашей скрипке вы используете селектор jquery $('#quoteClick')
, но нет элемента с этим идентификатором. Однако есть элемент #quoteAdvert . Измените это, и вы увидите щелчок в консоли.
Комментарии:
1. Я изменил имя идентификатора, потому что кто-то предположил, что это могло быть вызвано блокировкой рекламы, блокирующей какое-либо взаимодействие, извините за несоответствие.
Ответ №3:
Свойство classList возвращает список маркеров атрибута class рассматриваемого элемента. К счастью для нас, он также поставляется с несколькими удобными методами:
- добавить — добавляет класс
- удалить — удаляет класс
- переключить — переключает класс
-
содержит — проверяет, существует ли класс
// добавляет класс «foo» в el el.classList.add(«foo»);
// удаляет класс «bar» из el el.classList.remove(«bar»);
// переключает класс «foo» el.classList.toggle(«foo»);
// выводит «true» на консоль, если el содержит «foo», «false», если не console.log( el.classList.contains(«foo»));
// добавить несколько классов в el el.classList.add( «foo», «bar»);