Make me unsee it

Приходится иногда сталкиваться в программировании с такими «костылями», что даже не знаешь, стоять или падать.

Вот, например, извращенная задачка в веб-программировании. Есть два сайта — один на ASP.NET под IIS, другой на PHP под Apache. Первый крутится по адресу, к примеру, http://webserver:80/, другой — http://webserver:8080/. Задача — на первом сайте есть ссылка, открывающая окошко со страничкой второго сайта, оттуда надо передать JavaScript-ом какие-то данные в родительское окно. Думаю, все видели вот такие «палитры», так что представить в состоянии.

Разница в том, что «палитра» расположена немного по другому адресу и может подпадать под блокировку «кроссдоменной» передачи данных. Причем самое интересное — это то, что каждый из трех популярных браузеров понимает «кроссдоменность» по-разному.

Internet Explorer всех версий вообще не делает различий между domain.com:80 и domain.com:8080. Соответственно, все работает правильно.

Firefox считает такие «домены» разными и по умолчанию блокирует передачу. Правда, спасает вот такое заклинание, произнесенное перед открытием «палитры» в родительском окне и в дочернем — до передачи данных:

document.domain = document.domain;

Смысл заклинания совершенно необъясним, поэтому «это нельзя понять, это надо запомнить».

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

Вопрос фанатам «альтернативных браузеров»: и чего же вы добились, обвиняя Microsoft и Internet Explorer во всех смертных грехах, начиная от монополизма? Похоже, только того, что в каждом из браузеров надо применять свои «костыли и подпорки», а любая программа на JavaScript начинается с разбора трех случаев.

PS К сожалению, ни прикрутить ASP.NET к Apache, ни PHP к IIS нереально — апачевский модуль для ASP.NET совершенно не хочет работать, а PHP-шная часть сайта существенно использует апачевские возможности по работе с .htaccess.

Make me unsee it: 4 комментария

  1. >любая программа на JavaScript начинается с разбора трех случаев
    любая программа на JavaScript начинается с разбора более чем трех случаев
    добавляем Chrome, основные мобильные браузеры (а что, и их забывать?), да мало ли что еще…

  2. что-то вы ужасы расписываете.

    Любой скрипт вставляется на раз с помощью

    document.write(«….»), document.write(») и прочие аджаксы

    1. Так я не скрипт вставляю, с этим проблем нет. Я из скрипта в «другом», с точки зрения Firefox, домене пытаюсь обращаться к opener.document.foo.bar.bla.bla.bla.

      Причем Firefox без этого чудного выражения считает разными, к примеру, 192.168.100.1:8080 и 192.168.100.1, или domain.com:8080 и domain.com.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *