removeEventListener — возвращает false без остановки прослушивателя

#javascript #addeventlistener #removeeventlistener

#javascript #addeventlistener #removeeventlistener

Вопрос:

Я слушаю изменения в двух переменных height и weight . Когда оба оцениваются как true, я ожидал, что возвращаемое значение false остановит прослушиватель. Он продолжает добавляться <script type="text/javascript" src="js/modelers/average_aboveaverage.js"></script> , когда я перемещаю ползунок диапазона в другом месте моего кода.

   function makeModeler() {
    document.addEventListener("change", function(){
      var height = document.getElementById('height-class').value; 
      var weight = document.getElementById('weight-class').value;
      shape = height   "_"   weight;
     
      if (!(height amp;amp; weight)) { 
        return true;

      } else {
        var script = document.createElement("script");
        script.type = "text/javascript";
        script.src = "js/modelers/" shape ".js";

        document.body.appendChild(script);
        return false;        
      }
    });  
   
  }

  makeModeler();

  document.addEventListener("change", makeModeler);
  document.removeEventListener("change", makeModeler, false);
  

Ответ №1:

Вы добавляете событие бесконечно при каждом изменении, поскольку вы делаете:

 document.addEventListener("change", makeModeler);
  

И makeModeler функция также добавляет сначала это onChange событие

Комментарии:

1. Я удалил addListener, который все еще работает бесконечно. Я не уверен, что имею в виду, когда вы говорите, что функция makeModeler сначала добавляет onChange.

Ответ №2:

Мне пришлось найти нетрадиционный способ остановить EventListener. EventTarget не сработал для меня из-за «динамического» способа рендеринга данных на моем сайте. В качестве примечания, addEventListener должен поставляться с возможностью остановить его бесконечный запуск. Кажется очевидным.

Я добавил слушателя в do / while:

   var height = document.getElementById('height-class').value; 
  var weight = document.getElementById('weight-class').value;
  
  do {
    document.addEventListener("change", function(){
      
      var height = document.getElementById('height-class').value; 
      var weight = document.getElementById('weight-class').value;

      shape = height   "_"   weight;
     
      if (!(height amp;amp; weight)) { 
        return true;      

      } else {
        var script = document.createElement("script");
        script.type = "text/javascript";
        script.src = "js/modelers/" shape ".js";

        document.body.appendChild(script);
        document.getElementById('weight-class').id = "weight-class2";
        
      }
      
    });  
  }
  while (height amp;amp; weight);
  

Я изменил идентификатор элемента, чтобы остановить вычисление условия while на true. Более опытный программист может знать, как лучше остановить условие.