Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 15.09.2012, 20:55
Интересующийся
Отправить личное сообщение для stereomaniac1 Посмотреть профиль Найти все сообщения от stereomaniac1
 
Регистрация: 25.01.2012
Сообщений: 12

Кроосбраузерность. С помощью чего?
День добрый.
Прочёл часть учебника по 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 - меня эта ситуация поставила в тупик. Как же всё-таки правильней решать вопросы кроссбраузерности?
Ответить с цитированием
  #2 (permalink)  
Старый 15.09.2012, 21:05
Особый гость
Посмотреть профиль Найти все сообщения от monolithed
 
Регистрация: 02.04.2010
Сообщений: 4,260

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

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

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>

Последний раз редактировалось monolithed, 15.09.2012 в 21:46.
Ответить с цитированием
  #3 (permalink)  
Старый 15.09.2012, 21:13
Аватар для bes
bes bes вне форума
Профессор
Отправить личное сообщение для bes Посмотреть профиль Найти все сообщения от bes
 
Регистрация: 22.03.2012
Сообщений: 3,744

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

UPD: Можно ли считать это началом интернет цензуры ?
где-то в конце темы спрашивал об этом же

Последний раз редактировалось bes, 15.09.2012 в 21:16.
Ответить с цитированием
  #4 (permalink)  
Старый 16.09.2012, 01:16
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

недавно плагин прикручивал. В нем стояла проверка браузера. Везде работало, кроме IE9. И вроде плагин серьезный, API все такое, но ребята не учли, что IE8 и IE9 работают по разному Пришлось дебажить
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук

Последний раз редактировалось nerv_, 16.09.2012 в 01:19.
Ответить с цитированием
  #5 (permalink)  
Старый 16.09.2012, 01:20
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 24.05.2009
Сообщений: 5,176

Сообщение от stereomaniac1
 if (event.stopPropagation) {
такой способ тоже менее производителен... так как на свойстве может висеть getter, а у функций/объектов происходит вызов toString поэтому лучше и более производительный вариант:
if ( "stopPropagation" in event ) {
}
__________________
хм Russians say завтра but завтра doesn't mean "tomorrow" it just means "not today."
HTML5 history API рассширение для браузеров не поддерживающих pushState, replaceState
QSA CSS3 Selector Engine
Ответить с цитированием
  #6 (permalink)  
Старый 16.09.2012, 10:54
Аватар для dmitry111
Профессор
Отправить личное сообщение для dmitry111 Посмотреть профиль Найти все сообщения от dmitry111
 
Регистрация: 26.03.2012
Сообщений: 823

stereomaniac1,

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

По поводу кроссбраузерности (имею в виду ie<9) не думаю что надо париться тем, кто сейчас приступает к изучению языка ИМХО. Так как с внедрением всяких вкусностей от html5 он просто утонет, если будет изучать как сделать какую-нибудь фитюльку, чтоб работала в старых ie!
Ответить с цитированием
  #7 (permalink)  
Старый 16.09.2012, 11:32
Аватар для bes
bes bes вне форума
Профессор
Отправить личное сообщение для bes Посмотреть профиль Найти все сообщения от bes
 
Регистрация: 22.03.2012
Сообщений: 3,744

Сообщение от dmitry111
Так как с внедрением всяких вкусностей от html5 он просто утонет, если будет изучать как сделать какую-нибудь фитюльку, чтоб работала в старых ie!
полезный опыт имхо, хотя способен вызывать рвоту
Ответить с цитированием
  #8 (permalink)  
Старый 16.09.2012, 11:36
Аватар для dmitry111
Профессор
Отправить личное сообщение для dmitry111 Посмотреть профиль Найти все сообщения от dmitry111
 
Регистрация: 26.03.2012
Сообщений: 823

Сообщение от bes Посмотреть сообщение
полезный опыт имхо, хотя способен вызывать рвоту
уж проще тогда использовать jquery, хотя я где то слышал, что скоро и они перестанут поддерживать старых ослов
Ответить с цитированием
  #9 (permalink)  
Старый 16.09.2012, 11:46
Аватар для bes
bes bes вне форума
Профессор
Отправить личное сообщение для bes Посмотреть профиль Найти все сообщения от bes
 
Регистрация: 22.03.2012
Сообщений: 3,744

Сообщение от dmitry111
уж проще тогда использовать jquery, хотя я где то слышал, что скоро и они перестанут поддерживать старых ослов
о простоте речь не шла, речь шла об опыте эмуляции того, чего нет, с помощью того, что есть
Ответить с цитированием
  #10 (permalink)  
Старый 16.09.2012, 11:50
Профессор
Отправить личное сообщение для BallsShaped Посмотреть профиль Найти все сообщения от BallsShaped
 
Регистрация: 14.09.2012
Сообщений: 162

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



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Получить значение ячейки с помощью onclik Space-06 Events/DOM/Window 4 10.01.2012 09:39
Как реализовать переход с одной страницы на другую с помощью клавиш "стрелок" bazilio2010 Общие вопросы Javascript 6 13.11.2011 23:58
Анимированные кнопки с помощью jQuery a_c jQuery 9 11.04.2011 18:55
Прокрутка страницы с помощью клавиш Mirgorod Events/DOM/Window 0 17.06.2010 22:39
Проверка наличия логина в БД при регистрации, с помощью ajax storng Общие вопросы Javascript 4 09.04.2010 20:24