Задать вопрос
MrGobus
@MrGobus
Иван

Javascript image.onload — как узнать объект установивший вызов?

Как узнать кто создал или инициировал вызов события в JavaScript?

Теперь подробнее о задаче - загрузка текстуры в WebGL. Я реализовал так:

Texture.prototype.loadImage = function(url) {
                image = new Image();
                image.owner = this; // смело, но гложет червь сомнения
                image.onload = function() {
                    gl.bindTexture(gl.TEXTURE_2D, this.owner.texture);
                    gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image);
                }
                image.src = url;
            }


Так как onload забывает (либо я незнаю как узнать) кто его вызывал действия по загрузке текстуры теряют смысл, так как неизвестно куда ее загружать. Я решил проблему привязав к объекту image поле указывающее на класс создателя но сделал это грубо и топорно, вот так:

image.owner = this;

Умом понимаю что так делать некорректно (можно же что-то важное перекрыть) и если кто знает правильное решение пожалуйста подскажите как в таких случаях поступать.
  • Вопрос задан
  • 825 просмотров
Подписаться 1 Оценить Комментировать
Решения вопроса 1
Taraflex
@Taraflex
Ищу работу. Контакты в профиле.
Texture.prototype.loadImage = function(url) {
                var image = new Image();
                var self = this;
                image.onload = function() {
                    gl.bindTexture(gl.TEXTURE_2D, self.texture);
                    gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image);
                }
                image.src = url;
            }
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
mlnkv
@mlnkv
JavaScript Developer
Texture.prototype.loadImage = function(url) {
  var image = new Image();
  image.onload = function() {
    gl.bindTexture(gl.TEXTURE_2D, this.texture);
    gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image);
  }.bind(this);
  image.src = url;
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы