Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   хэширование ДОМ обьектов (https://javascript.ru/forum/events/32666-khehshirovanie-dom-obektov.html)

cyber 25.10.2012 01:16

хэширование ДОМ обьектов
 
Щас для курсовой пишу игру (язык дали любой на выбор поэтому решил на js) , пишу на чистом js и решил написать не лиж бы работало(как я всегда делал все курсовые:) ), а по человечески.
И решил учесть проблемы с утечкой памяти что бы их избежать решил сделать что то на подобие хэша jquery.
вот как я это понимаю
<!DOCTYPE HTML>
<html>
  <head> </head>
  <body>
    <div ></div >

    

    <script>


      
      var hash = [];
      
      hash["elem"] = document.body.children[0]
      
        
        var obj = {
        
          elem:"elem",
          
        innerHTML: function (text) {
          
          var elem = hash[this.elem];//обращение к элементу
          elem.innerHTML = text;  
          elem = null;
          
          }
        };      
      
      
      obj.innerHTML("one");
      
    </script>

  </body>
</html>

вспомнил как обьяснялось в учебнике http://learn.javascript.ru/memory-le...течками .
Правильно?

BallsShaped 25.10.2012 02:47

Нафиг так заморачиваться с древними браузерами - это почти не актуально уже. Лучше напиши игру, используя <canvas>. Всяк полезнее, чем лечить болячки динозавров.

melky 25.10.2012 06:14

Цитата:

Сообщение от cyber
учесть проблемы с утечкой памяти что бы их избежать

Цитата:

Сообщение от cyber
hash["elem"] = document.body.children[0]

ага :)
Цитата:

Сообщение от BallsShaped
Лучше напиши игру, используя <canvas>.

вот здесь начинается весёлое приключение!

я сам не пожалел, что начал изучать canvas. классная штука!

cyber 25.10.2012 09:44

Цитата:

Сообщение от BallsShaped (Сообщение 212097)
Нафиг так заморачиваться с древними браузерами - это почти не актуально уже. Лучше напиши игру, используя <canvas>. Всяк полезнее, чем лечить болячки динозавров.

Это акутально досихпор причем сильно!
Особенно это видно если на долго оставить социальные сети открытыми(твиттер, вк).
Так я и так на canvas делаю.
П.с вы наверно не совсем понимаете что такое утечка памяти, вот тут хорошо описанно http://learn.javascript.ru/memory-management.

cyber 25.10.2012 09:44

А насчет моего вопроса может кто то ответить?

BallsShaped 25.10.2012 13:45

cyber, я прекрасно понимаю, что такое утечки памяти в браузерах, но сам подумай, если их так хорошо видно в твиттере и вк, не значит ли, что всем пох на них?:) Тем более, если ты делаешь игру на canvas, значит ты не будешь создавать/удалять DOM-элементы. Так откуда у тебя взяться утечкам?

Your 25.10.2012 13:47

Ну почти), ты на верном пути...=)
Только детальнее и расширенее делай.

Чтобы не возникло нюансов.

cyber 25.10.2012 15:59

Цитата:

Сообщение от BallsShaped (Сообщение 212174)
cyber, я прекрасно понимаю, что такое утечки памяти в браузерах, но сам подумай, если их так хорошо видно в твиттере и вк, не значит ли, что всем пох на них?:) Тем более, если ты делаешь игру на canvas, значит ты не будешь создавать/удалять DOM-элементы. Так откуда у тебя взяться утечкам?

Ну начнем с того что менюшка будет не канве, ну а насчет забили , лично меня напрягает когда твиттер отжирает 300мб оперативы.
А с хэшем я хочу в общем по практиковаться это пригодиться и вдругих проектах.

cyber 25.10.2012 16:00

Цитата:

Сообщение от Your (Сообщение 212175)
Ну почти), ты на верном пути...=)
Только детальнее и расширенее делай.

Чтобы не возникло нюансов.

не совсем понял.

melky 25.10.2012 16:20

Цитата:

Сообщение от cyber
А насчет моего вопроса может кто то ответить?

при удалении со страницы ссылка на элемент остаётся -> он не убирается сборщиком мусора -> утечка памяти.

cyber 25.10.2012 16:31

Цитата:

Сообщение от melky (Сообщение 212249)
при удалении со страницы ссылка на элемент остаётся -> он не убирается сборщиком мусора -> утечка памяти.

это я понимаю и поэтому :
-нужен элемент обращаемся к нему через hash
-удаляем его со страници
-удаляем с хэша
все правильно?

melky 25.10.2012 16:49

Цитата:

Сообщение от cyber
все правильно?

ровно до того момента, как кто-то удалит элемент не через сеттер, который снесёт кэш \ хэш, а через низкоуровневые методы, которые поставляются с DOM.

cyber 25.10.2012 16:53

melky,
в данный момент это проблем не вызывает пока пишешь один=)
нужно будет как попробывать переписать через prototype методы удаления из дом(я понимаю что такого лучше не делать но все же:)).

