J'ai récemment rencontré un problème lors de la création d'une page Web. Plusieurs produits sont affichés dans le diagramme de scène d'une page. Chaque fois que vous cliquez sur un produit, la liste d'informations correspondant à ce produit s'affiche sous le diagramme de scène.
Le problème que je rencontre actuellement est le suivant : lorsque je rafraîchis la page et clique pour la première fois sur un produit, sa liste d'informations s'affichera normalement sans rafraîchir la page, lorsque je clique sur le même produit pour la deuxième fois, c'est le cas. La liste d’informations sera affichée de manière cumulative.
Excusez-moi, comment puis-je cliquer plusieurs fois sur un produit sans rafraîchir la page et n'afficher qu'une seule fois sa liste d'informations ?
Voici mes captures d'écran et mon code :
Cliquez une première fois sur ce bouton pour afficher normalement sa liste de produits :
Si vous cliquez deux fois de suite sur ce bouton sans actualiser la page, la liste des produits s'affichera cumulativement sur la base d'origine :
Ma structure de données est la suivante :
var productDataList = [{
superView: {
img: './img/SuperView.png',
title: 'SuperView',
url: 'http://www.beta.anviz.com/en-us/product/View/id/388450.html',
subTitle: 'Professional HD Box Network Camera',
titleContent: 'SuperView is a professional series, equipped with high sensitivity sensors. SuperView offers low noise, high quality images in low-light conditions. A variety of optional professional-grade lenses and the optional protective casing allow SuperView to operate efficiently under extreme conditions. In addition, the wide range of remote back focus function makes the operation and maintenance not easier. It is perfect for securing locations such as industrial sites, school grounds, parking lot, and railway stations.',
contentList: [{
'info': 'Professional-grade lenses'
},
{
'info': 'Remote/Auto back focus'
},
{
'info': 'High-performance Wi-Fi with external antenna'
},
{
'info': 'Smart edge storage'
},
{
'info': 'Multiple interface of audio and alarm'
},
{
'info': 'Super Low Light: Cameras can provide excellent images even in total darkness'
},
{
'info': 'ABF/Automatic Focusing Button: SuperView series supports remotely adjust the back focus and automatic focus which provides an easier installation and more accurate focus'
},
{
'info': 'Super Wide Dynamic Range: Catch more details in both extremely dark and bright environmernts'
}
],
thumbnail: {
img: './img/icon/9-01.png',
titel: 'SuperView',
thumbnailDec: 'SuperView is a professional series, equipped with high sensitivity sensors. SuperView offers low noise, high quality images in low-light conditions. '
}
}
}]
Le problème maintenant est le tableau contentList, qui continue de s'afficher à plusieurs reprises.
Mon JS s'écrit comme ceci :
$(document).ready(function() {
$('.js-box').click(function(e) {
var proDescribe = $('.pro-describe');
for(var i = 0; i < productDataList.length; i++) {
if(productDataList) {
var item = productDataList[i];
if(index == '0') {
var superView = item.superView;
if(superView != 'undefined') {
itemShow(superView);
}
}
}
});
}
//这是出问题的方法,但是这不知道该怎么改?
function itemShow(item) {
var proDescribe = $('.pro-describe');
var systemProductDec = $('.system-product-dec');
var detailContent = $('.detail-content');
//thumbnail
var systemDetailDec = $('.system-detail-dec');
var learnMore = $('#learnMore');
var entiry = {};
if(item) {
var proImg = item.img;
var title = item.title;
var subTitle = item.subTitle;
var titleContent = item.titleContent;
var url = item.url;
var contentList = item.contentList;
for(var j = 0; j < contentList.length; j++) {
var contentItem = contentList[j].info;
var detailList = $('.detail-list');
//**应该就是这里出了问题,每次点击之后,所有的 li 标签都会 append 到 detaiList 这个容器中**
detailList.append('<li>' + contentItem + '</li>');
}
var thumbnail = item.thumbnail;
var thumbnailImg = thumbnail.img;
var thumbnailTitel = thumbnail.titel;
var thumbnailDec = thumbnail.thumbnailDec;
proDescribe.find('.pro-img').attr('src', proImg);
proDescribe.find('.detail-title').text(title);
proDescribe.find('.detail-sub-title').text(subTitle);
proDescribe.find('.detail-content').text(titleContent);
systemProductDec.find('.js-thumbnail-img').attr('src', thumbnailImg);
systemProductDec.find('.js-thumbnail-title').text(thumbnailTitel);
systemProductDec.find('.js-thumbnail-dec').text(thumbnailDec);
detailContent.after(detailList);
proDescribe.append(systemDetailDec);
learnMore.click(function() {
if(url) {
location.href = url;
} else {
return false;
}
});
}
}
Un maître peut-il me donner quelques conseils sur la façon dont je dois modifier le code original ? Merci !
Dans la plupart des cas, essayez d'éviter plusieurs
.append
, ce qui est également appelé éviter les opérations répétées sur les éléments DOM plusieurs fois. Vous pouvez faire ceci :Habituellement, je vous suggère d'utiliser la structure de code ci-dessus pour tout ce qui est aussi grand qu'un fichier, aussi grand qu'une classe ou aussi petit qu'une fonction, c'est-à-dire
声明 - 逻辑 - 返回值
De cette façon, il est garanti que les variables sont contrôlables, consultables, et indexables, les points d'arrêt peuvent être utilisés lorsque des erreurs logiques se produisent, et le résultat final de l'exécution du code actuel peut être vu en un coup d'œil !Ajoutez une ligne de code avant la boucle for en annexe
detailList.html('')