#javascript #html #jquery
Вопрос:
У меня есть меню с несколькими кнопками, каждая из которых имеет свой класс .categorieknop
. При нажатии на эту кнопку я хочу загрузить все изображения с определенным классом, заменив src
. Это работает, за исключением того, что я хочу, чтобы все изображения загружались сразу, и независимо от того, что .categorieknop
нажато, никогда не запускайте его снова, пока страница не будет перезагружена.
Поэтому я сделал это:
$('.categorieknop').one("click", function(e) {
console.log('test');
$(".prodmenuimg" ).each(function() {
$datasrc = $(this).attr('data-src');
$(this).attr("src", $datasrc);
});
});
У каждого изображения есть свой класс .prodmenuimg
. При нажатии .categorieknop
все изображения загружаются, но когда я нажимаю на другую кнопку .categorieknop
, все они загружаются снова. Это происходит один раз за каждый .categorieknop
мой щелчок.
Как я могу быть уверен, что независимо от того, какой из них будет нажат, он всегда будет запускаться только один раз, а если .categorieknop
после этого будет нажат другой, он больше не будет запускаться?
Я думал one
, что сделал это, но я думаю, что когда есть несколько элементов с одним и тем же классом, эта функция срабатывает один раз для каждого из них.
Моя структура html, если это имеет значение:
<span class="animate__animated animate__faster" id="menu1">
<li>
<a class="categorieknop activecategorieknop" href="javascript:void(0);"><i class="menu-afb icon-woonkamer"></i> <span>Woonkamer</span></a>
<div id="prodmenu" class="product-menu menuflex">
<div class="productmenucontainer">
<div class="producten">
<div class="productgroup">
<h2 class="productmenukop">Woonkamer</h2>
<ul class="fivecolumns">
<li>
<a href="plaat/foto-op-hout"><img class="prodmenuimg" data-src="cms/images/Impressies/603_1bc1d5ebfe2bc86f_21.jpg" src="cms/images/Impressies/603_1bc1d5ebfe2bc86f_21.jpg" />Foto op hout</a>
</li>
<li>
<a href="plaat/foto-op-paneel">
<img class="prodmenuimg" data-src="cms/images/producten/foto-op-paneel/thumbnail/Dibond_butler_finish_1.jpg" src="cms/images/producten/foto-op-paneel/thumbnail/Dibond_butler_finish_1.jpg" />Foto op paneel
</a>
</li>
<li>
<a href="plaat/fotoblok">
<img class="prodmenuimg" data-src="cms/images/producten/fotoblok/afbeeldingen/604_30ce36618aa6d545_2.jpg" src="cms/images/producten/fotoblok/afbeeldingen/604_30ce36618aa6d545_2.jpg" />Fotoblok
</a>
</li>
<li>
<a href="folie/muursticker">
<img class="prodmenuimg" data-src="cms/images/producten/muursticker/afbeeldingen/2017_23e4cfbbe228dd0b_2.jpg" src="cms/images/producten/muursticker/afbeeldingen/2017_23e4cfbbe228dd0b_2.jpg" />Muursticker
</a>
</li>
<li>
<a href="textiel/bedrukken-naadloos-fotobehang-printen">
<img
class="prodmenuimg"
data-src="cms/images/producten/bedrukken-naadloos-fotobehang-printen/thumbnail/Naadloosbehang_makkelijk_aanbrengen.jpg"
src="cms/images/producten/bedrukken-naadloos-fotobehang-printen/thumbnail/Naadloosbehang_makkelijk_aanbrengen.jpg"
/>
Naadloos fotobehang
</a>
</li>
<li>
<a href="folie/raamsticker">
<img class="prodmenuimg" data-src="cms/images/producten/raamsticker/thumbnail/1_Raamsticker_privacy.jpg" src="cms/images/producten/raamsticker/thumbnail/1_Raamsticker_privacy.jpg" />Raamsticker
</a>
</li>
<li>
<a href="textiel/tafelkleed">
<img
class="prodmenuimg"
data-src="cms/images/producten/tafelkleed/afbeeldingen/1_Tafelkleed_met_foto_uit_website_studio.jpg"
src="cms/images/producten/tafelkleed/afbeeldingen/1_Tafelkleed_met_foto_uit_website_studio.jpg"
/>
Salon tafelkleed
</a>
</li>
<li>
<a href="textiel/sierkussens-binnen">
<img class="prodmenuimg" data-src="cms/images/producten/sierkussens-binnen/afbeeldingen/sierkussen_1.jpg" src="cms/images/producten/sierkussens-binnen/afbeeldingen/sierkussen_1.jpg" />Sierkussens binnen
</a>
</li>
<li>
<a href="textiel/wandkleed">
<img class="prodmenuimg" data-src="cms/images/producten/wandkleed/afbeeldingen/1_wandkleed_met_je_eigen_foto.jpg" src="cms/images/producten/wandkleed/afbeeldingen/1_wandkleed_met_je_eigen_foto.jpg" />
Wandkleed
</a>
</li>
<li>
<a href="folie/zandstraalfolie">
<img
class="prodmenuimg"
data-src="cms/images/producten/zandstraalfolie/afbeeldingen/7ED3F649-4149-49CC-B831-5D15E4376788.jpg"
src="cms/images/producten/zandstraalfolie/afbeeldingen/7ED3F649-4149-49CC-B831-5D15E4376788.jpg"
/>
Zandstraalfolie
</a>
</li>
<li>
<a href="textiel/zitzak">
<img class="prodmenuimg" data-src="cms/images/producten/zitzak/afbeeldingen/1_1815_d2c031dca10bfc12_1.jpg" src="cms/images/producten/zitzak/afbeeldingen/1_1815_d2c031dca10bfc12_1.jpg" />Zitzak
</a>
</li>
</ul>
</div>
</div>
</div>
<div class="absolutemenuimg">
<img src="cms/images/menu_afbeeldingen/woonkamer_3d.jpg" />
<p class="menucatalogusbtn"><a class="purplebtn btnstyle" href="catalogus/woonkamer">Bekijk de woonkamer</a></p>
</div>
</div>
</li>
<li>
<a class="categorieknop" href="javascript:void(0);"><i class="menu-afb icon-slaapkamer"></i> <span>Slaapkamer</span></a>
<div id="prodmenu" class="product-menu menunone">
<div class="productmenucontainer">
<div class="producten">
<div class="productgroup">
<h2 class="productmenukop">Slaapkamer</h2>
<ul class="fivecolumns">
<li>
<a href="plaat/blind-ophangsysteem">
<img
class="prodmenuimg"
data-src="cms/images/producten/blind-ophangsysteem/afbeeldingen/1157_7725c8ceac772b8b_1.jpg"
src="cms/images/producten/blind-ophangsysteem/afbeeldingen/1157_7725c8ceac772b8b_1.jpg"
/>
Blind ophangsysteem
</a>
</li>
<li>
<a href="plaat/deelpaneel">
<img class="prodmenuimg" data-src="cms/images/producten/deelpaneel/afbeeldingen/_deelpaneel_foto_op_rvs.jpg" src="cms/images/producten/deelpaneel/afbeeldingen/_deelpaneel_foto_op_rvs.jpg" />Deelpaneel
</a>
</li>
<li>
<a href="textiel/dekbedovertrek">
<img
class="prodmenuimg"
data-src="cms/images/producten/dekbedovertrek/afbeeldingen/3_Dekbedovertrek_kunst_en_nogeens_kunst.jpg"
src="cms/images/producten/dekbedovertrek/afbeeldingen/3_Dekbedovertrek_kunst_en_nogeens_kunst.jpg"
/>
Dekbedovertrek
</a>
</li>
<li>
<a href="plaat/foto-op-hout">
<img class="prodmenuimg" data-src="cms/images/producten/foto-op-hout/thumbnail/602_5b1e2c156babed4c_2_2.jpg" src="cms/images/producten/foto-op-hout/thumbnail/602_5b1e2c156babed4c_2_2.jpg" />Foto op hout
</a>
</li>
<li>
<a href="plaat/foto-op-paneel">
<img class="prodmenuimg" data-src="cms/images/producten/foto-op-paneel/thumbnail/Dibond_butler_finish_1_thumb.jpg" src="cms/images/producten/foto-op-paneel/thumbnail/Dibond_butler_finish_1_thumb.jpg" />
Foto op paneel
</a>
</li>
<li>
<a href="plaat/fotoblok">
<img class="prodmenuimg" data-src="cms/images/producten/fotoblok/afbeeldingen/1_Fotoblok_verschillende_maten.jpg" src="cms/images/producten/fotoblok/afbeeldingen/1_Fotoblok_verschillende_maten.jpg" />
Fotoblok
</a>
</li>
<li>
<a href="textiel/kussensloop">
<img
class="prodmenuimg"
data-src="cms/images/producten/kussensloop/afbeeldingen/1_Kussensloop_kunst_en_nogeens_kunst.jpg"
src="cms/images/producten/kussensloop/afbeeldingen/1_Kussensloop_kunst_en_nogeens_kunst.jpg"
/>
Kussensloop
</a>
</li>
<li>
<a href="plaat/muurcirkel">
<img class="prodmenuimg" data-src="cms/images/producten/muurcirkel/afbeeldingen/Muurcirkel_eigen_ontwerp.jpg" src="cms/images/producten/muurcirkel/afbeeldingen/Muurcirkel_eigen_ontwerp.jpg" />Muurcirkel
</a>
</li>
<li>
<a href="folie/muursticker">
<img class="prodmenuimg" data-src="cms/images/producten/muursticker/afbeeldingen/2016_75cb3d20928b7c9b_2.jpg" src="cms/images/producten/muursticker/afbeeldingen/2016_75cb3d20928b7c9b_2.jpg" />Muursticker
</a>
</li>
<li>
<a href="textiel/bedrukken-naadloos-fotobehang-printen">
<img
class="prodmenuimg"
data-src="cms/images/producten/bedrukken-naadloos-fotobehang-printen/thumbnail/Naadloosbehang_makkelijk_aanbrengen_thumb.jpg"
src="cms/images/producten/bedrukken-naadloos-fotobehang-printen/thumbnail/Naadloosbehang_makkelijk_aanbrengen_thumb.jpg"
/>
Naadloos fotobehang
</a>
</li>
<li>
<a href="folie/raamsticker">
<img class="prodmenuimg" data-src="cms/images/producten/raamsticker/thumbnail/1_Raamsticker_privacy.jpg" src="cms/images/producten/raamsticker/thumbnail/1_Raamsticker_privacy.jpg" />Raamsticker
</a>
</li>
<li>
<a href="textiel/sierkussens-binnen">
<img class="prodmenuimg" data-src="cms/images/producten/sierkussens-binnen/afbeeldingen/sierkussen_3.jpg" src="cms/images/producten/sierkussens-binnen/afbeeldingen/sierkussen_3.jpg" />Slaapkamer kussens
</a>
</li>
<li>
<a href="textiel/textielwand">
<img class="prodmenuimg" data-src="cms/images/producten/textielframe/afbeeldingen/4_1289_1cdc813e6fc6e815_1.jpg" src="cms/images/producten/textielframe/afbeeldingen/4_1289_1cdc813e6fc6e815_1.jpg" />
Textielwand
</a>
</li>
<li>
<a href="folie/zandstraalfolie">
<img
class="prodmenuimg"
data-src="cms/images/producten/zandstraalfolie/afbeeldingen/7ED3F649-4149-49CC-B831-5D15E4376788.jpg"
src="cms/images/producten/zandstraalfolie/afbeeldingen/7ED3F649-4149-49CC-B831-5D15E4376788.jpg"
/>
Zandstraalfolie
</a>
</li>
<li>
<a href="textiel/zitzak"><img class="prodmenuimg" data-src="cms/images/producten/zitzak/thumbnail/zitzak-1_thumb.jpg" src="cms/images/producten/zitzak/thumbnail/zitzak-1_thumb.jpg" />Zitzak</a>
</li>
</ul>
</div>
</div>
</div>
<div class="absolutemenuimg">
<img src="cms/images/menu_afbeeldingen/slaapkamer_3d.jpg" />
<p class="menucatalogusbtn"><a class="purplebtn btnstyle" href="catalogus/slaapkamer">Bekijk de slaapkamer</a></p>
</div>
</div>
</li>
<li>
<a class="categorieknop" href="javascript:void(0);"><i class="menu-afb icon-keuken"></i> <span>Keuken</span></a>
<div id="prodmenu" class="product-menu menunone">
<div class="productmenucontainer">
<div class="producten">
<div class="productgroup">
<h2 class="productmenukop">Keuken</h2>
<ul class="fivecolumns">
<li>
<a href="plaat/foto-op-paneel">
<img class="prodmenuimg" data-src="cms/images/producten/foto-op-paneel/thumbnail/Dibond_butler_finish_1_thumb.jpg" src="cms/images/producten/foto-op-paneel/thumbnail/Dibond_butler_finish_1_thumb.jpg" />
Foto op paneel
</a>
</li>
<li>
<a href="plaat/keuken-achterwand">
<img
class="prodmenuimg"
data-src="cms/images/producten/keuken-achterwand/afbeeldingen/Keukenachterwand_uniek_met_eigen_ontwerp.jpg"
src="cms/images/producten/keuken-achterwand/afbeeldingen/Keukenachterwand_uniek_met_eigen_ontwerp.jpg"
/>
Keuken achterwand
</a>
</li>
<li>
<a href="plaat/muurcirkel">
<img class="prodmenuimg" data-src="cms/images/producten/muurcirkel/afbeeldingen/Muurcirkel_eigen_ontwerp.jpg" src="cms/images/producten/muurcirkel/afbeeldingen/Muurcirkel_eigen_ontwerp.jpg" />Muurcirkel
</a>
</li>
<li>
<a href="folie/muursticker">
<img class="prodmenuimg" data-src="cms/images/producten/muursticker/afbeeldingen/2017_23e4cfbbe228dd0b_2.jpg" src="cms/images/producten/muursticker/afbeeldingen/2017_23e4cfbbe228dd0b_2.jpg" />Muursticker
</a>
</li>
<li>
<a href="textiel/bedrukken-naadloos-fotobehang-printen">
<img
class="prodmenuimg"
data-src="cms/images/producten/bedrukken-naadloos-fotobehang-printen/thumbnail/Naadloosbehang_makkelijk_aanbrengen_thumb.jpg"
src="cms/images/producten/bedrukken-naadloos-fotobehang-printen/thumbnail/Naadloosbehang_makkelijk_aanbrengen_thumb.jpg"
/>
Naadloos fotobehang
</a>
</li>
<li>
<a href="papier-karton/placemats">
<img class="prodmenuimg" data-src="cms/images/producten/placemats/thumbnail/1404_9735a303173c73c3_thumb.jpg" src="cms/images/producten/placemats/thumbnail/1404_9735a303173c73c3_thumb.jpg" />Placemats
papier
</a>
</li>
<li>
<a href="textiel/placemats-textiel">
<img
class="prodmenuimg"
data-src="cms/images/producten/placemats-textiel/afbeeldingen/Placemat_textiel_eigen_ontwerp.jpg"
src="cms/images/producten/placemats-textiel/afbeeldingen/Placemat_textiel_eigen_ontwerp.jpg"
/>
Placemats textiel
</a>
</li>
<li>
<a href="textiel/sierkussens-binnen">
<img class="prodmenuimg" data-src="cms/images/producten/sierkussens-binnen/afbeeldingen/sierkussen_1.jpg" src="cms/images/producten/sierkussens-binnen/afbeeldingen/sierkussen_1.jpg" />Sierkussens binnen
</a>
</li>
<li>
<a href="textiel/tafelkleed">
<img
class="prodmenuimg"
data-src="cms/images/producten/tafelkleed/afbeeldingen/1_Tafelkleed_met_foto_uit_website_studio.jpg"
src="cms/images/producten/tafelkleed/afbeeldingen/1_Tafelkleed_met_foto_uit_website_studio.jpg"
/>
Tafelkleed
</a>
</li>
<li>
<a href="folie/zandstraalfolie">
<img
class="prodmenuimg"
data-src="cms/images/producten/zandstraalfolie/afbeeldingen/7ED3F649-4149-49CC-B831-5D15E4376788.jpg"
src="cms/images/producten/zandstraalfolie/afbeeldingen/7ED3F649-4149-49CC-B831-5D15E4376788.jpg"
/>
Zandstraalfolie
</a>
</li>
</ul>
</div>
</div>
</div>
<div class="absolutemenuimg">
<img src="cms/images/menu_afbeeldingen/keuken_3d.jpg" />
<p class="menucatalogusbtn"><a class="purplebtn btnstyle" href="catalogus/keuken">Bekijk de keuken</a></p>
</div>
</div>
</li>
<li>
<a class="categorieknop" href="javascript:void(0);"><i class="menu-afb icon-tuin"></i> <span>Tuin</span></a>
<div id="prodmenu" class="product-menu menunone">
<div class="productmenucontainer">
<div class="producten">
<div class="productgroup">
<h2 class="productmenukop">Tuin</h2>
<ul class="fivecolumns">
<li>
<a href="papier-karton/placemats-textiel">
<img
class="prodmenuimg"
data-src="cms/images/producten/placemats-textiel/afbeeldingen/Placemat_textiel_eigen_ontwerp.jpg"
src="cms/images/producten/placemats-textiel/afbeeldingen/Placemat_textiel_eigen_ontwerp.jpg"
/>
Placemats textiel
</a>
</li>
<li>
<a href="textiel/sierkussens-buiten">
<img
class="prodmenuimg"
data-src="cms/images/producten/sierkussens-buiten/afbeeldingen/Sierkussen_Outdoor_hoogwaardige_kwaliteit.jpg"
src="cms/images/producten/sierkussens-buiten/afbeeldingen/Sierkussen_Outdoor_hoogwaardige_kwaliteit.jpg"
/>
Sierkussens Outdoor
</a>
</li>
<li>
<a href="textiel/tafelkleed">
<img
class="prodmenuimg"
data-src="cms/images/producten/tafelkleed/afbeeldingen/Tafelkleed_met_je_eigen_ontwerp.jpg"
src="cms/images/producten/tafelkleed/afbeeldingen/Tafelkleed_met_je_eigen_ontwerp.jpg"
/>
Tafelkleed
</a>
</li>
<li>
<a href="textiel/zitzak">
<img class="prodmenuimg" data-src="cms/images/producten/zitzak/afbeeldingen/4_549_22ed819692c7b8fe.jpg" src="cms/images/producten/zitzak/afbeeldingen/4_549_22ed819692c7b8fe.jpg" />Zitzak outdoor
</a>
</li>
</ul>
</div>
</div>
</div>
<div class="absolutemenuimg">
<img src="cms/images/menu_afbeeldingen/tuin_color_3d.jpg" />
<p class="menucatalogusbtn"><a class="purplebtn btnstyle" href="catalogus/tuin">Bekijk de tuin</a></p>
</div>
</div>
</li>
<li>
<a class="categorieknop" href="javascript:void(0);"><i class="menu-afb icon-feestje"></i> <span>Feestje?</span></a>
<div id="prodmenu" class="product-menu menunone">
<div class="productmenucontainer">
<div class="producten">
<div class="productgroup">
<h2 class="productmenukop">Feestje?</h2>
<ul class="fivecolumns"></ul>
</div>
</div>
</div>
<div class="absolutemenuimg">
<img src="cms/images/menu_afbeeldingen/woonkamer_3d.jpg" />
<p class="menucatalogusbtn"><a class="purplebtn btnstyle" href="javascript:void(0);">Binnenkort beschikbaar</a></p>
</div>
</div>
</li>
<li>
<a class="categorieknop" href="javascript:void(0);"><i class="menu-afb icon-bedrijf"></i> <span>Eigen bedrijf?</span></a>
<div id="prodmenu" class="product-menu menunone">
<div class="productmenucontainer">
<div class="producten">
<div class="productgroup">
<h2 class="productmenukop">Eigen bedrijf?</h2>
<ul class="fivecolumns"></ul>
</div>
</div>
</div>
<div class="absolutemenuimg">
<img src="cms/images/menu_afbeeldingen/woonkamer_3d.jpg" />
<p class="menucatalogusbtn"><a class="purplebtn btnstyle" href="javascript:void(0);">Binnenkort beschikbaar</a></p>
</div>
</div>
</li>
</span>
Комментарии:
1.api.jquery.com/one Обработчик выполняется не чаще одного раза для каждого элемента для каждого типа события.
Ответ №1:
Вместо того , чтобы использовать .one()
, это, вероятно, было бы лучшим вариантом использования .on()
и руководством .off()
. Вы могли бы переписать его примерно так:
const buttons = $('.categorieknop');
function clickHandler(e) {
console.log('test');
$(".prodmenuimg" ).each(function() {
$datasrc = $(this).attr('data-src');
$(this).attr("src", $datasrc);
});
buttons.off("click", clickHandler);
}
buttons.on("click", clickHandler);
Вот простой пример:
const buttons = $('.categorieknop');
function clickHandler(e) {
console.log('test');
buttons.off("click", clickHandler);
}
buttons.on("click", clickHandler);
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="categorieknop">categorieknop1</div>
<div class="categorieknop">categorieknop2</div>
<div class="categorieknop">categorieknop3</div>
<div class="categorieknop">categorieknop4</div>
Комментарии:
1. Дополнительные опции:
$('.categorieknop').off("click")
будет работать, так как маловероятно, что оператору потребуется еще одно нажатие на эту кнопку. Или вы можете использовать имена событий в пространствах имен, чтобы устранить необходимость в clickHandler.off("click", clickHandler);
.2. Спасибо! Отлично работает.