<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>JSToolbox - все о JavaScript &#187; XMLHTTP</title>
	<atom:link href="http://www.jstoolbox.com/category/xmlhttp/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.jstoolbox.com</link>
	<description>Блог о программировании вообще и о JavaScript в частности, уроки, статьи, заметки, база знаний.</description>
	<lastBuildDate>Wed, 28 Jul 2010 22:33:40 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Создание объекта XMLHTTPRequest</title>
		<link>http://www.jstoolbox.com/2008/02/08/sozdanie-obekta-xmlhttprequest/</link>
		<comments>http://www.jstoolbox.com/2008/02/08/sozdanie-obekta-xmlhttprequest/#comments</comments>
		<pubDate>Fri, 08 Feb 2008 00:20:24 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[AJAX]]></category>
		<category><![CDATA[XMLHTTP]]></category>
		<category><![CDATA[Оптимизация]]></category>

		<guid isPermaLink="false">http://www.jstoolbox.com/2008/02/08/sozdanie-obekta-xmlhttprequest/</guid>
		<description><![CDATA[Очень часто для создания объекта XMLHTTPRequest используется схема с использованием структуры try &#8230; catch из-за того, что в разных браузерах этот объект создаётся по разному. В Internet Explorer объект XMLHTTPRequest создаётся при помощи ActiveX, в то время как другие браузеры используют собственный объект XMLHTTPRequest. Схема, о которой я говорю представена ниже:
function getXMLHTTPRequest() {
	try {
		req = [...]]]></description>
			<content:encoded><![CDATA[<p>Очень часто для создания объекта <strong>XMLHTTPRequest</strong> используется схема с использованием структуры <strong>try &#8230; catch</strong> из-за того, что в разных браузерах этот объект создаётся по разному. В Internet Explorer объект <strong>XMLHTTPRequest</strong> создаётся при помощи <strong>ActiveX</strong>, в то время как другие браузеры используют собственный объект <strong>XMLHTTPRequest</strong>. Схема, о которой я говорю представена ниже:</p>
<pre class="prettyprint">function getXMLHTTPRequest() {
	try {
		req = new XMLHttpRequest();
	} catch(err1) {
		try {
			req = new ActiveXObject("Msxml2.XMLHTTP");
		} catch (err2) {
			try {
				req = new ActiveXObject("Microsoft.XMLHTTP");
			} catch (err3) {
				req = false;
			}
		}
	}
	return req;
}</pre>
<p><span id="more-28"></span></p>
<p>Такой метод создания имеет недостаток &#8211; функция каждый раз при отправке AJAX запроса проверяет наличие объекта XMLHTTPRequest либо объектов ActiveX, что сказывается на производительности. В этом случае оптимизировать создание объекта можно при помощи <a href="http://www.jstoolbox.com/2008/01/19/optimizaciya-skorosti-vypolneniya-skriptov-javascript/#closures">замыканий (closures)</a>. Таким образом приходим к следующему коду:</p>
<pre class="prettyprint">var getXMLHTTPRequest = (function(){
	// массив функций
	var XMLHttpFactories = [
		function () {return new ActiveXObject("Microsoft.XMLHTTP")},
		function () {return new ActiveXObject("Msxml2.XMLHTTP")},
		function () {return new ActiveXObject("Msxml3.XMLHTTP")},
		function () {return new XMLHttpRequest()}
	];

	var xmlhttp = null;
	for (var i=XMLHttpFactories.length-1; i>=0; i--) {
		try {
			xmlhttp = XMLHttpFactories[i]();
		}
		catch (e) {
			continue;
		}
		return XMLHttpFactories[i];
	}
})();</pre>
<p>Здесь, функция getXMLHTTPRequest инициализируется одной из функций, содержащийся в массиве XMLHttpFactories. В итоге тело функции getXMLHTTPRequest в браузере Firefox будет иметь следующий вид:</p>
<pre class="prettyprint">
{return new XMLHttpRequest()}
</pre>
<p>Все просто, блок <strong>try &#8230; catch</strong> выполнится только один раз &#8211; при инициализации функции.</p>
<p>Еще один замечательный метод придумал Дастин Диаз (Dustin Diaz), его статью можно найти <a href="http://www.dustindiaz.com/faster-ajax/">здесь</a>. Суть та же, но решена она без использования замыканий:</p>
<pre class="prettyprint">var getXHR = function() {
	var http;
	try {
		http = new XMLHttpRequest;
		getXHR = function() {
			return new XMLHttpRequest;
		};
	} catch(e) {
		var msxml = [
			"MSXML2.XMLHTTP.3.0",
			"MSXML2.XMLHTTP",
			"Microsoft.XMLHTTP"
		];
		for (var i=0, len = msxml.length; i < len; ++i) {
			try {
				http = new ActiveXObject(msxml[i]);
				getXHR = function() {
					return new ActiveXObject(msxml[i]);
				};
				break;
			} catch(e) {}
		}
	}
};</pre>
<p>Здесь функция getXHR выполнит проверку только при первом вызове, во время которого она будет переназначена в зависимости от того, какой объект имеется в наличии.</p>
<p>Еще хочу обратить ваше внимание на функцию создания объекта XMLHTTP в библиотеке jQuery:</p>
<pre class="prettyprint">var xml = window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : new XMLHttpRequest();</pre>
<p>Это самый простой способ создания объекта из всех, виденных мной. Джон Ресиг, автор этого кода, утверждает, что различные методы создания ActiveX объектов, как то MSXML2.XMLHTTP.3.0, MSXML2.XMLHTTP и Microsoft.XMLHTTP не сильно различаются между собой, поэтому используется доступный для всех версий IE метод Microsoft.XMLHTTP, что значительно сокращает код. Поэтому, если нет особых требований к производительности функции, я бы порекомендовал использовать именно этот метод.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jstoolbox.com/2008/02/08/sozdanie-obekta-xmlhttprequest/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
