AXForum  
Вернуться   AXForum > Блоги > CRM, SharePoint и Черная Магия
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск Все разделы прочитаны

Добро пожаловать в мой блог! Изначально он не задумывался как блог CRM разработчика, но жизнь сама внесла нужные коррективы. Тут я публикою все свои наблюдения относительно обозначенных в заголовке систем. Если Вы найдете в нем что-то интересное для Вас, как для заказчика, то буду рад сотрудничать с Вами! В моей компетенции 100% задач по MS CRM 3.0/4.0/2011:
  • Консалтинг
  • Проектирование
  • Разработка
  • Обучение


MVP 2010, 2011
Оценить эту запись

Кросбраузерный CRM. Первая боль...

Запись от Артем Enot Грунин размещена 12.04.2013 в 12:36

Свершилось. Вчера мы начали тестирование доработок в альтернативных браузерах. Текущий проект появился уже после всех кросбраузерных инициатив Microsoft так что взяв в руку мануалы
я тщательно соблюдал общепринятые (и часто общенеудобные) веб стандарты.

К сожалению, не только лишь в функциях проявляется разница между браузерами. Весь код с первой попытке взлетел в богомерзком Google Chrome, а вот любимый мной Mozilla Firefox, в честь которого я назвал своего рыжего кота, нанес мне коварный удар по самым стандартам...

Рассмотрим код, который корректно работает в Chrome и IE, однако отказывается работать в Firefox:
X++:
    Rest = {
        Execute: function (onrest)
        {
            var message = "tada!";
            onrest(message);
        }
    }

    Test = {
        OnLoad: function ()
        {
            if (true == true)
            {
                Rest.Execute(OnRest);

                function OnRest(mes)
                {
                    alert(mes);
                }
            }
        }
    }

    Test.OnLoad();
Кого-то может удивить, почему функция используется до своего объявления, однако это нормально. Так устроен JS (ECMAScript): область видимости функции конструируется до ее выполнения, поэтому достаточно объявить функцию или переменную и совершенно неважно когда она инициализируется - до или после объявления. В этом примере функция OnRest объявлена внутри функции OnLoad и присутствует в ее области видимости до момента вызова. В момент вызова первой строчки браузер знает где искать ее объявление.

Проблема заключается в другом: стандарт требует чтобы функции не объявлялись внутри блоков. Иными словами, функция может объявляться внутри другой функции, но она не должна объявляться внутри циклов или оператора if. При этом важно понимать, что в JS область видимости функции или переменной задается не блоками операторных скобок { } а областью объявления самой функции. Например следующий пример вполне корректный:
X++:
if (true == true)
{
 var i = 5;
}

alert(i);
хотя и выглядит жутковато для человека привыкшего к С-подобным языкам.

Как бы то ни было, разные браузеры смотрят на данный стандарт это по разному. Firefox не ищет объявление функций внутри управляющих блоков, поэтому функция оказывается неизвестна до своего объявления.

Если убрать блок if то пример будет работать во всех трех браузерах одинаково:
X++:
        Rest = {
            Execute: function (onrest)
            {
                var message = "tada!";
                onrest(message);
            }
        }

        Test = {
            OnLoad: function ()
            {
                Rest.Execute(OnRest);

                function OnRest(mes)
                {
                    alert(mes);
                }

            }
        }
Мораль: используя особенности языка, нужно четко понимать как они работают. Не объявляйте функции внутри управляющих блоков, а лучше до их использования.
Размещено в CRM
Просмотров 19308 Комментарии 0
Всего комментариев 0

Комментарии

 


Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 15:35.