Статьи

Лучший способ создать Ajax?

Ajax существует уже некоторое время, и его практика разработки вполне зрелая. Как и большинство программистов, я остановился на образце, который выглядел в основном так:

function AjaxRequest()
{
   var request = null;
   
   if(typeof window.XMLHttpRequest != "undefined")
   {
      request = new XMLHttpRequest();
   }
   else if(typeof window.ActiveXObject != "undefined")
   {
      try
      {
         request = new ActiveXObject("Microsoft.XMLHTTP");
      }
      catch(err) { request = null; }
   }
   
   return request;
}

Сначала код проверяет собственный объект, который используется большинством современных браузеров, затем реализацию ActiveXIE6 . Такой код вы найдете во всем Интернете.

(Некоторые люди тестируют несколько версий XMLHTTPMSXML

Не так давно я писал инструмент разработки и тестирования под названием CSSUtilities — JavaScript API, который предоставляет методы для запросов к таблицам стилей CSS . Мне нужна была возможность Ajax для загрузки таблиц стилей; но, в частности, он должен был работать с локальными файлами, а также с сетевыми файлами , что современные браузеры поддерживают (хотя и с вариациями — такие запросы обычно возвращают код состояния HTTP 0HTTP). , что имеет смысл, поскольку они на самом деле не HTTP- запросы).

Но именно при разработке этой возможности я обнаружил нечто неприятное — нативный объект XMLHttpRequestIE8, вообще не работает для локальных файлов . И просто чтобы сделать жизнь сложнее, объект успешно создается, но попытка использовать его вызывает ошибку безопасности — "Access is denied"

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

Мое решение? Просто — сначала создайте экземпляр ActiveX . Таким образом, если используется версия IE , которая поддерживает и ту, и собственную версию, версия ActiveX если используются локальные файлы, будет работать версия ActiveX если используются удаленные файлы и собственный XHR отключен, версия ActiveXActiveXXHR включен, будет работать собственная версия. Ka’Plah!

 function AjaxRequest()
{
   var request = null;
   
   if(typeof window.ActiveXObject != "undefined")
   {
      try
      {
         request = new ActiveXObject("Microsoft.XMLHTTP");
      }
      catch(err) { request = null; }
   }
   if(request === null && typeof window.XMLHttpRequest != "undefined")
   {
      try
      {
         request = new XMLHttpRequest();
      }
      catch(err) { request = null; }
   }
   
   return request;
}

Конечно, если ActiveX но это уже было так, поэтому мы ничего не потеряли.

Обработка исключений вокруг первой попытки важна — так что сбой может быть зарегистрирован, и ссылка аннулирована, тогда у следующего условия есть возможность для выполнения (указывается как секунда, ifelse if Обработка исключений во второй попытке выполняется на всякий случай, поэтому нет вероятности возврата внутренних ошибок пользователю.

Суть всего этого состоит в том, чтобы не пытаться обойти безопасность или контроль пользователя — пользователи по-прежнему имеют полный контроль над собственными реализациями и реализациями ActiveX Суть в том, чтобы дать пользователю (который также может быть начинающим разработчиком) возможность разрешить работу кода, который он хочет работать, когда его настройки браузера не дают ему полного контроля.

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

Итак, что вы думаете — вы уже пришли к аналогичному выводу, или вы можете себе представить ситуацию, когда этот шаблон может создать проблемы? Возможно, вы приняли свои собственные шаблоны использования, которые отличаются от всего, что обсуждалось здесь?

Миниатюра кредит: никвахлероз