You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

确认对话框未显示重复文本值的技术问题排查

问题描述
  • 开发游戏物品展示网站,物品市场名称从第三方API获取,每个物品对应一个含市场名称的div,存在多个div文本重复的正常场景
  • 支持点击div高亮选中,点击「Confirm」按钮弹出确认框展示选中物品名称
  • 当前问题:选中多个文本重复的div时,确认对话框完全不显示这些重复的文本值
问题根源

核心问题出在选中逻辑依赖文本值去重:

  • 点击重复文本的div时,selectedSkins.indexOf(marketName)只会找到第一个匹配项的索引
  • 第二次点击同文本的div时,会直接删除数组里的第一个匹配项,而非记录新增的选中状态
  • 最终导致重复选中的同文本物品,在数组里的数量无法正确累积,统计时自然无法显示重复计数
修复方案

放弃用文本值作为选中判断的唯一依据,改用每个div的唯一标识或直接跟踪DOM元素来记录选中状态,以下是两种可行方案:

方案1:基于物品唯一ID跟踪(推荐)

如果API返回物品的唯一ID,生成div时给每个.market-name元素添加data-item-id属性,用ID跟踪选中状态:

$(document).ready(function() {
    var selectedItemIds = [];

    $('.market-names').on('click', '.market-name', function() {
        $(this).toggleClass('highlighted');
        var itemId = $(this).data('item-id');
        var index = selectedItemIds.indexOf(itemId);
        
        if (index === -1) {
            selectedItemIds.push(itemId);
        } else {
            selectedItemIds.splice(index, 1);
        }
    });

    $('#confirm-button').on('click', function() {
        if (selectedItemIds.length > 0) {
            // 建立ID到文本的映射
            var itemMap = {};
            $('.market-name').each(function() {
                var id = $(this).data('item-id');
                itemMap[id] = $(this).text();
            });

            // 统计每个物品名称的选中次数
            var itemCounts = {};
            selectedItemIds.forEach(function(id) {
                var name = itemMap[id];
                itemCounts[name] = (itemCounts[name] || 0) + 1;
            });

            var confirmationContent = "<h3>确认选中物品</h3>";
            confirmationContent += "<ul>";

            Object.keys(itemCounts).forEach(function(name) {
                if (itemCounts[name] > 1) {
                    confirmationContent += "<li>" + name + " (x" + itemCounts[name] + ")</li>";
                } else {
                    confirmationContent += "<li>" + name + "</li>";
                }
            });

            confirmationContent += "</ul>";
            confirmationContent += "<button id='close-button'>关闭</button>";

            var confirmationDialog = $('<div>').addClass('confirmation-dialog').html(confirmationContent);
            $('body').append(confirmationDialog);

            $('#close-button').on('click', function() {
                confirmationDialog.remove();
            });
        }
    });
});

方案2:直接跟踪DOM元素

如果无法获取物品唯一ID,可直接跟踪选中的DOM元素本身:

$(document).ready(function() {
    var selectedElements = [];

    $('.market-names').on('click', '.market-name', function() {
        var $el = $(this);
        $el.toggleClass('highlighted');
        
        var index = selectedElements.indexOf($el[0]);
        if (index === -1) {
            selectedElements.push($el[0]);
        } else {
            selectedElements.splice(index, 1);
        }
    });

    $('#confirm-button').on('click', function() {
        if (selectedElements.length > 0) {
            var itemCounts = {};
            selectedElements.forEach(function(el) {
                var name = $(el).text();
                itemCounts[name] = (itemCounts[name] || 0) + 1;
            });

            var confirmationContent = "<h3>确认选中物品</h3>";
            confirmationContent += "<ul>";

            Object.keys(itemCounts).forEach(function(name) {
                if (itemCounts[name] > 1) {
                    confirmationContent += "<li>" + name + " (x" + itemCounts[name] + ")</li>";
                } else {
                    confirmationContent += "<li>" + name + "</li>";
                }
            });

            confirmationContent += "</ul>";
            confirmationContent += "<button id='close-button'>关闭</button>";

            var confirmationDialog = $('<div>').addClass('confirmation-dialog').html(confirmationContent);
            $('body').append(confirmationDialog);

            $('#close-button').on('click', function() {
                confirmationDialog.remove();
            });
        }
    });
});

内容的提问来源于stack exchange,提问作者lechuwwa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 03:07:11