Nickolay.info. JavaScript. Хостинг от Яндекса и буква "b"

Можете ли Вы предположить, что от имени переменной в скрипте может зависеть правильная или неправильная его работа? Если имена построены по правилам языка, на котором Вы пишете, такое предположение абсурдно. А вот на "народном" хостинге на момент написания заметки дело обстоит именно так.

Как оно часто бывает, я случайно обнаружил неправильную работу простого и старенького скрипта-игры Clicker. Ошибка заключалась в том, что во всех браузерах на строку, где было обращение к динамическому Javascript-массиву с именем b (информация о картинках на игровом поле) выдавалась ошибка о несуществовании объекта b[i]. Динамический двумерный массив на Javascript массив формировался так:

var board = new Array();
var c = new Array();
//...
function InitBoard() {
 var i,j;
 for (i=0;i<size; i++) {
  b[i] = new Array();
  c[i] = new Array();
  for (j=0;j<size;j++) {
   b[i][j] = '0000.gif'; c[i][j] = 0;
  }
 }
}

то есть, ничего необычного.

При этом Internet Explorer, как и всегда, со скриптом худо-бедно работал, а Opera и Firefox отказывались это делать напрочь, зато последний, тоже как всегда, позволил легко локализовать ошибку в своей консоли (меню Инструменты, Консоль ошибок).

После пары-тройки часов "отладки", при которой было перепробовано всё, что можно (если Вы имеете несчастье работать программистом, то знаете, как это бывает), я вспомнил, что этот скрипт должен болтаться на другом хостинге. К моему удивлению, там он заработал безупречно во всех браузерах (кроме того, что в "Опере", не подерживающей событие onUnload, не сохраняется игра при закрытии окна, о решении этой проблемы написано здесь). Но стоило скопировать работающий скрипт на "народный" хостинг (мелкие отличия между файлами всё равно были), как работа его закончилась.

После этого оставалось предположить только одно - при размещении скрипта на хостинге Народа.Ру нельзя называть динамический глобальный массив именем b.

Так оно и оказалось. Вот по этой ссылке находится скрипт, где имя b заменено на board, и он работает:
index.html

А вот эта версия скрипта отличается только тем, что в ней оставлено старое имя b:
index2.html

Интересно, об этом хоть где-нибудь написано?

Нетрудно догадаться, что проблема связана с рекламным блоком, добавляемым Яндексом на все страницы.

Была мысль написать об этом в саппорт Яндекса, но перечитал пользовательское соглашение, по которому "Яндекс" не отвечает вообще ни за что - и желание пропало полностью...

Хотя, пожалуй, отправлю в саппорт (support@narod.yandex.ru) вот это:

Здравствуйте,
меня заинтересовало, написано ли где-нибудь на "Яндексе", что в Javascript-коде, размещаемом на хостинге "Народа", нельзя называть глобальный массив именем b.

Вот две ссылки:
http://pers.narod.ru/jscript/clicker/index.html
http://pers.narod.ru/jscript/clicker/index2.html

Адресуемые файлы отличаются только тем, что во втором (моя исходная версия) объект (динамическая матрица) называется b, а в первом это имя пришлось везде заменить на board. Первый в любом браузере работает, второй - нет (если и загрузилось за счёт общей для обоих файлов куки - достаточно нажать ссылку "Новая" и посмотреть в консоль ошибок).

Отлаживать такие вещи жутко тяжело... догадываюсь, что проблема связана с рекламным блоком, добавляемым "Яндексом" на все страницы, потому что на другом хостинге всё работает и с именем массива b.

В пользовательском соглашении Яндекса справедливо написано, что Яндекс не гарантирует соответствие Сервиса целям и ожиданиям Пользователя Сервиса, его бесперебойную и безошибочную работу, но всё же хотелось бы какого-нибудь ответа, вдруг есть ещё такие "недопустимые" имена объектов?

С уважением, PerS, преданный пользователь сервисов Яндекса с момента его открытия.

P.S. Ответ от ТП "Яндекса" поступил следующий:

Мы примем к сведению Вашу информацию, спасибо.
(Люда Смешнова, 15 марта)

P.P.S. И это ещё не всё - если сделать в HTML-документе закладку с именем b кодом

<a name=b>b</a>

получится "ведущая в никуда" ссылка, по крайней мере, в некоторых браузерах: b

Вот так в Опере 11.01 тоже не работает правильно: b

HTML-код:

<a name="b">b</a>

А в Internet Explorer 8 загрузка этой страницы приведёт просто к сообщению об ошибке Javascript.

Рейтинг@Mail.ru

вверх гостевая; E-mail