Событие JavaScript в классе на динамически созданном элементе

1

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

  1. Я могу заставить его работать только с существующими элементами, но мне нужно объявить его для элементов, которые позже будут созданы динамически. Я считаю, что проверка на eventlistener необходима, и, возможно, с помощью MutationObserver... и теперь я так далеко от моей глубины...

  2. Если я создаю два экземпляра бара, для двух элементов, которые существуют, тогда, когда я mousedown или mouseup, они, похоже, нацелены на один и тот же элемент. Я считаю, что это потому, что я использую прототип, а не это. Но я не могу заставить его работать, если я использую this.mousedown = func... вместо этого.

var bar = (function(){
  var me = this;
  function bar(id){
    me._id=id;
  }
  
  bar.prototype.mousedown=function(code){
    el().addEventListener('mousedown', code, false);
    return this;
  }
  
  bar.prototype.mouseup=function(code){
    el().addEventListener('mouseup', code, false);
    return this;
  }
  
  this.el=function(){
    return document.getElementById(me._id);
  };
  this.css=function(){
    return el().style;
  };
  
  return bar;
})();
который я затем использую так, для существующего элемента, в моем jsfiddle DIV с id batman.

Не уделяйте слишком много внимания функции css() и изменениям цвета, которые предназначены только для тестирования. Окончательный код, надеюсь, будет иметь некоторые вызовы ajax и т.д. Внутри них.

function foo(s){
  return new bar(s);
}

foo("batman")
  .mousedown(
    function(e){
      css().background="green";
    }
  )
  .mouseup(
    function(e){
      css().background="orange";
    }
  );

полный код jsbin с образцом

Теги:
addeventlistener

1 ответ

1
Лучший ответ

var me = this; : Здесь this относится к переменной window потому что вы не внутри объекта. Поэтому, когда вы создаете другой экземпляр bar (функция, объявленная строкой 3), me._id=id; переопределяет предыдущий идентификатор, потому что this ссылка не изменилась.

Используйте более объектно-ориентированный подход.

var bar = function(id){
  this.id=id;
}

bar.prototype.element=function(){
    return document.getElementById(this.id);
}

bar.prototype.css=function(){
    return this.element().style;
}

bar.prototype.mousedown=function(code){
    var that = this;
    this.element().addEventListener('mousedown', function(e){
      code(that);
    }, false);
    return this;
}
  
bar.prototype.mouseup=function(code){
  var that = this;
  this.element().addEventListener('mouseup', function(e){
      code(that);
  }, false);
  return this;
}

function foo(s){
  return new bar(s);
}

foo("batman")
  .mousedown(
    function(obj){
      obj.css().background="green";
    }
  )
  .mouseup(
    function(obj){
      obj.css().background="orange";
    }
  );

foo("batman2")
  .mousedown(
    function(obj){
      obj.css().background="green";
    }
  )
  .mouseup(
    function(obj){
      obj.css().background="orange";
    }
  );
.mydiv{
  background-color:#e72629;
  padding:5px;
  color:#ffffff;
  text-align:center;
}
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <title>JS Bin</title>
</head>
<body>

  
  
  <div class="mydiv" id="batman">
  hello world!
</div>
  
  <div class="mydiv" id="batman2">
  hello world 2!
</div>

  
</body>
</html>
  • 0
    Большое спасибо, именно то, что мне нужно, и выглядит намного лучше. Как насчет динамически упакованного элемента, который еще не существует. Добавление foo ("batman3") теперь без HTML-кода выдает ошибки.
  • 0
    @Jason Этот код должен работать для динамически создаваемых элементов, потому что он получает элемент по id через document.getElementById() .
Показать ещё 6 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню