首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Js按钮只工作一次?

Js按钮只工作一次?
EN

Stack Overflow用户
提问于 2019-10-12 16:39:22
回答 4查看 90关注 0票数 1
代码语言:javascript
复制
<html lang="en" dir="ltr">
  <head>
    <meta charset="utf-8">
    <title></title>
    <link rel="stylesheet" href="Jeu.css">
  </head>
  <body>

    <canvas id="canvas" width="400" height="400"
    style="border-color: 'black'; border-width: 3px; border-style: solid">
      </canvas>
<br>
  <button type="button"onclick="dessiner()"><img src="Start.jpg"></button>

<script type="text/javascript">


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

  var contexte = canvas.getContext("2d");

  var x

  var y

function ghost(){

ghost= new Image();
ghost.src = "ghost.jpg";
ghost.onload = function(){
contexte.drawImage(ghost,x,y,20,20)

}};

x = 32 +(Math.random() * (400-64));
y = 32 +(Math.random() * (400-64));

function dessiner(){

  ghost()
};




  </script>
  </body>
</html>

我使用此代码的目的是使图像"ghost.jpg“在每次按下按钮后随机出现在画布上。当我多次按下这个按钮时,问题就出现了。我希望这张照片能开始出现在任何地方,但它只在第一次出现,并且只显示了一次。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2019-10-12 16:50:55

尽管函数dessiner()ghost.onload()被多次调用,但是您的变量xy只被分配了一次随机值,因为它们是在全局范围上定义的。

所以每次你点击的时候都会生成图像,但是.每次都在同一个位置上。

解决这个问题的一种方法是在ghost.onload()中分配X和Y值,或者直接使用32 +(Math.random() * (400-64))作为drawImage()函数的参数。

票数 1
EN

Stack Overflow用户

发布于 2019-10-12 16:51:49

代码语言:javascript
复制
<html lang="en" dir="ltr">
  <head>
    <meta charset="utf-8">
    <title></title>
    <link rel="stylesheet" href="Jeu.css">
  </head>
  <body>

    <canvas id="canvas" width="400" height="400"
    style="border-color: 'black'; border-width: 3px; border-style: solid">
      </canvas>
<br>
  <button type="button"onclick="dessiner()"><img style="width:24px; height:24px;" src="http://icons.iconarchive.com/icons/paomedia/small-n-flat/1024/star-icon.png"></button>

<script type="text/javascript">

var canvas = document.getElementById("canvas");
var contexte = canvas.getContext("2d");
var x;
var y;

function ghost(){
  var image = new Image();
  image.src = "https://cdn1.iconfinder.com/data/icons/halloween-1/128/42-512.png";
  image.onload = function(){
      contexte.drawImage(image,x,y,20,20)
  };
};

function dessiner(){
contexte.clearRect(0, 0, canvas.width, canvas.height); //if you don't want to clear the canvar just comment this line ;) and you ll have ghostss all around
  x = 32 +(Math.random() * (400-64));
  y = 32 +(Math.random() * (400-64));
  ghost()
};




  </script>
  </body>
</html>
票数 0
EN

Stack Overflow用户

发布于 2019-10-12 17:23:42

代码的编写方式有一些问题。

未被letvar替换的变量ghost使ghost成为一个全局变量。这意味着,当您第一次单击dessiner时,将调用ghost函数,但在该函数中,鬼将被重新分配到图像中,然后所有调用图像的进一步尝试都失败。在浏览器控制台中,在第二次单击开始时会显示一个错误:Uncaught TypeError: ghost is not a function,可以通过在声明ghost之前添加'let‘来修复这个错误

代码语言:javascript
复制
function ghost() {
  let ghost = new Image();
  ghost.src = "ghost.png";
  ghost.onload = function(){
      contexte.drawImage(image,x,y,20,20)
  };
}

在此之后,将不会有更多的错误,但您仍然会遇到这样一个事实,即当您单击按钮时,图像的数量不会增加。在现实中,图像正在被生成,但它被准确地放置在最后一幅图像的位置,产生了什么都没有改变的错觉。这是因为每次生成新映像时,xy值都是相同的。可以通过在onload函数中创建xy来解决这个问题,并消除xy的其他声明。

代码语言:javascript
复制
function ghost() {
  let ghost = new Image();
  ghost.src = "ghost.png";
  ghost.onload = function(){
    let x = 32 +(Math.random() * (400-64));
    let y = 32 +(Math.random() * (400-64));
    contexte.drawImage(image,x,y,20,20)
  };
}

此时,如果您停止,您将有图像出现在随机点后,每次点击,但旧的图像仍将保留。如果你真的想摆脱旧的图像,你所做的就是在绘制新图像之前清除画布。

代码语言:javascript
复制
function dessiner() {
  contexte.clearRect(0, 0, canvas.width, canvas.height);
  ghost();
} 

ANd --就这样--你完了!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58356260

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档