2013-12-19 2 views
1

Я делаю en event listener внутри выбранной функции, но я не могу удалить ее в функции «win». (выбранная функция реализована в setInterval, но только после вызова clearInterval) Как я могу удалить этот прослушиватель событий? Я не хочу, чтобы текст менялся после того, как я нажал.Не удается удалить eventListener

function chose() { 
    canvas.onmousemove = function (event) { 
     if (((ballPos == 1) & (event.clientX > posX1) & (event.clientX < posX1 + cupw) & (event.clientY > posY) & (event.clientY < posY + cuph)) | 
      ((ballPos == 2) & (event.clientX > posX2) & (event.clientX < posX2 + cupw) & (event.clientY > posY) & (event.clientY < posY + cuph)) | 
      ((ballPos == 3) & (event.clientX > posX3) & (event.clientX < posX3 + cupw) & (event.clientY > posY) & (event.clientY < posY + cuph))) 
      win = true; 

     else 
      win = false; 
     canvas.addEventListener('click', function() { 
      winpage(win); 
     }, false); 
    } 

} 

function winpage(win) { 
    canvas.removeEventListener('click', function() { 
     winpage(win); 
    }, false); 
    context.clearRect(0, 0, w, h); 
    context.drawImage(backGround, 0, 0, w, h); 
    if (win) 
     context.fillText("YOU WIN!!!", w/2, h/2); 
    else 
     context.fillText("YOU LOSE!!!", w/2, h/2); 
} 
+0

И Лалит Кумар, и Krzysiek дают вам правильный ответ. Чтобы удалить прослушиватель событий, подпись обработчика должна быть одинаковой как в addEventListener & removeEventListener. Таким образом, вы не можете использовать анонимную функцию для создания слушателя. Вы должны использовать одну и ту же именованную функцию обработчика как в командах добавления, так и удаления. Часто используемой альтернативой является создание флага, который можно установить/отключить, чтобы указать, хотите ли вы, чтобы определенная обработка имела место или нет. – markE

ответ

0

Это должна быть точно такая же функция.

var handler = function() { 
     winpage(win); 
    }; 
function chose() { 
    canvas.onmousemove = function (event) { 
     if (((ballPos == 1) & (event.clientX > posX1) & (event.clientX < posX1 + cupw) & (event.clientY > posY) & (event.clientY < posY + cuph)) | 
      ((ballPos == 2) & (event.clientX > posX2) & (event.clientX < posX2 + cupw) & (event.clientY > posY) & (event.clientY < posY + cuph)) | 
      ((ballPos == 3) & (event.clientX > posX3) & (event.clientX < posX3 + cupw) & (event.clientY > posY) & (event.clientY < posY + cuph))) 
      win = true; 

     else 
      win = false; 
     canvas.addEventListener('click', handler, false); 
    } 

} 

function winpage(win) { 
    canvas.removeEventListener('click', handler, false); 
    context.clearRect(0, 0, w, h); 
    context.drawImage(backGround, 0, 0, w, h); 
    if (win) 
     context.fillText("YOU WIN!!!", w/2, h/2); 
    else 
     context.fillText("YOU LOSE!!!", w/2, h/2); 
} 
+0

Если я использовал обработчик, как это, он никогда не входит в функцию обработчика, тогда я пробовал его следующим образом: 'function handler() { \t winpage (win); } '}' но таким образом он не удаляет слушателя – user3115593

0

Создать слушатель события, как показано ниже, что будет добавлять и удалять, как вы хотели в вашем коде.

var win; 
var listener = function (event) { 
    /* do something here */ 
    // You can also remove event here 
    // As below will remove event from target element 
    // event.target.removeEventListener('click', listener, false); 
    winpage(win); 
}; 

Добавить событие, как показано ниже

function chose() { 
     canvas.onmousemove = function (event){ 
     if(((ballPos == 1)&(event.clientX > posX1)&(event.clientX < posX1+cupw)&(event.clientY > posY)&(event.clientY < posY+cuph)) | 
       ((ballPos == 2)&(event.clientX > posX2)&(event.clientX < posX2+cupw)&(event.clientY > posY)&(event.clientY < posY+cuph)) | 
       ((ballPos == 3)&(event.clientX > posX3)&(event.clientX < posX3+cupw)&(event.clientY > posY)&(event.clientY < posY+cuph))) 
      win = true; 

     else 
      win = false; 
     canvas.addEventListener('click',listener, false);} 
} 

И удалить событие, как показано ниже

winpage = function(win) { 
    canvas.removeEventListener('click',listener, false); 
    context.clearRect(0, 0, w, h); 
    context.drawImage(backGround, 0, 0, w, h); 
    if (win) 
     context.fillText("YOU WIN!!!",w/2,h/2); 
    else 
     context.fillText("YOU LOSE!!!",w/2,h/2); 
} 

Всегда есть ссылка слушателя событий для добавления и удаления его из желаемого элемента DOM.

Прочитать полную документацию по addEventListener и removeEventListener. См. Это example.

+0

спасибо, попробовал, но теперь он даже не реагирует на щелчок, возможно, его удаляет ровный слушатель перед ним. Какие-нибудь советы для этого? – user3115593

+0

Проверьте метод обработчика, и вы должны написать логику, когда вы собираетесь удалить и снова добавить ее для действия. Могу ли я увидеть ваш новый код после изменения? –

Смежные вопросы