Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 29.06.2014, 15:46
Новичок на форуме
Отправить личное сообщение для Arnowt Посмотреть профиль Найти все сообщения от Arnowt
 
Регистрация: 29.06.2014
Сообщений: 8

Объект JS не понятное поведение или как повесить обработчик внутри объекта
function floatBlock(el){
		this.el=el;
		var init=false;
		this.run=function(){
			alert(this.el+' | '+init);//!!!!!!!!!!!!!!!!!!!!!
			if(init!=true){init=true; $(window).resize(this.run);}
		}
		this.run();
	}
	$().ready(function(){new floatBlock('QWERT')});
  • Запускаем скрипт.
  • алерт ожидаемо выдает выдает «QWERT | false»
  • делаем ресайз
  • и вот тут для меня не понятная фигня получается «undefined | true»
почему el==undefined? неужели объект пересоздается? почему тогда init==true?

Последний раз редактировалось Arnowt, 29.06.2014 в 15:57.
Ответить с цитированием
  #2 (permalink)  
Старый 29.06.2014, 16:13
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,112

Arnowt,
$(function ()
  	  {
  	    function floatBlock(el) {
  	      this.el = el;
  	      var init = false;
  	      this.run = (function (a)
  	        {
  	          return function() {
  	            alert(a.el+' | '+init); //!!!!!!!!!!!!!!!!!!!!!
  	            if(init!=true) {init = true; $(window).resize(a.run);}
  	          }
  	        }
  	      )(this)
  	      this.run();
  	    }
  	    new floatBlock('QWERT')
  	  }
  	)
Ответить с цитированием
  #3 (permalink)  
Старый 29.06.2014, 16:59
Новичок на форуме
Отправить личное сообщение для Arnowt Посмотреть профиль Найти все сообщения от Arnowt
 
Регистрация: 29.06.2014
Сообщений: 8

Египетская сила...
анонимная функция которая возвращает анонимную функцию...
СПС конечно, но может есть варианты по проще?
которые и через пол года можно быстро понять, учитывая что я больше на php специализируюсь.
Ответить с цитированием
  #4 (permalink)  
Старый 29.06.2014, 17:22
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,112

Arnowt,
http://learn.javascript.ru/bind
Ответить с цитированием
  #5 (permalink)  
Старый 29.06.2014, 17:23
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,587

Сообщение от Arnowt Посмотреть сообщение
анонимная функция которая возвращает анонимную функцию...
Это есть суть js, mon ami.)

Обычно чтобы сохранить this (ребята пришедшие из других языков и не понимающие сути js) делают так:
$(function() {
    function floatBlock(el) {
        this.el = el;
        var init = false;
        var _self = this;
        this.run = function() {
            alert(this.el + ' | ' + init); //!!!!!!!!!!!!!!!!!!!!!
            if (init != true) {
                init = true;
                $(window).resize(_self.run);
            }
        }

        this.run();
    }
    new floatBlock('QWERT')
})


Можно ещё так:
$(window).resize(this.run.bind(this));
, но bind есть не во всех браузерах.(хотя полифил несложно пишется)
__________________
29375, 35
Ответить с цитированием
  #6 (permalink)  
Старый 29.06.2014, 17:38
Новичок на форуме
Отправить личное сообщение для Arnowt Посмотреть профиль Найти все сообщения от Arnowt
 
Регистрация: 29.06.2014
Сообщений: 8

Через «SELF» уже пробовал но как-то тоже не комильфо
упростил до максимума:
function floatBlock(el){
	this.el=el;
	this.move=function(){
		alert(this.el);
		//тут будет основной алгоритм 
	};
	$(window).resize(this.move);
	$(window).scroll(this.move);
	this.move();
}
$(function(){new floatBlock('QWERT')});

может тогда проще всякий раз передавать параметр и вообще не хранить его в объекте
ну типа:
$(window).resize(function(){this.move(el)});

?
Ответить с цитированием
  #7 (permalink)  
Старый 29.06.2014, 17:43
Новичок на форуме
Отправить личное сообщение для Arnowt Посмотреть профиль Найти все сообщения от Arnowt
 
Регистрация: 29.06.2014
Сообщений: 8

Хотя и через bind, думаю будет нормально... осел 6,0 не интересен, так можно и до калькулятора дойти.
На современных смартфонах, он же должен поддерживаться?
Ответить с цитированием
  #8 (permalink)  
Старый 29.06.2014, 19:00
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,587

Сообщение от Arnowt Посмотреть сообщение
$(window).resize(function(){this.move(el)});
так работать всё равно не будет, ибо в resize скрывается eventListener, и при появлении события в this принудительно передаётся элемент оное поймавший.

Теперь можно ещё так:
$(window).resize(()=>this.move(el));
но это пока только в последних ff.

Сообщение от Arnowt Посмотреть сообщение
На современных смартфонах, он же должен поддерживаться?
http://caniuse.com/#search=bind
__________________
29375, 35

Последний раз редактировалось Aetae, 29.06.2014 в 19:02.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как добраться до объекта внутри div#? Randomizer jQuery 8 24.09.2010 12:01
Как при чтении или записи свойства объекта вызывать функцию danik.js Общие вопросы Javascript 3 16.09.2010 17:57
Объект как свойство объекта Cooskon Общие вопросы Javascript 6 16.02.2010 21:41
Можно ли получить имя экземпляра объекта внутри самого объекта? Ichigeki Общие вопросы Javascript 9 14.11.2008 19:00
Как повесить обработчик onchange на lookup spps Общие вопросы Javascript 0 09.09.2008 15:59