Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Кроосбраузерность. С помощью чего? (https://javascript.ru/forum/misc/31648-kroosbrauzernost-s-pomoshhyu-chego.html)

stereomaniac1 15.09.2012 20:55

Кроосбраузерность. С помощью чего?
 
День добрый.
Прочёл часть учебника по JS на этом сайте (http://learn.javascript.ru), где автор, затрагивая вопросы достижения кроссбраузерности использовал проверку наличия того или иного метода через if-else

Пример:
element.onclick = function(event) {
  event = event || window.event; // Кроссбраузерно получить событие
    
  if (event.stopPropagation) { // существует ли метод?
    // Стандартно:
    event.stopPropagation();
  } else {
    // Вариант IE
    event.cancelBubble = true;
  }
}


А вот только что смотрел курс "Специалиста", где преподаватель, заведя речь о кроссбраузерности, начинает говорить о try-catch-finally

Т.е. в противовес коду, написанному выше, рекомендует делать так:
element.onclick = function(event) {
  event = event || window.event; // Кроссбраузерно получить событие

try {
event.stopPropagation();
} catch {
event.cancelBubble = true;
}


Т.к. я ещё новичёк в JS - меня эта ситуация поставила в тупик. Как же всё-таки правильней решать вопросы кроссбраузерности?

monolithed 15.09.2012 21:05

В последнем случае возбуждается исключение, это значит, что он менее производительный чем первый.

И еще, не назначайте так обработчики событий:

element.onclick

Нужно использовать специальные методы для работы с событиями (addEventListener и attachEvent). Для этого можно написать свою обертку:

<a href="#" id="link">click</a>

<script>
var $ = function(element) 
{
      if (!(this instanceof $))
            return new $(element);
  
      this.element = element;
};

$.prototype = 
{
      constructor: $,

      on: function(event, callback) 
      {
            if (typeof event !== 'string' && typeof callback !== 'function')
                  return this;
    
            if (this.element.addEventListener)
                  this.element.addEventListener(event, callback, false); 
    
            else if (this.element.attachEvent) 
            {
                  this.element.attachEvent('on' + event, function(event) 
                  {
                        callback.call(this, {
                              // ...
                        });
                  });
            }
      return this;
      }
};

$(document.getElementById('link')).on('click', function(event) {
      alert(event.target);
});
</script>

bes 15.09.2012 21:13

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

UPD: http://javascript.ru/forum/offtopic/...t-cenzury.html
где-то в конце темы спрашивал об этом же

nerv_ 16.09.2012 01:16

недавно плагин прикручивал. В нем стояла проверка браузера. Везде работало, кроме IE9. И вроде плагин серьезный, API все такое, но ребята не учли, что IE8 и IE9 работают по разному :) Пришлось дебажить :D

devote 16.09.2012 01:20

Цитата:

Сообщение от stereomaniac1
 if (event.stopPropagation) {

такой способ тоже менее производителен... так как на свойстве может висеть getter, а у функций/объектов происходит вызов toString поэтому лучше и более производительный вариант:
if ( "stopPropagation" in event ) {
}

dmitry111 16.09.2012 10:54

stereomaniac1,

у "специалиста" уровень подачи знаний js очень низкий. И уже не актуальные подходы. Сам их смотрел..
Если бы специалист преподавал по учебнику с этого сайта толку было бы больше!

По поводу кроссбраузерности (имею в виду ie<9) не думаю что надо париться тем, кто сейчас приступает к изучению языка ИМХО. Так как с внедрением всяких вкусностей от html5 он просто утонет, если будет изучать как сделать какую-нибудь фитюльку, чтоб работала в старых ie!

bes 16.09.2012 11:32

Цитата:

Сообщение от dmitry111
Так как с внедрением всяких вкусностей от html5 он просто утонет, если будет изучать как сделать какую-нибудь фитюльку, чтоб работала в старых ie!

полезный опыт имхо, хотя способен вызывать рвоту :)

dmitry111 16.09.2012 11:36

Цитата:

Сообщение от bes (Сообщение 204948)
полезный опыт имхо, хотя способен вызывать рвоту :)

уж проще тогда использовать jquery, хотя я где то слышал, что скоро и они перестанут поддерживать старых ослов :)

bes 16.09.2012 11:46

Цитата:

Сообщение от dmitry111
уж проще тогда использовать jquery, хотя я где то слышал, что скоро и они перестанут поддерживать старых ослов

о простоте речь не шла, речь шла об опыте эмуляции того, чего нет, с помощью того, что есть ;)

BallsShaped 16.09.2012 11:50

dmitry111, с кроссбраузерностью нужно начинать париться с самого начала изучения javascript, чтобы не возникало иллюзий. Нужно сразу понять, что каждый делает свои браузеры со своими преферансом и барышнями. И то, что можно написать что-то кроссплатформенное - это тоже иллюзия. Тут и так мертвым грузом висят всякие ie, так еще и мобильные браузеры. У этого 3d трансформации уже есть, у этого canvas тормозит, а этот вообще мультитач никак не понимает...


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