Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Два контекста в контексте onload (https://javascript.ru/forum/events/44019-dva-konteksta-v-kontekste-onload.html)

kostyanet 02.01.2014 10:58

Два контекста в контексте onload
 
Начинается канонично:

elem.addEventListener("click", this.load_image, false);


продолжается не менее того:

load_image: function (e) {

		if (e.preventDefault)
			e.preventDefault(); 
		e.returnValue = false;

		img = new Image();

		img.onload = function() {
			ImageZoom.show_me(img);
		}

		img.onerror = function() {
			return false;
		}
		img.title = this.title;
		ImageZoom.current_index = this.index;
		img.src = this.href;

	}


Объект как вы уже заметили называется ImageZoom. В процитированный типа метод приходит конечно контекст DOM' элемента, конкретно anchor. Я не могу заменить через call или bind его контекст на self-объектный, потому что elem-объектный нужен в первую очередь.

Как процитировано - так все работает. Но почему-то мне кажется что делать твердые копии имени объекта в объекте некомильфо.

Потратил около часа в поисках решения - не нашел. Это значит либо так вообще не делают, либо все настолько просто, что такого рода вопросов не возникает.

Вопрос такой: как получить в методе ссылку на инстансь в целом? При сохранении контекста вызова.

Спасибо.

danik.js 02.01.2014 11:46

Цитата:

Сообщение от kostyanet
Вопрос такой: как получить в методе ссылку на инстансь в целом? При сохранении контекста вызова.

Только так, как это у тебя сделано.
Мне кажется лучше все же привязать контекст к инстансу, а ссылку на элемент получать из события (e.currentTarget || e.srcElement)

kostyanet 02.01.2014 13:15

Спасибо. Сделал, работает. Но внешний вид еще сильнее "поцтрадал". Гляньте, все ли правильно, пжлста.

elem.addEventListener("click", function(e){this.load_image(e)}.bind(this), false);


и соответственно

load_image: function (e) {

		if (e.preventDefault)
			e.preventDefault(); 
		e.returnValue = false;

		var elem = e.currentTarget || e.srcElement;
		
		var img = new Image();
		// draw new image
		img.onload = function() {
			this.show_me(img);
		}.bind(this);

		img.onerror = function() {
			return false;
		};
		
		img.title = elem.title;
		this.current_index = elem.index;
		img.src = elem.href;

	}


В анамнезе все было обычным набором функций в пределах одного файлика, но возникла потребность завести две или больше отдельных смотрелки на два или больше не связанных контейнера. Скажем фотки продукта сами по себе крутятся по нажатию кнопок, а фотки связанных продуктов не пересекаются, крутятся сами по себе. И резко поплохело... :)

Я еще не проверял сработает ли оно без конструктора, потому что объект этот - объект

var ImgeZoom = {};

danik.js 02.01.2014 19:20

Цитата:

Сообщение от kostyanet
var ImgeZoom = {};

Цитата:

Сообщение от kostyanet
        this.current_index = elem.index;

То есть один current_index на всю страницу? Не должен ли он быть свойством инстанса, коих должно быть два (то есть нужен конструктор чтоб их клепать)

kostyanet 03.01.2014 00:44

Нет, разный. Индекс прямо пишется в img. По событию достается и проверяется. img собираются в унутренние массивы, но все равно не проканало. В js, оказывается нет классов вообще. В результате инстансь от объекта с которого уже сделана инстансь наследует все барахло предыдущей инстанси. Придется переписывать на функцию, чтобы был конструктор.

danik.js 03.01.2014 01:12

Цитата:

Сообщение от kostyanet
В js, оказывается нет классов вообще

Вот это поворот! Не ожидал, да? :D

kostyanet 03.01.2014 10:15

Да вообще затупил. Всего-то надо было заенкложить весь набор функций и одну запустить без имени. Это ж простейшая смотрелка, никаких внешних действий кроме юзерских щелчков не предусмотрено.


Часовой пояс GMT +3, время: 23:32.