【问题标题】:Add text to input only if div has class `is-active`仅当 div 具有类 `is-active` 时才将文本添加到输入
【发布时间】:2017-01-04 22:17:06
【问题描述】:

问题

  • 尚未被选中的玩家,即。没有picked.is-active 的类在单击时不应添加到任何输入字段
  • 每个类别最多可以选择 4 名守门员中的 2 名、15 名后卫中的 6 名和 31 名前锋中的 12 名。

更新 #3

在此处添加到 Github 存储库的链接:https://github.com/onlyandrewn/wheatkings

更新 #2

添加了 sn-p,它显示了如何切换 is-inactiveis-active 类。

更新 #1 -

我删除了第二个可能会引起混乱的 sn-p

如果它的类为picked.is-active,则下面的这个Javascript sn-p 会抓取点击玩家的名字,然后将其放入输入字段中。但是,假设您已经选择了两个守门员,但是当未选择时单击该类别中剩余的两个守门员(具有默认类别in-active那些未选择的球员仍然会被添加到输入中,即不是我们想要的。


scripts.js - 这个需要修复的 sn-p 目前会在输入字段中添加玩家名称,即使已达到特定类别的最大玩家数

$(".player").on("click", function(){
    var playerNames = [];
    $("input:text").each(function(i, t) { playerNames.push(t.value) });

    if ($(this).find("picked.is-active")) {
        var playerName = $(this).find(".player__name").html();
        var index = playerNames.indexOf(playerName);

        if(index == -1) // add player
            $("input:text:eq(" + playerNames.indexOf("") + ")").val(playerName);
        else // remove player
            $("input:text:eq(" + index + ")").val("");
    } else {
        $("input").val("");
    }
});

scripts.js(is-inactiveis-active 类如何切换)

$(".btn--random").on("click", function() {

    // CHECK THESE NUMBERS
    var goalies_array = getRandomNumbers(1, 4, 2);
    var defensemen_array = getRandomNumbers(5, 19, 6);
    var forwards_array = getRandomNumbers(20, 50, 12);

    $(".goalies").text(goalies_array.join(","));
    $(".defensemen").text(defensemen_array.join(","));
    $(".forwards").text(forwards_array.join(","));

    var players_array = goalies_array.concat(defensemen_array).concat(forwards_array);

    // Add the class `is-active` based on the numbers generated
    var player = $(".player");
    $(".is-active").removeClass("is-active").addClass("is-inactive");


    $.each(players_array, function(index, value) {
      var player_index = value - 1; // Subtract one based on zero-indexing
      player.eq(player_index).find(".is-inactive").removeClass("is-inactive").addClass("is-active");
  });
});

function getRandomNumbers(start, end, howMany) {
    var arr = [];
    for (var i = start, j = 0; i <= end; j++, i++)
        arr[j] = i
    arr.sort(function() {
        return Math.floor((Math.random() * 3) - 1)
    });

    return arr.splice(0, howMany)
}

index.html(表格 sn-p)

    <form id="form">
        <input type="text" name="p1"  id="p1">
        <input type="text" name="p2"  id="p2">
        <input type="text" name="p3"  id="p3">
        <input type="text" name="p4"  id="p4">
        <input type="text" name="p5"  id="p5">
        <input type="text" name="p6"  id="p6">
        <input type="text" name="p7"  id="p7">
        <input type="text" name="p8"  id="p8">
        <input type="text" name="p9"  id="p9">
        <input type="text" name="p10" id="p10">
        <input type="text" name="p11" id="p11">
        <input type="text" name="p12" id="p12">
        <input type="text" name="p13" id="p13">
        <input type="text" name="p14" id="p14">
        <input type="text" name="p15" id="p15">
        <input type="text" name="p16" id="p16">
        <input type="text" name="p17" id="p17">
        <input type="text" name="p18" id="p18">
        <input type="text" name="p19" id="p19">
        <input type="text" name="p20" id="p20">

        <button class="btn btn--submit" type="submit"><img src="src/img/ballot-alt.png" class="image--ballot">Submit Vote</button>
    </form>

index.html(播放器 sn-p)

        <div class="player player--forward year--2000 year--2010">
            <div class="tooltip">
                <p class="tooltip__name">Mark Stone</p>
                <p class="tooltip__hometown"><span>Hometown:</span> Winnipeg, Man.</p>
                <p class="tooltip__years"><span>Years Played:</span> 2008-2012</p>
                <div class="tooltip__stats--inline">

                    <div class="stats__group stats--games">
                        <p class="stats__header">GP</p>
                        <p class="stats__number stats__number--games">232</p>
                    </div>

                    <div class="stats__group stats--goals">
                        <p class="stats__header">G</p>
                        <p class="stats__number stats__number--goals">106</p>
                    </div>

                    <div class="stats__group stats--assists">
                        <p class="stats__header">A</p>
                        <p class="stats__number stats__number--assists">190</p>
                    </div>

                    <div class="stats__group stats--points">
                        <p class="stats__header">Pts</p>
                        <p class="stats__number stats__number--points">296</p>
                    </div>

                    <div class="stats__group stats--penalties">
                        <p class="stats__header">Pim</p>
                        <p class="stats__number stats__number--penalties">102</p>
                    </div>
                </div>
            </div>
            <div class="player__headshot player--mstone">
                <div class="picked is-inactive"><i class="fa fa-star" aria-hidden="true"></i></div>
            </div>
            <p class="player__name">Mark Stone</p>
            <p class="player__position">Forward</p>
        </div>

【问题讨论】:

  • 我不太明白。显示的两个 sn-ps 都为类 player 的元素添加了一个点击侦听器。所以它们会同时运行...但是您首先需要计算所选的数量,然后才尝试添加到输入字段,对吗?
  • 我删除了第二个 sn-p,这可能会引起一些混乱。第一个 sn-p 获取点击的玩家的名字,然后将其放入输入字段中,如果它有一个 picked.is-active 类。但是,假设您已经选择了两个守门员,但是当未选择时单击该类别中剩余的两个守门员(具有默认类别in-active)那些未选择的球员仍然被添加到输入中,这不是我们的想要
  • @fmilani 这有帮助吗?
  • Andrew,我注意到可能是问题所在:在您的 if 子句 if ($(this).find("picked.is-active")) 中,您正在测试 jquery 的 find 的返回,根据文档,它返回一个jquery 集合,它总是真实的。也许你应该换成if ($(this).find("picked.is-active").length &gt; 0)
  • @fmilani 这可能很接近,但是在该部分添加.length &gt; 0 会使所有名称在点击时不会显示。想法?

标签: javascript jquery html forms for-loop


【解决方案1】:

将应用状态存储到 dom/html 元素中并不是实现业务的好方法。您应该真正使用数据对象来保存应用程序状态。但是,假设您的玩家名称是唯一的,以下将对每个类别强制执行最大计数限制。

(function () {
    var maxCounts = {
        forward: 12,
        defenceman: 6,
        goalie: 2
    };

    var getSelectePlayerNames = function () {
        var names = [];
        $("input:text").each(function (i, t) {
            t.value && names.push(t.value);
        });

        return names;
    };
    var getPlayerPositionCounts = function (players) {
        var $players = $('.player');
        var positions = [];
        $.each(players, function (i, player) {
            positions.push($players.find(".player__name:contains('" + player + "')").next().text().toLowerCase());
        });

        return positions.reduce(function (memo, val) {
            memo[val]++;
            return memo;
        }, { forward: 0, defenceman: 0, goalie: 0 });
    };

    $(".player").on("click", function () {
        var $el = $(this);

        var playerName = $el.find(".player__name").text();
        var selectedPlayerNames = getSelectePlayerNames();
        var index = selectedPlayerNames.indexOf(playerName);
        if (index > -1) {
            $("input:text:eq(" + index + ")").val("");

            return;
        }

        if (!$el.find(".picked.is-active").length) {
            return;
        }

        var playerPosition = $el.find(".player__position").text().toLowerCase();
        var selectedPositionCounts = getPlayerPositionCounts(selectedPlayerNames);
        if (selectedPositionCounts[playerPosition] < maxCounts[playerPosition]) {
            $("input:text:eq(" + selectedPlayerNames.length + ")").val(playerName);
        }
    });
})();

【讨论】:

  • 这会替换我的部分代码还是只是添加到其中?
  • 由于我发布了两个 Javascript 的 sn-ps,它将替换哪个部分
  • 第一个sn-p。
  • 现在,当我删除第一个 sn-p 并放入你的时,玩家的名字不会出现在输入字段中。
  • 这是我的脚本文件目前的样子:gist.github.com/onlyandrewn/482c7aa0299c0c21f7f8d810e8dbac78
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-11
  • 2021-07-24
  • 1970-01-01
  • 1970-01-01
  • 2022-08-18
相关资源
最近更新 更多