【问题标题】:Adding an if statement to the for loop code to hide the covers在 for 循环代码中添加 if 语句以隐藏封面
【发布时间】:2019-08-29 14:06:29
【问题描述】:

我想要做的是在使用放置在 for 循环代码中的 if 语句单击封面后隐藏封面。如果那是它会去的地方。

防止这种情况发生。

我在这里尝试这样做,但无法弄清楚。

我在试图解决这个问题时做错了什么?

https://jsfiddle.net/8mg0v6eL/2/

(function manageCover() {
    "use strict";

    function hide(el) {
        el.classList.add("hide");
    }

    /*function coverClickHandler(evt) {
        const cover = evt.currentTarget;
        hide(cover);
    }*/

    function addCoverListener(evt) {
        const cover = evt.target;

        const coversSelector = ".jacket-left, .jacket-middle, .jacket-right";
        const covers = document.querySelectorAll(coversSelector);

        for (let i = 0; i < covers.length; i += 1) {
            /*covers[i].addEventListener("click", coverClickHandler);*/
            if (covers[i] !== evt.target) covers[i].hide(cover);
        }
    }

}());

【问题讨论】:

  • [class~="hide"]可以直接选择当前隐藏的封面,:not([class~="hide"]可以直接选择可见的封面。如果您希望能够使用相同的功能来删除.hide,您可以使用classList.toggle() 而不是classList.add()
  • 你能告诉我怎么做吗?你能在这里举个例子吗?这是有人告诉我要做的事情。怎么写到代码里?
  • 你到底想要什么?一开始我们有 3 个封闭的封面。我单击第一个封面,它会展开并显示视频。一旦我点击了另一个封面,这个封面是否应该再次关闭?还是仅当我单击同一封面时才关闭此封面?换句话说,应该只有一个盖子同时打开吗?
  • 不,视频将保持打开状态,封面将保持隐藏,仅此而已。
  • 我还是不明白。我们从 3 个封闭的封面开始。它们什么时候应该打开,什么时候应该关闭?他们应该永远不开放吗?

标签: javascript for-loop if-statement


【解决方案1】:

manageCover 代码并没有真正增加太多。 你只需要在coverClickHandler()添加一行代码:

function coverClickHandler(evt) {
    const wrapper = evt.currentTarget.nextElementSibling;
    show(wrapper);
    initPlayer(wrapper);
    // Hide the clicked cover so only the video below is visible.
    evt.currentTarget.classList.add( 'hide' );
}

evt.currentTarget 指的是我们点击的封面,所以我们可以添加.hide 类来设置它的显示为无。如果您确实必须以某种方式使用 manageCover,请在 coverClickHandler 内调用 manageCover.hide( evt.currentTarget ),或向封面添加另一个点击处理程序。

https://jsfiddle.net/yr2en3Lp/

const load = (function makeLoad() {
    "use strict";

    function _load(tag) {
        return function (url) {
            return new Promise(function (resolve) {
                const element = document.createElement(tag);
                const parent = "body";
                const attr = "src";
                element.onload = function () {
                    resolve(url);
                };
                element[attr] = url;
                document[parent].appendChild(element);
            });
        };
    }
    return {
        js: _load("script")
    };
}());

const videoPlayer = (function makeVideoPlayer() {
    "use strict";
    const players = [];

    function onPlayerReady(event) {
        const player = event.target;
        player.setVolume(100); // percent
    }

    let hasShuffled = false;

    function onPlayerStateChange(event) {
        const player = event.target;
        if (!hasShuffled) {
            player.setShuffle(true);
            player.playVideoAt(0);
            hasShuffled = true;
        }
        if (event.data === YT.PlayerState.PLAYING) {
            for (let i = 0; i < players.length; i++) {
                if (players[i] !== event.target) players[i].pauseVideo();
            }
        }

        const playerVars = player.b.b.playerVars;
        if (playerVars.loop && event.data === YT.PlayerState.ENDED) {
            player.seekTo(playerVars.start);
        }
    }

    function addVideo(video, settings) {
        players.push(new YT.Player(video, Object.assign({
            videoId: video.dataset.id,
            host: "https://www.youtube-nocookie.com",
            events: {
                "onReady": onPlayerReady,
                "onStateChange": onPlayerStateChange
            }
        }, settings)));
    }

    function init(video, settings) {
        load.js("https://www.youtube.com/player_api").then(function () {
            YT.ready(function () {
                addVideo(video, settings);
            });
        });
    }
    return {
        init
    };
}());

function loadPlayer(opts) {
    "use strict";

    function show(el) {
        el.classList.remove("hide");
    }

    function initPlayer(wrapper) {
        const video = wrapper.querySelector(".video");
        opts.width = opts.width || 198;
        opts.height = opts.height || 198;
        opts.autoplay = 1;
        opts.controls = 1;
        opts.rel = 0;
        opts.iv_load_policy = 3;
        opts.fs = 0;
        opts.disablekb = 1;

        function paramInOpts(settings, param) {
            if (opts[param] !== undefined) {
                settings[param] = opts[param];
            }
            return settings;
        }
        const settingsParams = ["width", "height", "videoid", "host"];
        const settings = settingsParams.reduce(paramInOpts, {});
        const playerVarsParams = ["autoplay", "cc_load_policy",
            "controls", "disablekb", "end", "fs", "iv_load_policy",
            "list", "listType", "loop", "playlist", "rel", "start"
        ];
        settings.playerVars = playerVarsParams.reduce(paramInOpts, {});
        videoPlayer.init(video, settings);
    }

    function coverClickHandler(evt) {
   			evt.currentTarget.classList.add( 'hide' );
        const wrapper = evt.currentTarget.nextElementSibling;
        show(wrapper);
        initPlayer(wrapper);
    }
    const cover = document.querySelector(opts.target);
    cover.addEventListener("click", coverClickHandler);
}
const playlist = "0dgNc5S8cLI,mnfmQe8Mv1g,-Xgi_way56U,CHahce95B1g";

loadPlayer({
    target: ".jacket-left",
    width: 277,
    height: 207
});

loadPlayer({
    target: ".jacket-middle",
    width: 277,
    height: 207
});
loadPlayer({
    target: ".jacket-right",
    width: 277,
    height: 207
});

// These players do not have a HTML element.
// Will throw an error when attaching the click event.
/*
loadPlayer({
    target: ".jacketc",
    width: 600,
    height: 338,
    loop: true,
    playlist
});
loadPlayer({
    target: ".alpha",
    start: 0,
    end: 280,
    loop: true
});
loadPlayer({
    target: ".beta",
    start: 0,
    end: 240,
    loop: true
});
loadPlayer({
    target: ".gamma",
    start: 0,
    end: 265,
    loop: true
});
loadPlayer({
    target: ".delta",
    start: 4,
    end: 254,
    loop: true
});
loadPlayer({
    target: ".epsilon",
    start: 0,
    end: 242,
    loop: true
});
loadPlayer({
    target: ".zeta",
    start: 0,
    end: 285,
    loop: true
});
loadPlayer({
    target: ".eta",
    start: 23,
    end: 312,
    loop: true
});
loadPlayer({
    target: ".theta",
    start: 2
});
loadPlayer({
    target: ".iota"
});
*/
html,
body {
  height: 100%;
  padding: 0;
  margin: 0;
}

body {
  background: #353198;
}

.outer {
  display: table;
  height: 100%;
  margin: 0 auto;
}

.tcell {
  display: table-cell;
  vertical-align: middle;
}

.container {
  width: 936px;
  padding: 25px;
  margin: 100px auto;
  border-radius: 25px;
  border: 2px solid #0059dd;
  background: #000000;
}

.container-top {
  position: relative;
  height: 310px;
  margin: 0;
  border-radius: 25px;
  border: 3px solid #0059dd;
  box-sizing: border-box;
  background: url("https://i.imgur.com/jEMIULl.jpg") no-repeat 0 0;
  background-size: cover;
}

.v-contain {
  position: relative;
  top: 50%;
  transform: translateY(-50%);
  float: left;
  margin-left: 25px;
  width: 277px;
  background: red;
  border-radius: 25px;
}

.jacket {
  position: relative;
  width: 80px;
  height: 80px;
  margin: auto;
  background: url("https://i.imgur.com/fzdYu8g.jpg") no-repeat 0 0;
  background-size: 100% 200%;
}
.jacket.hide {
  display: hidden;
}

.jacket-middle {
  background-position: 0 -80px;
  background-size: 100% 200%;
}

.jacket-right {
  background-position: 0 -80px;
  background-size: 100% 200%;
}

.circle {
  position: absolute;
  top: 25%;
  left: 25%;
  width: 50%;
  height: 50%;
  box-sizing: border-box;
  border: 1px solid #0059dd;
  border-radius: 50%;
  cursor: pointer;
  background: rgba(0, 0, 0, 0.5);
  transition: transform 0.1s ease 0s;
  box-shadow: rgba(0, 0, 0, 0.4) 0 0 10px;
}

.play {
  position: absolute;
  top: 0;
  left: 0;
  bottom: 0;
  right: 0;
  margin: auto;
  width: 38px;
  height: 22px;
  fill: #0059dd;
}

.circle:hover {
  border: 1px solid red;
  transform: scale(1.1);
}

.circle:hover .play {
  fill: red;
}

.wrap {
  position: relative;
  width: 277px;
  height: 207px;
  cursor: pointer;
  overflow: hidden;
  border-radius: 25px;
}

/*
.container-left-video .wrap-left iframe, 
.container-middle-video .wrap-middle iframe, 
.container-right-video .wrap-right iframe {
*/
.wrap iframe {
  position: absolute;
  top: 0;
  left: 0;
  width: 277px;
  height: 207px;
  cursor: pointer;
}

.hide {
  display: none;
}
<div class="outer">
  <div class="tcell">
    <div class="container ">
      <div class="container-top">
        <div class="v-contain">
          <div class="jacket jacket-left">
            <div class="circle"> <svg class="play" width="38" height="22" viewBox="0 0 26 26">
                <title>Play</title>
                <path d="M7.712 22.04a.732.732 0 0 1-.806.007.767.767 0 0 1-.406-.703V4.656c0-.31.135-.544.406-.703.271-.16.54-.157.806.006l14.458 8.332c.266.163.4.4.4.709 0 .31-.134.546-.4.71L7.712 22.04z" fill-rule="evenodd" />
              </svg> </div>
          </div>
          <div class="wrap hide">
            <div class="video" data-id="jMAShwisnQI"></div>
          </div>
        </div>
        <div class="v-contain">
          <div class="jacket jacket-middle">
            <div class="circle"> <svg class="play" width="38" height="22" viewBox="0 0 26 26">
                <title>Play</title>
                <path d="M7.712 22.04a.732.732 0 0 1-.806.007.767.767 0 0 1-.406-.703V4.656c0-.31.135-.544.406-.703.271-.16.54-.157.806.006l14.458 8.332c.266.163.4.4.4.709 0 .31-.134.546-.4.71L7.712 22.04z" fill-rule="evenodd" />
              </svg> </div>
          </div>
          <div class="wrap hide">
            <div class="video" data-id="-SiGnAi845o"></div>
          </div>
        </div>
        <div class="v-contain">
          <div class="jacket jacket-right">
            <div class="circle"> <svg class="play" width="38" height="22" viewBox="0 0 26 26">
                <title>Play</title>
                <path d="M7.712 22.04a.732.732 0 0 1-.806.007.767.767 0 0 1-.406-.703V4.656c0-.31.135-.544.406-.703.271-.16.54-.157.806.006l14.458 8.332c.266.163.4.4.4.709 0 .31-.134.546-.4.71L7.712 22.04z" fill-rule="evenodd" />
              </svg> </div>
          </div>
          <div class="wrap hide">
            <div class="video" data-id="-SiGnAi845o"></div>
          </div>
        </div>
      </div>
    </div>
  </div>
</div>

【讨论】:

  • 我从代码中删除了 2 个 mangeCovers。不过有3个。我如何让它在 .jacketd 上工作?是左下角。 jsfiddle.net/qpnv7gf9/3
  • 这种技术能在 .jacketd 上工作吗?或者,那个人需要留下来吗?
  • 我又不明白了。 .jacketd 具有不同的 HTML 结构并且不包含视频,因此需要不同的代码,因为 evt.currentTarget.nextElementSibling 不会引用正确的元素。夹套的情况下,哪个部分是盖子,应该隐藏?
  • 谢谢,这就是我想知道的。另外,感谢您的帮助。
  • 所以如果问题是:我可以删除所有.jacketd 的东西吗,是的。 :)
【解决方案2】:

我可以通过在您的manageCover() IIFE 中添加以下代码来做到这一点,而无需对可用代码进行任何更改。你可以试试看!

document.body.addEventListener("click", e => {

    switch (true) {
      case e.target.classList.contains("play"):
        e.target.parentElement.parentElement.classList.toggle("hide");
        break;
      case e.target.tagName === "path":
        e.target.parentElement.parentElement.parentElement.classList.toggle(
          "hide"
        );
        break;
      case e.target.classList.contains("circle"):
        e.target.parentElement.classList.toggle("hide");
        break;
    }
  });

【讨论】:

    猜你喜欢
    • 2019-12-20
    • 1970-01-01
    • 1970-01-01
    • 2016-09-24
    • 2017-06-17
    • 2016-06-16
    • 2019-06-09
    相关资源
    最近更新 更多