【问题标题】:How to display an random items from an array?如何显示数组中的随机项?
【发布时间】:2018-10-19 05:37:54
【问题描述】:
var items    = ['imgs/garbagebag.svg', //[0]
               'imgs/straw.svg', // [1]
               'imgs/utensil.svg', // [2]
               'imgs/chipbag.svg', // [3]
               'imgs/eggs.svg', // [4]


               'imgs/glasscup.svg', //[5]
               'imgs/ketchupbottle.svg', //[6]
               'imgs/jamjar.svg', //[7]
               'imgs/milkbottle.svg', //[8]
               'imgs/popbottle.svg', //[9]


               'imgs/eggshell.svg', //[10]
               'imgs/apple.svg', //[11]
               'imgs/banana.svg', //[12]
               'imgs/teabag.svg', // [13]
               'imgs/leave.svg', // [14]


              'imgs/jug.svg', // [15]
              'imgs/tetrapak.svg', // [16]
              'imgs/container.svg', // [17]
              'imgs/plasticbottle.svg', // [18]
              'imgs/can.svg', //[19]

              'imgs/newspaper.svg', //[20]
              'imgs/cerealbox.svg', // [21]
              'imgs/book.svg', // [22]
              'imgs/cardboard.svg', // [23]
              'imgs/bag.svg' // [24]
]
// This is the black hole on the wall
var hole = document.getElementById("hole");
// starts functioning after 5 seconds
var start = setInterval(shuffle,5000);
// displays an random items from array one by one
function shuffle(){
    hole.addEventListener("click",function(){
    console.log("items");
    items[Math.floor(Math.random()*items.length)] 
});
}

您好,这是一个教用户如何回收利用的小游戏。在屏幕截图中,用户需要单击黑色间隙/孔,以便在黑洞内一一显示随机项目(我尝试附加它,但我不知道我之前应该创建什么)。我对如何实现这一目标感到困惑。我所拥有的似乎还不够。我很欣赏解决方案和提示。感谢您阅读我的帖子。

更新:所以 Elliot 提供的代码是有效的。但是由于某些原因,新创建的 + 随机图像没有像素!我尝试在css中使用className分配新的宽度和高度+ z-index,但这也没有做任何事情。我希望这不是一个复杂的问题来解决T.T

【问题讨论】:

  • 你想从你的数组中随机块吗?
  • 您还需要setInterval吗?您想在不点击每 5 秒的情况下更改图像吗?
  • @MihaiAlexandru-Ionut 我想在用户每次点击孔时显示随机图像。共 25 项。
  • @AliSheikhpour 我确实需要它,因为在允许用户点击孔之前有一个 3-2-1 计数器。
  • @JosephDoggie 谢谢~!

标签: javascript arrays random


【解决方案1】:

稍微重构你的代码可能是值得的。您似乎正在对项目进行分组。

var items = [{
    image: "imgs/garbagebag.svg",
    type: "paper"
}, {
    image: "imgs/straw.svg",
    type: "paper"
},
...]

这为您在每个项目背后的元数据提供了更大的灵活性。

那么你需要添加事件

var hole = document.getElementById("hole");

function showItem(item) {
    var img = document.createElement("img");
    img.setAttribute("src", item.image);
    // store type as data attribute so we can access it later
    img.setAttribute("data-type", item.type);
    if (hole.childNodes[0]) {
        hole.removeChild(hole.childNodes[0]);
    }
    hole.appendChild(img);
}

function showRandomItem() {
    var item = items[Math.floor(Math.random()*items.length)];
    showItem(item);
}

hole.addEventListener("click", function() {
    showRandomItem();
});

这是此代码在 JSFiddle 上的工作版本

https://jsfiddle.net/nxc5zpen/

看起来您可能遇到的问题是由于 SVG 缩放造成的。这是一个带有 SVG 的工作 JSFiddle。

https://jsfiddle.net/Lhot76gm/1/

这是另一个使用背景图片作为孔洞的版本。

https://jsfiddle.net/j6373mvv/1/

【讨论】:

  • 哇,非常感谢您将我的代码重构到适用的阶段。所以我用和你一样的方式重建后有几个问题。 1. 设置属性时,“可变图像”与“item.image”不一样,您仍然使用“item.image” 2. removeChild 部分出现错误,说 play.js:147 Uncaught TypeError : 无法在“节点”上执行“removeChild”:参数 1 不是“节点”类型。在 showItem at showRandomItem at HTMLImageElement. 但是当我删除它时,我没有收到任何错误,但图像仍然不显示。
  • 好地方,我已经更新了示例以删除冗余代码。删除现有项目可能需要进行额外检查(我不确定它目前如何为您工作)。如果您检查页面,HTML 是否会发生变化?我将制作一个 JSFiddle 并更新我的答案。
  • 好的!应用您的更改后,我没有收到任何错误。不幸的是,图像仍然不显示,并且当我在 addeventListenser 中 console.log 一个数组 [items] 时,我没有看到这些项目?我需要解析或字符串化它吗?再次感谢您!
  • 不,我不这么认为,请查看 JSFiddle 以获取工作示例。你能提供一个它不起作用的例子吗?很难知道确切的问题。
  • 好的,我会的。今晚让我回复你。我还有其他事要处理。谢谢!
【解决方案2】:

这是从数组中获取项目的方法

var randItem = items[Math.floor(Math.random() * items.length)];

【讨论】:

  • 谢谢。我想我写了同样的东西?
  • @YongJunJung 是的,现在才看到。也许我们同时发布。 :) :D
猜你喜欢
  • 1970-01-01
  • 2018-08-01
  • 2018-08-28
  • 2011-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-16
相关资源
最近更新 更多