Добро пожаловать в мой блог! Изначально он не задумывался как блог CRM разработчика, но жизнь сама внесла нужные коррективы. Тут я публикою все свои наблюдения относительно обозначенных в заголовке систем. Если Вы найдете в нем что-то интересное для Вас, как для заказчика, то буду рад сотрудничать с Вами! В моей компетенции 100% задач по MS CRM 3.0/4.0/2011:
MVP 2010, 2011
- Консалтинг
- Проектирование
- Разработка
- Обучение
MVP 2010, 2011
Кросбраузерный CRM. Первая боль...
Запись от Артем Enot Грунин размещена 12.04.2013 в 12:36
Теги browser, firefox, java script
Свершилось. Вчера мы начали тестирование доработок в альтернативных браузерах. Текущий проект появился уже после всех кросбраузерных инициатив Microsoft так что взяв в руку мануалы
К сожалению, не только лишь в функциях проявляется разница между браузерами. Весь код с первой попытке взлетел в богомерзком Google Chrome, а вот любимый мной Mozilla Firefox, в честь которого я назвал своего рыжего кота, нанес мне коварный удар по самым стандартам...
Рассмотрим код, который корректно работает в Chrome и IE, однако отказывается работать в Firefox:
Кого-то может удивить, почему функция используется до своего объявления, однако это нормально. Так устроен JS (ECMAScript): область видимости функции конструируется до ее выполнения, поэтому достаточно объявить функцию или переменную и совершенно неважно когда она инициализируется - до или после объявления. В этом примере функция OnRest объявлена внутри функции OnLoad и присутствует в ее области видимости до момента вызова. В момент вызова первой строчки браузер знает где искать ее объявление.
Проблема заключается в другом: стандарт требует чтобы функции не объявлялись внутри блоков. Иными словами, функция может объявляться внутри другой функции, но она не должна объявляться внутри циклов или оператора if. При этом важно понимать, что в JS область видимости функции или переменной задается не блоками операторных скобок { } а областью объявления самой функции. Например следующий пример вполне корректный:
хотя и выглядит жутковато для человека привыкшего к С-подобным языкам.
Как бы то ни было, разные браузеры смотрят на данный стандарт это по разному. Firefox не ищет объявление функций внутри управляющих блоков, поэтому функция оказывается неизвестна до своего объявления.
Если убрать блок if то пример будет работать во всех трех браузерах одинаково:
Мораль: используя особенности языка, нужно четко понимать как они работают. Не объявляйте функции внутри управляющих блоков, а лучше до их использования.
- Resolve Breaking Script Issues When Upgrading Microsoft Dynamics CRM
- Upgrade Scripts to Microsoft Dynamics CRM 2011
- Use JavaScript with Microsoft Dynamics CRM
К сожалению, не только лишь в функциях проявляется разница между браузерами. Весь код с первой попытке взлетел в богомерзком 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();
Проблема заключается в другом: стандарт требует чтобы функции не объявлялись внутри блоков. Иными словами, функция может объявляться внутри другой функции, но она не должна объявляться внутри циклов или оператора 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);
}
}
}
Всего комментариев 0