cyber 25.10.2012 20:01

вот как замутил
var CacheOperat = {



        Add: function (selcector,name) {


            cache[name] = document.querySelectorAll(selector);
        },

        remove:function (name) {
    
            var rem = cache[name];
            rem.parentNode.removeChild(rem);
            cache[name] = null;
        
        }


    };

melky 25.10.2012 20:37

Цитата:

Сообщение от Дзен-трансгуманист
Будь добр, скажи это еще раз - для меня. И я начну его мусолить как только появится время.

я тоже собирался "начать" в течение 3х месяцев :) но наткнулся на конкурс, где надо сделать игруху на канвасе, и я решил научиться этому мастерству.

главное - цель иметь. если бы я не пытался сделать на нём эту игру, фиг бы у меня что получилось - эти кружочки, квадратики рисовать очень скучно.

cyber 25.10.2012 20:42

Кстати нашел книгу на канве вроде норм(на англ), если есть желающие могу выложить.

cyber 25.10.2012 20:42

Цитата:

Сообщение от melky (Сообщение 212302)
главное - цель иметь. если бы я не пытался сделать на нём эту игру, фиг бы у меня что получилось - эти кружочки, квадратики рисовать очень скучно.

У меня цель добровольно принудительная=)

cyber 25.10.2012 21:06

Цитата:

Сообщение от Дзен-трансгуманист (Сообщение 212310)
querySelectorAll возвращает NodeList, поэтому удалять нужно через цикл по индексам.

эм..
<!DOCTYPE HTML>
<html>
  <head> </head>
  <body>

    <div>  </div>
      <div>  </div>
      <div>  </div>
      <div>  </div>
      <div>  </div>  <div>  </div>
      <div>  </div>
    
    <script>

 var cache = [];
      
   cache["div"] = document.querySelectorAll("div");
      
   alert( cache["div"]);
      
  cache["div"] = null;
   alert( cache["div"]);
   
    </script>

  </body>
</html>

cyber 25.10.2012 21:35

Цитата:

Сообщение от Дзен-трансгуманист (Сообщение 212318)
cyber,
Да нет же.))

var CacheOperat = {

  add: function (selector, name) {

    return !cache.hasOwnProperty(name)?
      (cache[name] = document.querySelectorAll(selector)): null;
  },

  remove: function (name) {

    if (cache.hasOwnProperty(name)) {

      var rem = cache[name], i;
      for (i in rem) {
        rem[i].parentNode.removeChild(rem[i]);
      }
      delete cache[name];
    }
  }
};

вот блин, точно, лоханулся=)
пора забивать на седня и идти пить пиво=)

cyber 25.10.2012 22:01

переделал вот так
function CacheObj(){



        this.Add = function (selcector, name) {


            cache[name] = document.querySelectorAll(selector);
        }
        

       this.remove = function (name) {
    
           var removeElems = cache[name];

            removeElems.eache(function () {// each - метод добавленный через прототип 

                this.parentNode.removeChild(this);
            });

           delete cache[name] ;
        
        }


    };

cyber 25.10.2012 22:34

Цитата:

Сообщение от Дзен-трансгуманист (Сообщение 212334)
Попил пива и решил удариться в оверинжениринг? :)

да нет все просто
Array.prototype.each = function (fnc) {
	var leng = this.length;
	for(var i = 0;i< leng;i++) {
		fnc.call(this[i]);
		
		}
	
	};

писать циклы это скучно:haha:

melky 25.10.2012 23:05

Цитата:

Сообщение от cyber
писать циклы это скучно

а функции из ES5 велосипедить нескучно :)

cyber 25.10.2012 23:44

стоп , есть такой метод each ?

cyber 25.10.2012 23:48

наше, http://es5.javascript.ru/x15.4.html#x15.4.4.18 .
Мое оправдание:
слово each короче чем forEach :lol:

cyber 25.10.2012 23:55

так ладно пошел удалять свой маразм=)
<!DOCTYPE HTML>
<html>
  <head> </head>
  <body>

    <script>

Array.prototype.each = function (fnc) {
	var leng = this.length;
	for(var i = 0;i< leng;i++) {
		fnc.call(this[i]);
		
		}
	
	};

var arr = [];      
      
      for(var i = 0; i< 200;i++){
      
       arr.push(i);
      
      }     

      function speed(fnc) {
      var d = new Date();
        
      for(var i = 0;i< 10000;i++)fnc();
      
        return new Date() -d ;
      }   
      
      function myEach() {
      
      var sum = 0;
        
        arr.each(function(){
        
         sum+=this;
        });
     
      }
      
      function es5() {
      
        var sum = 0;
        
       arr.forEach(function(num){
        
        sum +=num;
        });
      
      } 
      
      alert("My "+ speed(myEach));
        alert("es5 "+ speed(es5));
    </script>

  </body>
</html>

cyber 26.10.2012 00:00

кстати еще и не плохая кроссбраузерность
https://developer.mozilla.org/en-US/.../Array/forEach


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