3 回答

TA貢獻1852條經驗 獲得超7個贊
removeEventListener()
函數需要三個參數。第一個是type
事件,第二個是EventListener
最初注冊的函數,第三個是可選options
對象。
target.removeEventListener(type, listenerFunction, options)
您在示例中作為第二個參數傳遞的不是原始回調函數。為了刪除事件偵聽器,您必須使用命名函數作為回調。
所以player
事先定義你的功能
function player(){ .... }
并用它來注冊事件監聽器
canvas.addEventListener('click', player )
然后刪除這個
canvas.removeEventListener("click",player)

TA貢獻1828條經驗 獲得超3個贊
這是因為在回調中你傳遞的是 var player 而不是 player 函數,你可以更改變量的名稱
var canvas = document.getElementById("canvas");
const ctx = canvas.getContext('2d');
var turn = 0;
var maru_1 = maru_1()
function maru_1(){
ctx.fillStyle = "skyblue",
ctx.fillRect(5, 5, 150, 150)
}
var maru_2 = maru_2()
function maru_2(){
ctx.fillStyle = "skyblue",
ctx.fillRect(170, 5, 150, 150);
}
var maru_3 = maru_3()
function maru_3(){
ctx.fillStyle = "skyblue";
ctx.fillRect(335, 5, 150, 150);
}
var maru_4 = maru_4()
function maru_4(){
ctx.fillStyle = "skyblue";
ctx.fillRect(5, 170, 150, 150);
}
var maru_5 = maru_5()
function maru_5(){
ctx.fillStyle = "skyblue";
ctx.fillRect(170, 170, 150, 150);
}
var maru_6 = maru_6()
function maru_6(){
ctx.fillStyle = "skyblue";
ctx.fillRect(335, 170, 150, 150);
}
var maru_7 = maru_7()
function maru_7(){
ctx.fillStyle = "skyblue";
ctx.fillRect(5, 335, 150, 150);
}
var maru_8 = maru_8()
function maru_8(){
ctx.fillStyle = "skyblue";
ctx.fillRect(170, 335, 150, 150);
}
var maru_9 = maru_9()
function maru_9(){
ctx.fillStyle = "skyblue";
ctx.fillRect(335, 335, 150, 150);
}
var img = new Image();
img.src = "maru.png";
var img_2 = new Image();
img_2.src = "batsu.png";
function player(){
var x = event.screenX;
var y = event.screenY;
var imgTemp;
if(turn%2==0){
imgTemp = img
} else {
imgTemp = img_2
}
if(x<150 && y<190){
ctx.drawImage(imgTemp, 5, 5, 145, 140)
turn+=1;
return true;
}else if(x>160 && x<335 && y<190){
ctx.drawImage(imgTemp, 168, 5, 145, 140)
turn+=1;
return true;
}else if(x>335 && x<470 && y<190){
ctx.drawImage(imgTemp, 330, 5, 145, 140)
turn+=1;
return true;
}else if(x<160 && y>=175 && y<340){
ctx.drawImage(imgTemp, 5, 170, 145, 140)
turn+=1;
return true;
}else if(x>170 && x<335 && y>175 && y<340){
ctx.drawImage(imgTemp, 170, 170, 145, 140)
turn+=1;
return true;
}else if(x>335 && x<470 && y>195 && y<340){
ctx.drawImage(imgTemp, 335, 170, 145, 140)
turn+=1;
return true;
}else if(x<160 && y>340 && y<550){
ctx.drawImage(imgTemp, 5, 335, 145, 140)
turn+=1;
return true;
}else if(x>165 && x<335 && y>340 && y<550){
ctx.drawImage(imgTemp, 170, 335, 145, 140)
turn+=1;
return true;
}else if(x>335 && x<470 && y>340 && y<550){
ctx.drawImage(imgTemp, 335, 335, 145, 140)
turn+=1;
return true;
}{
return false;
}
}
var player2 = canvas.addEventListener('click', player,false)
if (true){ // put your condition here
canvas.removeEventListener("click",player);
}
<html>
<head>
</head>
<body>
<canvas id="canvas">
</body>
</html>

TA貢獻1797條經驗 獲得超6個贊
問題 1:您的代碼不可讀
問題 2:您正在重新分配boolean: true到ifplayer塊內部,這導致.removeEventListener
如果你只想添加一次點擊監聽器,那么你可以在你的播放器函數中刪除監聽器。我修改了你的代碼,看看:
var canvas = document.getElementById("canvas");
const ctx = canvas.getContext('2d');
var turn = 0;
var img = new Image();
img.src = "maru.png";
var img_2 = new Image();
img_2.src = "batsu.png";
function fillRect(ctx, x, y, w, h) {
ctx.fillStyle = "skyblue",
ctx.fillRect(x, y, w, h)
}
function player(event) {
if (player) {
canvas.removeEventListener("click", player);
}
var x = event.screenX;
var y = event.screenY;
var imgTemp;
if (turn % 2 == 0) {
imgTemp = img
} else {
imgTemp = img_2
}
if (x < 150 && y < 190) {
ctx.drawImage(imgTemp, 5, 5, 145, 140)
turn += 1;
} else if (x > 160 && x < 335 && y < 190) {
ctx.drawImage(imgTemp, 168, 5, 145, 140)
turn += 1;
} else if (x > 335 && x < 470 && y < 190) {
ctx.drawImage(imgTemp, 330, 5, 145, 140)
turn += 1;
} else if (x < 160 && y >= 175 && y < 340) {
ctx.drawImage(imgTemp, 5, 170, 145, 140)
turn += 1;
} else if (x > 170 && x < 335 && y > 175 && y < 340) {
ctx.drawImage(imgTemp, 170, 170, 145, 140)
turn += 1;
} else if (x > 335 && x < 470 && y > 195 && y < 340) {
ctx.drawImage(imgTemp, 335, 170, 145, 140)
turn += 1;
} else if (x < 160 && y > 340 && y < 550) {
ctx.drawImage(imgTemp, 5, 335, 145, 140)
turn += 1;
} else if (x > 165 && x < 335 && y > 340 && y < 550) {
ctx.drawImage(imgTemp, 170, 335, 145, 140)
turn += 1;
} else if (x > 335 && x < 470 && y > 340 && y < 550) {
ctx.drawImage(imgTemp, 335, 335, 145, 140)
turn += 1;
}
}
fillRect(ctx, 5, 5, 150, 150);
fillRect(ctx, 170, 5, 150, 150);
fillRect(ctx, 335, 5, 150, 150);
fillRect(ctx, 5, 170, 150, 150);
fillRect(ctx, 170, 170, 150, 150);
fillRect(ctx, 335, 170, 150, 150);
fillRect(ctx, 5, 335, 150, 150);
fillRect(ctx, 170, 335, 150, 150);
fillRect(ctx, 335, 335, 150, 150);
canvas.addEventListener('click', player);
添加回答
舉報