Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   оброботка события load (https://javascript.ru/forum/misc/1809-obrobotka-sobytiya-load.html)

Dmitry A. Soshnikov 19.09.2008 18:39

Цитата:

Сообщение от ZoNT
Ха-ха-ха

ZoNT, бессмысленный неадекват начинается =) почитай об оптимизации JS. Закончим на этом (ты конструктивные советы не умеешь воспринимать ;)).

Octane 19.09.2008 18:47

Можно немного сократить условие :-)
function addEvent(e,t,f){
  if (e.addEventListener) e.addEventListener(t, f, false);
  //@cc_on e.attachEvent('on'+t, f);
}

function removeEvent(e,t,f){
  if (e.removeEventListener) e.removeEventListener(t, f, false);
  //@cc_on e.detachEvent('on'+t, f);
}

IE8b2 так и не поддерживает «addEventListener», и думаю не будет поддерживать, поэтому вроде должно корректно работать везде.

ZoNT 19.09.2008 18:56

Цитата:

Сообщение от Dmitry A. Soshnikov (Сообщение 6056)
ZoNT, бессмысленный неадекват начинается =) почитай об оптимизации JS. Закончим на этом (ты конструктивные советы не умеешь воспринимать ;)).

Фигасе, бессмысленный неадекват. Я тебе описал реальную ситуацию, которая работает на данный момент у нас в фирме...

Dmitry A. Soshnikov 19.09.2008 19:29

Цитата:

Сообщение от ZoNT
Фигасе, бессмысленный неадекват

да ладно, не парься =) этим я хотел сказать, что ты рассуждаешь о 93 гигах трафа, когда в код добавится пару строк; и то - после обфускации разница будет вообще микроскопической.

Octane, да, можно и условный комментарий. На всякий случай, приведу вариант, о котором говорил выше (необфусцированный, естественно):

var registerEvent = (function() {
  if (document.addEventListener) {
    return function(element, eventName, handler, useCapture) {
      return element.addEventListener(eventName, handler, useCapture);
    };
  } else if (document.attachEvent) {
    return function(element, eventName, handler) {
      return element.attachEvent('on' + eventName, handler);
    };
  }
})();

var unRegisterEvent = (function() {
  if (document.removeEventListener) {
    return function(element, eventName, handler, useCapture) {
      return element.removeEventListener(eventName, handler, useCapture);
    };
  } else if (document.detachEvent) {
    return function(element, eventName, handler) {
      return element.detachEvent('on' + eventName, handler);
    };
  }
})();

ZoNT 19.09.2008 21:00

ну и сравни по размеру:
function addEvent(e,t,f){if(e.addEventListener)e.addEventListener(t,f,false);else e.attachEvent('on'+t,f)}
function removeEvent(e,t,f){if(e.removeEventListener)e.removeEventListener(t,f,false);else e.detachEvent('on'+t,f)}

и
var addEvent=(function(){if(document.addEventListener)return function(e,n,h,u){e.addEventListener(n,h,u)};else return function(e,n,h){e.attachEvent('on'+n,h)}})();
var removeEvent=(function(){if(document.removeEventListener)return function(e,n,h,u){e.removeEventListener(n,h,u)};else return function(e,n,h){e.detachEvent('on'+n, h)}})();

338(твой)
223(мой)
Итого: 115 байт (более 100 байт).
(115 * 1 000 000 000)/1073741824 = 107 гигов/сутки.

Dmitry A. Soshnikov 19.09.2008 21:25

ZoNT, мелочи это все =) Ну как знаешь, повторю - я привел вариант оптимизации, принять или нет - это уже твое дело.

А по скорости тесты провел?

ZoNT 19.09.2008 21:32

Я тебе про оптимизацию по размеру, он мне про баню...
Выигрывая 10мс на стороне клиента мы попадаем на 107 гигов ежедневного трафика.

Ты линукс уважаешь? А ты знаешь что сейчас ядро линукса собирается с оптимизацией по размеру, а не по скорости?

Dmitry A. Soshnikov 19.09.2008 21:56

Цитата:

Сообщение от ZoNT
Я тебе про оптимизацию по размеру, он мне про баню...

Про оптимизацию по размеру это ты парировал уже позже (чтобы как-то оправдать лишние if'ы-else'ы), я изначально говорил об оптимизации по скорости.

По твоим рассказам, твой код должен тогда выглядеть примерно так (если на счету уже байты):

var d = document, 
b = 'EventListener',
c = 'add',
e = 'remove',
f = 'attach',
g = 'detach';

if(d[c+b])q[c+b](...); 

// и т.д.

// что ж ты так не пишешь, а? Если у вас так все сложно с трафом =)


Еще пример - глубокое DOM-дерево. Берем коллекцию (в самой глубине) из n-ого кол-ва элементов, проходимся циклом (ты, как я понимаю, будешь использовать второй вариант, да? (ну конечно, целых 9 байт текста тратится на объявление переменной length ;))):

// быстрый 
for (var k = 0, length = коллекция.length; k < length; k++) { // code }

// медленный (каждый раз вычисляется значение
// свойства length, перед этим из DOM-дерева получается
// сама колекция - это тоже время)
for (var k = 0; k < коллекция.length; k++) { // code }



Цитата:

Сообщение от ZoNT
Ты линукс уважаешь?

ага

Цитата:

Сообщение от ZoNT
А ты знаешь что сейчас ядро линукса собирается с оптимизацией по размеру, а не по скорости?

неа (но если это факт - буду знать)

ZoNT 19.09.2008 22:14

for (var k = 0, l=коллекция.length; k < l; k ++) - итого 3 лишних байта.

Но эта не тот случай, на котором надо экономить. Ты сильно утрируешь:
коллекция будет перебираться намного дольше, чем выполняется навешивание обработчика событий. Плюс я никогда не навешиваю обработку событий в цикле. Если есть куча элементов, которым надо навесить обработчик в цикле, значит можно этот обработчик навесить 1 раз на парент и немного откорректировать код.

Андрей Параничев 19.09.2008 22:23

У больших проектов (1 000 000 000 хостов) есть проблемы и побольше, чем 107 гигов траффика в сутки. Да и вообще обсуждается сферический сервер в вакууме, ведь при стольких хостах исходящий траффик настолько велик, что лучше задумываться об оптимизации скорости на клиенте, чем о лишних байтах.


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