ÐÑа глава поÑвÑÑена IFRAME â ÑÐ°Ð¼Ð¾Ð¼Ñ Ð´ÑÐµÐ²Ð½ÐµÐ¼Ñ Ð¸ кÑоÑÑ-бÑаÑзеÑÐ½Ð¾Ð¼Ñ ÑпоÑÐ¾Ð±Ñ AJAX-запÑоÑов.
СейÑÐ°Ñ Ð¾Ð½ иÑполÑзÑеÑÑÑ, Ñазве ÑÑо, Ð´Ð»Ñ Ð¿Ð¾Ð´Ð´ÐµÑжки кÑоÑÑ-доменнÑÑ Ð·Ð°Ð¿ÑоÑов в IE7- и, ÑÑо ÑÑÑÑ Ð±Ð¾Ð»ÐµÐµ акÑÑалÑно, Ð´Ð»Ñ ÑеализаÑии COMET в IE9-.
ÐÐ»Ñ Ð¾Ð±ÑÐµÐ½Ð¸Ñ Ñ ÑеÑвеÑом ÑоздаÑÑÑÑ Ð½ÐµÐ²Ð¸Ð´Ð¸Ð¼Ñй IFRAME. Рнего оÑпÑавлÑÑÑÑÑ Ð´Ð°Ð½Ð½Ñе, и в него же ÑеÑÐ²ÐµÑ Ð¿Ð¸ÑÐµÑ Ð¾ÑвеÑ.
Ðведение
СнаÑала â немного вÑпомогаÑелÑнÑÑ
ÑÑнкÑий и оÑобенноÑÑи ÑабоÑÑ Ñ IFRAME.
ÐвÑлиÑноÑÑÑ IFRAME: окно+докÑменÑ
ЧÑо Ñакое IFRAME? Ðа ÑÑÐ¾Ñ Ð²Ð¾Ð¿ÑÐ¾Ñ Ñ Ð±ÑаÑзеÑа два оÑвеÑа
-
IFRAME â ÑÑо HTML-Ñег:
<iframe>Ñо ÑÑандаÑÑнÑм набоÑом ÑвойÑÑв.- Тег можно ÑоздаваÑÑ Ð² JavaScript
- У Ñега еÑÑÑ ÑÑили, можно менÑÑÑ.
- Ð ÑÐµÐ³Ñ Ð¼Ð¾Ð¶Ð½Ð¾ обÑаÑиÑÑÑÑ ÑеÑез
document.getElementByIdи дÑÑгие меÑодÑ.
-
IFRAME â ÑÑо окно бÑаÑзеÑа, вложенное в оÑновное
- IFRAME â Ñакое же по ÑÑнкÑионалÑноÑÑи окно бÑаÑзеÑа, как и оÑновное, Ñ Ð°Ð´ÑеÑом и Ñ.п.
- ÐÑли докÑÐ¼ÐµÐ½Ñ Ð²
IFRAMEи внеÑнее окно Ð½Ð°Ñ Ð¾Ð´ÑÑÑÑ Ð½Ð° ÑазнÑÑ Ð´Ð¾Ð¼ÐµÐ½Ð°Ñ , Ñо пÑÑмой вÑзов меÑодов дÑÑг дÑÑга невозможен.
- ÐÑли докÑÐ¼ÐµÐ½Ñ Ð²
- СÑÑÐ»ÐºÑ Ð½Ð° ÑÑо окно можно полÑÑиÑÑ ÑеÑез
window.frames['Ð¸Ð¼Ñ ÑÑейма'].
- IFRAME â Ñакое же по ÑÑнкÑионалÑноÑÑи окно бÑаÑзеÑа, как и оÑновное, Ñ Ð°Ð´ÑеÑом и Ñ.п.
ÐÐ»Ñ Ð´Ð¾ÑÑÐ¸Ð¶ÐµÐ½Ð¸Ñ Ñели Ð¼Ñ Ð±Ñдем ÑабоÑаÑÑ ÐºÐ°Ðº Ñ Ñегом, Ñак и Ñ Ð¾ÐºÐ½Ð¾Ð¼. Ðни, конеÑно же, взаимоÑвÑзанÑ.
Ð Ñеге <iframe> ÑвойÑÑво contentWindow Ñ
ÑÐ°Ð½Ð¸Ñ ÑÑÑÐ»ÐºÑ Ð½Ð° окно.
Ðкна Ñакже ÑодеÑжаÑÑÑ Ð² коллекÑии window.frames.
ÐапÑимеÑ:
// Ðкно из иÑÑейма
var iframeWin = iframe.contentWindow;
// Ðожно полÑÑиÑÑ Ð¸ ÑеÑез frames, еÑли Ð¼Ñ Ð·Ð½Ð°ÐµÐ¼ Ð¸Ð¼Ñ Ð¸ÑÑейма (и оно Ñ Ð½ÐµÐ³Ð¾ еÑÑÑ)
var iframeWin = window.frames[iframe.name];
iframeWin.parent == window; // parent из iframe ÑказÑÐ²Ð°ÐµÑ Ð½Ð° ÑодиÑелÑÑкое окно
// ÐокÑÐ¼ÐµÐ½Ñ Ð½Ðµ бÑÐ´ÐµÑ Ð´Ð¾ÑÑÑпен, еÑли iframe Ñ Ð´ÑÑгого домена
var iframeDoc = iframe.contentWindow.document;
ÐолÑÑе инÑоÑмаÑии об иÑÑÐµÐ¹Ð¼Ð°Ñ Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе полÑÑиÑÑ Ð² главе ÐбÑение Ð¼ÐµÐ¶Ð´Ñ Ð¾ÐºÐ½Ð°Ð¼Ð¸ и ÑÑеймами.
IFRAME и иÑÑоÑÐ¸Ñ Ð¿Ð¾ÑеÑений
IFRAME â полноÑенное окно, поÑÑÐ¾Ð¼Ñ Ð½Ð°Ð²Ð¸Ð³Ð°ÑÐ¸Ñ Ð² нÑм Ð¿Ð¾Ð¿Ð°Ð´Ð°ÐµÑ Ð² иÑÑоÑÐ¸Ñ Ð¿Ð¾ÑеÑений.
ÐÑо ознаÑаеÑ, ÑÑо пÑи нажаÑии кнопки «Ðазад» бÑаÑÐ·ÐµÑ Ð²ÐµÑнÑÑ Ð¿Ð¾ÑеÑиÑÐµÐ»Ñ Ð½Ð°Ð·Ð°Ð´ не в оÑновном окне, а в иÑÑейме. РлÑÑÑем ÑлÑÑае â бÑаÑÐ·ÐµÑ Ð²Ð¾Ð·ÑмÑÑ Ð¿ÑедÑдÑÑее ÑоÑÑоÑние иÑÑейма из кÑÑа и поÑеÑиÑÐµÐ»Ñ Ð¿ÑоÑÑо подÑмаеÑ, ÑÑо кнопка не ÑÑабоÑала. Ð Ñ ÑдÑем â в иÑÑейм бÑÐ´ÐµÑ Ñделан пÑедÑдÑÑий запÑоÑ, а ÑÑо Ñже ÑоÑно ни к ÑемÑ.
ÐаÑи запÑоÑÑ Ð² иÑÑейм â ÑлÑжебнÑе и Ð´Ð»Ñ Ð¸ÑÑоÑии не пÑедназнаÑенÑ. Ð ÑÑаÑÑÑÑ, еÑÑÑ ÑÑд ÑÐµÑ Ð½Ð¸Ðº, коÑоÑÑе позволÑÑÑ Ð¾Ð±Ð¾Ð¹Ñи пÑоблемÑ.
-
ÐÑÑейм нÑжно ÑоздаваÑÑ Ð´Ð¸Ð½Ð°Ð¼Ð¸ÑеÑки, ÑеÑез JavaScript.
-
Ðогда иÑÑейм Ñже Ñоздан, Ñо единÑÑвеннÑй ÑпоÑоб поменÑÑÑ ÐµÐ³Ð¾
srcбез Ð¿Ð¾Ð¿Ð°Ð´Ð°Ð½Ð¸Ñ Ð·Ð°Ð¿ÑоÑа в иÑÑоÑÐ¸Ñ Ð¿Ð¾ÑеÑений:// newSrc - новÑй адÑÐµÑ iframeDoc.location.replace(newSrc);ÐÑ Ð¼Ð¾Ð¶ÐµÑе возÑазиÑÑ: «но ведÑ
iframeDocне вÑегда доÑÑÑпен!iframeÐ¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ñ Ð´ÑÑгого домена â как бÑÑÑ Ñогда?». ÐÑвеÑ: вмеÑÑо ÑменÑsrcÑÑого иÑÑейма â ÑоздаÑÑ Ð½Ð¾Ð²Ñй, Ñ Ð½Ð¾Ð²Ñмsrc. -
POST-запÑоÑÑ Ð²
iframeвÑегда попадаÑÑ Ð² иÑÑоÑÐ¸Ñ Ð¿Ð¾ÑеÑений. -
⦠Ðо еÑли
iframeÑдалиÑÑ, Ñо лиÑнÑÑ Ð¸ÑÑоÑÐ¸Ñ Ñоже иÑÑÐµÐ·Ð½ÐµÑ :). СделаÑÑ ÑÑо можно по оконÑании запÑоÑа.
Таким обÑазом, обÑий пÑинÑип иÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ IFRAME: динамиÑеÑки ÑоздаÑÑ, ÑделаÑÑ Ð·Ð°Ð¿ÑоÑ, ÑдалиÑÑ.
ÐÑÐ²Ð°ÐµÑ Ñак, ÑÑо ÑдалиÑÑ Ð¿Ð¾ каким-Ñо пÑиÑинам нелÑзÑ, Ñогда Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ñ Ð¿ÑÐ¾Ð±Ð»ÐµÐ¼Ñ Ñ Ð¸ÑÑоÑией, опиÑаннÑе вÑÑе.
ФÑнкÑÐ¸Ñ createIframe
ÐÑиведÑÐ½Ð½Ð°Ñ Ð½Ð¸Ð¶Ðµ ÑÑнкÑÐ¸Ñ createIframe(name, src, debug) кÑоÑÑ-бÑаÑзеÑно ÑоздаÑÑ Ð¸ÑÑейм Ñ Ð´Ð°Ð½Ð½Ñм именем и src.
ÐÑгÑменÑÑ:
name- ÐÐ¼Ñ Ð¸
idиÑÑейма src- ÐÑÑ Ð¾Ð´Ð½Ñй адÑÐµÑ Ð¸ÑÑейма. ÐеобÑзаÑелÑнÑй паÑамеÑÑ.
debug- ÐÑли паÑамеÑÑ Ð·Ð°Ð´Ð°Ð½, Ñо иÑÑейм поÑле ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð½Ðµ пÑÑÑеÑÑÑ.
function createIframe(name, src, debug) {
src = src || 'javascript:false'; // пÑÑÑой src
var tmpElem = document.createElement('div');
// в ÑÑаÑÑÑ
IE нелÑÐ·Ñ Ð¿ÑиÑвоиÑÑ name поÑле ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ iframe
// поÑÑÐ¾Ð¼Ñ ÑоздаÑм ÑеÑез innerHTML
tmpElem.innerHTML = '<iframe name="' + name + '" id="' + name + '" src="' + src + '">';
var iframe = tmpElem.firstChild;
if (!debug) {
iframe.style.display = 'none';
}
document.body.appendChild(iframe);
return iframe;
}
ÐÑÑейм здеÑÑ Ð´Ð¾Ð±Ð°Ð²Ð»ÑеÑÑÑ Ðº document.body. ÐонеÑно, Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе иÑпÑавиÑÑ ÑÑÐ¾Ñ ÐºÐ¾Ð´ и добавлÑÑÑ ÐµÐ³Ð¾ в лÑбое дÑÑгое меÑÑо докÑменÑа.
ÐÑÑаÑи, пÑи вÑÑавке, еÑли не Ñказан src, ÑÑÑ Ð¶Ðµ пÑоизойдÑÑ ÑобÑÑие iframe.onload. Ðока обÑабоÑÑиков неÑ, поÑÑÐ¾Ð¼Ñ Ð¾Ð½Ð¾ бÑÐ´ÐµÑ Ð¿ÑоигноÑиÑовано.
ФÑнкÑÐ¸Ñ postToIframe
ФÑнкÑÐ¸Ñ postToIframe(url, data, target) оÑпÑавлÑÐµÑ POST-запÑÐ¾Ñ Ð² иÑÑейм Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ target, на адÑÐµÑ url Ñ Ð´Ð°Ð½Ð½Ñми data.
ÐÑгÑменÑÑ:
url- URL, на коÑоÑÑй оÑпÑавлÑÑÑ Ð·Ð°Ð¿ÑоÑ.
data- ÐбÑÐµÐºÑ ÑодеÑÐ¶Ð¸Ñ Ð¿Ð°ÑÑ
клÑÑ:знаÑÐµÐ½Ð¸ÐµÐ´Ð»Ñ Ð¿Ð¾Ð»ÐµÐ¹ ÑоÑмÑ. ÐнаÑение бÑÐ´ÐµÑ Ð¿Ñиведено к ÑÑÑоке. target- ÐÐ¼Ñ Ð¸ÑÑейма, в коÑоÑÑй оÑпÑавлÑÑÑ Ð´Ð°Ð½Ð½Ñе.
// ÐапÑимеÑ: postToIframe('/vote', {mark:5}, 'frame1')
function postToIframe(url, data, target) {
var phonyForm = document.getElementById('phonyForm');
if (!phonyForm) {
// вÑеменнÑÑ ÑоÑÐ¼Ñ ÑоздаÑм, еÑли неÑ
phonyForm = document.createElement("form");
phonyForm.id = 'phonyForm';
phonyForm.style.display = "none";
phonyForm.method = "POST";
document.body.appendChild(phonyForm);
}
phonyForm.action = url;
phonyForm.target = target;
// заполниÑÑ ÑоÑÐ¼Ñ Ð´Ð°Ð½Ð½Ñми из обÑекÑа
var html = [];
for (var key in data) {
var value = String(data[key]).replace(/"/g, """);
// в ÑÑаÑÑÑ
IE нелÑÐ·Ñ ÑказаÑÑ name поÑле ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ input
// поÑÑÐ¾Ð¼Ñ Ð¸ÑполÑзÑем innerHTML вмеÑÑо DOM-меÑодов
html.push("<input type='hidden' name=\"" + key + "\" value=\"" + value + "\">");
}
phonyForm.innerHTML = html.join('');
phonyForm.submit();
}
ÐÑа ÑÑнкÑÐ¸Ñ ÑоÑмиÑÑÐµÑ ÑоÑÐ¼Ñ Ð´Ð¸Ð½Ð°Ð¼Ð¸ÑеÑки, но, конеÑно, ÑÑо лиÑÑ Ð¾Ð´Ð¸Ð½ из возможнÑÑ ÑÑенаÑиев иÑполÑзованиÑ.
Ð IFRAME можно оÑпÑавлÑÑÑ Ð¸ ÑÑÑеÑÑвÑÑÑÑÑ ÑоÑмÑ, вклÑÑаÑÑÑÑ ÑайловÑе и дÑÑгие полÑ.
ÐапÑоÑÑ GET и POST
ÐбÑий алгоÑиÑм обÑаÑÐµÐ½Ð¸Ñ Ðº ÑеÑвеÑÑ ÑеÑез иÑÑейм:
-
СоздаÑм
iframeÑо ÑлÑÑайнÑм именемiframeName. -
СоздаÑм в оÑновном окне обÑекÑ
CallbackRegistry, в коÑоÑом вCallbackRegistry[iframeName]ÑÐ¾Ñ ÑанÑем ÑÑнкÑиÑ, коÑоÑÐ°Ñ Ð±ÑÐ´ÐµÑ Ð¾Ð±ÑабаÑÑваÑÑ ÑезÑлÑÑаÑ. -
ÐÑпÑавлÑем GET или POST-запÑÐ¾Ñ Ð² него.
-
СеÑÐ²ÐµÑ Ð¾ÑвеÑÐ°ÐµÑ ÐºÐ°Ðº-Ñо Ñак:
<script> parent.CallbackRegistry[window.name]({даннÑе}); </script>â¦Ð¢Ð¾ еÑÑÑ, вÑзÑÐ²Ð°ÐµÑ Ð¸Ð· оÑновного окна ÑÑнкÑÐ¸Ñ Ð¾Ð±ÑабоÑки (
window.nameв иÑÑейме â его имÑ). -
ÐополниÑелÑно нÑжен обÑабоÑÑик
iframe.onloadâ он ÑÑабоÑÐ°ÐµÑ Ð¸ пÑовеÑиÑ, вÑполнилаÑÑ Ð»Ð¸ ÑÑнкÑиÑCallbackRegistry[window.name]. ÐÑли неÑ, знаÑÐ¸Ñ ÐºÐ°ÐºÐ°Ñ-Ñо оÑибка. СеÑÐ²ÐµÑ Ð¿Ñи ноÑмалÑном поÑоке вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð²Ñегда оÑвеÑÐ°ÐµÑ ÐµÑ Ð²Ñзовом.
ÐодÑобнее можно понÑÑÑ Ð¿ÑоÑеÑÑ, взглÑнÑв на код.
ÐÑ Ð±Ñдем иÑполÑзоваÑÑ Ð² нÑм две ÑÑнкÑии â Ð¾Ð´Ð½Ñ Ð´Ð»Ñ GET, дÑÑгÑÑ â Ð´Ð»Ñ POST:
iframeGet(url, onSuccess, onError)â Ð´Ð»Ñ GET-запÑоÑов наurl. ÐÑи ÑÑпеÑном запÑоÑе вÑзÑваеÑÑÑonSuccess(result), пÑи неÑÑпеÑном:onError().iframePost(url, data, onSuccess, onError)â Ð´Ð»Ñ POST-запÑоÑов наurl. ÐнаÑениемdataдолжен бÑÑÑ Ð¾Ð±ÑекÑклÑÑ:знаÑÐµÐ½Ð¸ÐµÐ´Ð»Ñ Ð¿ÐµÑеÑÑлаемÑÑ Ð´Ð°Ð½Ð½ÑÑ , он конвеÑÑиÑÑеÑÑÑ Ð² Ð¿Ð¾Ð»Ñ ÑоÑмÑ.
ÐÑÐ¸Ð¼ÐµÑ Ð² дейÑÑвии, возвÑаÑаÑÑий даÑÑ ÑеÑвеÑа пÑи GET и ÑазниÑÑ Ð¼ÐµÐ¶Ð´Ñ Ð´Ð°Ñами клиенÑа и ÑеÑвеÑа пÑи POST:
function createIframe(name, src, debug) {
src = src || 'javascript:false'; // пÑÑÑой src
var tmpElem = document.createElement('div');
// в ÑÑаÑÑÑ
IE нелÑÐ·Ñ Ð¿ÑиÑвоиÑÑ name поÑле ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ iframe, поÑÑÐ¾Ð¼Ñ ÑоздаÑм ÑеÑез innerHTML
tmpElem.innerHTML = '<iframe name="' + name + '" id="' + name + '" src="' + src + '">';
var iframe = tmpElem.firstChild;
if (!debug) {
iframe.style.display = 'none';
}
document.body.appendChild(iframe);
return iframe;
}
// ÑÑнкÑÐ¸Ñ Ð¿Ð¾ÑÑÐ¸Ñ Ð¾Ð±ÑекÑ-Ñ
ÑÑ content в виде ÑоÑÐ¼Ñ Ñ Ð½ÑжнÑм url , target
// напÑ. postToIframe('/count.php', {a:5,b:6}, 'frame1')
function postToIframe(url, data, target) {
var phonyForm = document.getElementById('phonyForm');
if (!phonyForm) {
// вÑеменнÑÑ ÑоÑÐ¼Ñ Ñоздаем, еÑли неÑ
phonyForm = document.createElement("form");
phonyForm.id = 'phonyForm';
phonyForm.style.display = "none";
phonyForm.method = "POST";
phonyForm.enctype = "multipart/form-data";
document.body.appendChild(phonyForm);
}
phonyForm.action = url;
phonyForm.target = target;
// заполниÑÑ ÑоÑÐ¼Ñ Ð´Ð°Ð½Ð½Ñми из обÑекÑа
var html = [];
for (var key in data) {
var value = String(data[key]).replace(/"/g, """);
html.push("<input type='hidden' name=\"" + key + "\" value=\"" + value + "\">");
}
phonyForm.innerHTML = html.join('');
phonyForm.submit();
}
var CallbackRegistry = {}; // ÑееÑÑÑ
function iframeGet(url, onSuccess, onError) {
var iframeOk = false; // Ñлаг ÑÑпеÑного оÑвеÑа ÑеÑвеÑа
var iframeName = Math.random(); // ÑлÑÑайное Ð¸Ð¼Ñ Ð´Ð»Ñ Ð¸ÑÑейма
var iframe = createIframe(iframeName, url);
CallbackRegistry[iframeName] = function(data) {
iframeOk = true; // ÑеÑÐ²ÐµÑ Ð¾ÑвеÑил ÑÑпеÑно
onSuccess(data);
}
iframe.onload = function() {
iframe.parentNode.removeChild(iframe); // оÑиÑÑка
delete CallbackRegistry[iframeName];
if (!iframeOk) onError(); // еÑли ÑеÑÐ²ÐµÑ Ð½Ðµ оÑвеÑил как надо - ÑÑо-Ñо не Ñак
}
}
// аналогиÑно iframeGet, но в postToIframe пеÑедаÑÑÑÑ Ð´Ð°Ð½Ð½Ñе data
function iframePost(url, data, onSuccess, onError) {
var iframeOk = false;
var iframeName = Math.random();
var iframe = createIframe(iframeName);
CallbackRegistry[iframeName] = function(data) {
iframeOk = true;
onSuccess(data);
}
iframe.onload = function() {
iframe.parentNode.removeChild(iframe); // оÑиÑÑка
delete CallbackRegistry[iframeName];
if (!iframeOk) onError(); // еÑли коллбÑк не вÑзвалÑÑ - ÑÑо-Ñо не Ñак
}
postToIframe(url, data, iframeName);
}var http = require('http');
var url = require('url');
var static = require('node-static');
var file = new static.Server('.', {
cache: 0
});
var multiparty = require('multiparty');
function accept(req, res) {
var urlParsed = url.parse(req.url, true);
res.setHeader('Cache-Control', 'no-cache');
if (urlParsed.pathname == '/server') {
res.end(wrap(new Date()));
return;
} else if (urlParsed.pathname == '/diff') {
var form = new multiparty.Form();
form.parse(req, function(err, fields, files) {
var diff = new Date() - fields.clientDate[0];
res.end(wrap(diff));
});
} else {
file.serve(req, res);
}
}
function wrap(data) {
return '<script>parent.CallbackRegistry[window.name](' + JSON.stringify(data) + ')</script>';
}
// ------ запÑÑÑиÑÑ ÑеÑÐ²ÐµÑ -------
if (!module.parent) {
http.createServer(accept).listen(8080);
} else {
exports.accept = accept;
}<!DOCTYPE html>
<html>
<body>
<script src="iframe.js"></script>
<script>
function ok(result) {
alert('result: ' + result);
}
function fail() {
alert('fail');
}
</script>
<button onclick="iframeGet('server', ok, fail)">iframeGet server</button>
<button onclick="iframePost('diff', {clientDate: +new Date}, ok, fail)">iframePost diff</button>
</body>
</html>ÐÑÑмой вÑзов ÑÑнкÑии внеÑнего окна из иÑÑейма оÑлиÑно ÑабоÑаеÑ, поÑÐ¾Ð¼Ñ ÑÑо они Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ домена. ÐÑли Ñ ÑазнÑÑ , Ñо нÑÐ¶Ð½Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑе дейÑÑвиÑ, напÑимеÑ:
-
Ð IE8+ еÑÑÑ Ð¸Ð½ÑеÑÑÐµÐ¹Ñ postMessage Ð´Ð»Ñ Ð¾Ð±ÑÐµÐ½Ð¸Ñ Ð¼ÐµÐ¶Ð´Ñ Ð¾ÐºÐ½Ð°Ð¼Ð¸ Ñ ÑазнÑÑ Ð´Ð¾Ð¼ÐµÐ½Ð¾Ð².
-
РлÑбÑÑ , даже ÑамÑÑ ÑÑаÑÑÑ IE, можно обмениваÑÑÑÑ Ð´Ð°Ð½Ð½Ñми ÑеÑез
window.name. ÐÑа пеÑÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ñ ÑÐ°Ð½Ð¸Ñ Â«Ð¸Ð¼Ñ» окна или ÑÑейма, коÑоÑое не менÑеÑÑÑ Ð¿Ñи пеÑезагÑÑзке ÑÑÑаниÑÑ.ÐоÑÑÐ¾Ð¼Ñ ÐµÑли Ð¼Ñ Ñделали
POSTв<iframe>на дÑÑгой домен и он поÑÑавилwindow.name = "ÐаÑÑ", а заÑем Ñделал ÑедиÑÐµÐºÑ Ð½Ð° оÑновной домен, Ñо ÑÑи даннÑе ÑÑанÑÑ Ð´Ð¾ÑÑÑÐ¿Ð½Ñ Ð²Ð½ÐµÑней ÑÑÑаниÑе. -
Также в ÑовÑем ÑÑаÑÑÑ IE можно обмениваÑÑÑÑ Ð´Ð°Ð½Ð½Ñми ÑеÑез Ñ ÐµÑ, Ñо еÑÑÑ ÑÑÐ°Ð³Ð¼ÐµÐ½Ñ URL поÑле
#. Ðго изменение доÑÑÑпно Ð¼ÐµÐ¶Ð´Ñ Ð¸ÑÑеймами Ñ ÑазнÑÑ Ð´Ð¾Ð¼ÐµÐ½Ð¾Ð² и не пÑÐ¸Ð²Ð¾Ð´Ð¸Ñ Ðº пеÑезагÑÑзке ÑÑÑаниÑÑ. Таким обÑазом они могÑÑ Ð¿ÐµÑедаваÑÑ Ð´Ð°Ð½Ð½Ñе дÑÑг дÑÑгÑ. ÐÑÑÑ Ð³Ð¾ÑовÑе библиоÑеки, коÑоÑÑе ÑеализÑÑÑ ÑÑÐ¾Ñ Ð¿Ð¾Ð´Ñ Ð¾Ð´, напÑÐ¸Ð¼ÐµÑ Porthole.
IFRAME Ð´Ð»Ñ COMET
ÐеÑконеÑнÑй IFRAME â ÑамÑй ÑÑаÑÑй ÑпоÑоб оÑганизаÑии COMET. Ðогда-Ñо он бÑл оÑновой AJAX-пÑиложений, а ÑейÑÐ°Ñ â иÑполÑзÑеÑÑÑ Ð»Ð¸ÑÑ Ð² ÑлÑÑаÑÑ , когда бÑаÑÐ·ÐµÑ Ð½Ðµ поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ ÑовÑеменнÑй ÑÑандаÑÑ WebSocket, Ñо еÑÑÑ Ð´Ð»Ñ IE9-.
ÐÑÐ¾Ñ ÑпоÑоб оÑнован на Ñом, ÑÑо бÑаÑÐ·ÐµÑ ÑиÑÐ°ÐµÑ ÑÑÑаниÑÑ Ð¿Ð¾ÑледоваÑелÑно и обÑабаÑÑÐ²Ð°ÐµÑ Ð²Ñе новÑе Ñеги по меÑе Ñого, как ÑеÑÐ²ÐµÑ Ð¸Ñ Ð¿ÑиÑÑлаеÑ.
ÐлаÑÑиÑеÑÐºÐ°Ñ ÑеализаÑÐ¸Ñ â ÑÑо когда ÐºÐ»Ð¸ÐµÐ½Ñ ÑоздаÑÑ Ð½ÐµÐ²Ð¸Ð´Ð¸Ð¼Ñй IFRAME, ведÑÑий на ÑлÑжебнÑй URL. СеÑвеÑ, полÑÑив Ñоединение на ÑÑÐ¾Ñ URL, не закÑÑÐ²Ð°ÐµÑ ÐµÐ³Ð¾, а
вÑÐµÐ¼Ñ Ð¾Ñ Ð²Ñемени пÑиÑÑÐ»Ð°ÐµÑ Ð±Ð»Ð¾ÐºÐ¸ ÑообÑений <script>â¦javascriptâ¦</script>. ÐоÑвивÑийÑÑ Ð² IFRAMEâе javascript ÑÑÑ Ð¶Ðµ вÑполнÑеÑÑÑ Ð±ÑаÑзеÑом, пеÑÐµÐ´Ð°Ð²Ð°Ñ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð½Ð° оÑновнÑÑ ÑÑÑаниÑÑ.
Таким обÑазом, Ð´Ð»Ñ Ð¿ÐµÑедаÑи даннÑÑ Ð¸ÑполÑзÑеÑÑÑ Â«Ð±ÐµÑконеÑнÑй» иÑÑейм, ÑеÑез коÑоÑÑй ÑеÑÐ²ÐµÑ Ð¿ÑиÑÑÐ»Ð°ÐµÑ Ð²Ñе новÑе даннÑе.
Ð¡Ñ ÐµÐ¼Ð° ÑабоÑÑ:
- СоздаÑÑÑÑ
<iframe src="COMET_URL">, по адÑеÑÑCOMET_URLÑаÑположен ÑеÑвеÑ. - СеÑÐ²ÐµÑ Ð²ÑдаÑÑ Ð½Ð°Ñало («ÑапкÑ») докÑменÑа и оÑÑанавливаеÑÑÑ, оÑÑавлÑÑ Ñоединение акÑивнÑм.
- Ðогда ÑеÑÐ²ÐµÑ Ñ
оÑÐµÑ ÑÑо-Ñо оÑпÑавиÑÑ â он пиÑÐµÑ Ð² Ñоединение
<script>parent.onMessage(ÑообÑение)</script>ÐÑаÑÐ·ÐµÑ ÑÑÑ Ð¶Ðµ вÑполнÑÐµÑ ÑÑÐ¾Ñ ÑкÑÐ¸Ð¿Ñ â Ñак ÑообÑение пÑÐ¸Ñ Ð¾Ð´Ð¸Ñ Ð½Ð° клиенÑ. - ÐÑÑейм, в ÑеоÑии, гÑÑзиÑÑÑ Ð±ÐµÑконеÑно. Ðго завеÑÑение ознаÑÐ°ÐµÑ Ð¾Ð±ÑÑв канала ÑвÑзи. Ðго можно поймаÑÑ Ð¿Ð¾
iframe.onloadи заново оÑкÑÑÑÑ Ñоединение (ÑоздаÑÑ Ð½Ð¾Ð²Ñйiframe).
Также иÑÑейм можно пеÑеÑоздаваÑÑ Ð²ÑÐµÐ¼Ñ Ð¾Ñ Ð²Ñемени, Ð´Ð»Ñ Ð¾ÑиÑÑки памÑÑи Ð¾Ñ ÑÑаÑÑÑ ÑообÑений.
ÐÑÑейм пÑи ÑÑом ÑабоÑÐ°ÐµÑ ÑолÑко на полÑÑение даннÑÑ
Ñ ÑеÑвеÑа, как алÑÑеÑнаÑива Server Sent Events. ÐÐ»Ñ Ð·Ð°Ð¿ÑоÑов иÑполÑзÑеÑÑÑ Ð¾Ð±ÑÑнÑй XMLHttpRequest.
ÐÐ±Ñ Ð¾Ð´ пÑоблем Ñ IE
Такое иÑполÑзование иÑÑеймов ÑвлÑеÑÑÑ Ñ Ð°ÐºÐ¾Ð¼. ÐоÑÑÐ¾Ð¼Ñ ÐµÑÑÑ ÑÑд пÑоблем:
- ÐоказÑваеÑÑÑ Ð¸Ð½Ð´Ð¸ÐºÐ°ÑÐ¾Ñ Ð·Ð°Ð³ÑÑзки, «кÑÑÑоÑ-ÑаÑики».
- ÐÑи POST в
<iframe>ÑаздаÑÑÑÑ Ð·Ð²Ñк «клика». - ÐÑаÑÐ·ÐµÑ Ð±ÑÑеÑизÑÐµÑ Ð½Ð°Ñало ÑÑÑаниÑÑ.
ÐÑ Ð´Ð¾Ð»Ð¶Ð½Ñ ÑÑи пÑÐ¾Ð±Ð»ÐµÐ¼Ñ ÑеÑиÑÑ, пÑежде вÑего, в IE, поÑколÑÐºÑ Ð² дÑÑÐ³Ð¸Ñ Ð±ÑаÑзеÑÐ°Ñ ÐµÑÑÑ WebSocket и Server Sent Events .
ÐÑоÑе вÑего ÑеÑиÑÑ Ð¿Ð¾ÑледнÑÑ â IE не наÑÐ¸Ð½Ð°ÐµÑ Ð¾Ð±ÑабоÑÐºÑ ÑÑÑаниÑÑ, пока она не загÑÑзиÑÑÑ Ð´Ð¾ опÑеделÑнного ÑазмеÑа.
ÐоÑÑÐ¾Ð¼Ñ Ð² Ñаком IFRAME пеÑвÑе неÑколÑко ÑообÑений задеÑжаÑÑÑ:
<!DOCTYPE HTML>
<html>
<body>
<script>parent.onMessage("пÑивеÑ");</script>
<script>parent.onMessage("Ð¾Ñ ÑеÑвеÑа");</script>
...
РеÑение â забиÑÑ Ð½Ð°Ñало иÑÑейма Ñем-нибÑдÑ, поÑÑавиÑÑ, напÑимеÑ, ÐºÐ¸Ð»Ð¾Ð±Ð°Ð¹Ñ Ð¿Ñобелов в наÑале:
<!DOCTYPE HTML>
<html>
<body>
******* 1 ÐºÐ¸Ð»Ð¾Ð±Ð°Ð¹Ñ Ð¿Ñобелов, а поÑом Ñже ÑообÑÐµÐ½Ð¸Ñ ******
<script>
parent.onMessage("пÑивеÑ");
</script>
<script>
parent.onMessage("Ð¾Ñ ÑеÑвеÑа");
</script>
...
ÐÐ»Ñ ÑеÑÐµÐ½Ð¸Ñ Ð¿ÑÐ¾Ð±Ð»ÐµÐ¼Ñ Ñ Ð¸Ð½Ð´Ð¸ÐºÐ°Ñией загÑÑзки и клика Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ иÑполÑзоваÑÑ Ð±ÐµÐ·Ð¾Ð¿Ð°ÑнÑй ActiveX-обÑÐµÐºÑ htmlfile. IE не ÑÑебÑÐµÑ ÑазÑеÑений на его Ñоздание. ФакÑиÑеÑки, ÑÑо незавиÑимÑй HTML-докÑменÑ.
ÐказÑваеÑÑÑ, еÑли iframe ÑоздаÑÑ Ð² нÑм, Ñо никакой анимаÑии и звÑков не бÑдеÑ.
ÐÑак, ÑÑ ÐµÐ¼Ð°:
- ÐÑновное окно
mainÑоздаÑÑ Ð²ÑпомогаÑелÑнÑй обÑекÑ:new ActiveXObject("htmlfile"). ÐÑо HTML-докÑÐ¼ÐµÐ½Ñ Ñо Ñвоимwindow, Ð¿Ð¾Ñ Ð¾Ð¶Ðµ на вÑÑÑоеннÑйiframe. - Ð
htmlfileзапиÑÑваеÑÑÑiframe. - ЦепоÑка обÑениÑ: оÑновное окно â
htmlfileâ иÑÑейм.
iframeActiveXGet
Ðа Ñамом деле вÑÑ ÐµÑÑ Ð¿ÑоÑе, еÑли поÑмоÑÑеÑÑ Ð½Ð° код:
ÐеÑод iframeActiveXGet по ÑÑÑеÑÑÐ²Ñ Ð¸Ð´ÐµÐ½ÑиÑен обÑÑÐ½Ð¾Ð¼Ñ iframeGet, коÑоÑое Ð¼Ñ ÑаÑÑмоÑÑели. ÐдинÑÑвенное оÑлиÑие â вмеÑÑо createIframe иÑполÑзÑеÑÑÑ Ð¾ÑобÑй меÑод createActiveXFrame:
function iframeActiveXGet(url, onSuccess, onError) {
var iframeOk = false;
var iframeName = Math.random();
var iframe = createActiveXFrame(iframeName, url);
CallbackRegistry[iframeName] = function(data) {
iframeOk = true;
onSuccess(data);
}
iframe.onload = function() {
iframe.parentNode.removeChild(iframe); // оÑиÑÑка
delete CallbackRegistry[iframeName];
if (!iframeOk) onError(); // еÑли колбÑк не вÑзвалÑÑ - ÑÑо-Ñо не Ñак
}
}
createActiveXFrame
Ð ÑÑой ÑÑнкÑии ÑвоÑиÑÑÑ Ð²ÑÑ IE-магиÑ:
function createActiveXFrame(name, src) {
// (1)
var htmlfile = window.htmlfile;
if (!htmlfile) {
htmlfile = window.htmlfile = new ActiveXObject("htmlfile");
htmlfile.open();
// (2)
htmlfile.write("<html><body></body></html>");
htmlfile.close();
// (3)
htmlfile.parentWindow.CallbackRegistry = CallbackRegistry;
}
// (4)
src = src || 'javascript:false';
htmlfile.body.insertAdjacentHTML('beforeEnd',
"<iframe name='" + name + "' src='" + src + "'></iframe>");
return htmlfile.body.lastChild;
}
-
ÐÑпомогаÑелÑнÑй обÑекÑ
htmlfileбÑÐ´ÐµÑ Ð¾Ð´Ð¸Ð½ и он бÑÐ´ÐµÑ Ð³Ð»Ð¾Ð±Ð°Ð»ÑнÑм. Ðожно и ÑпÑÑÑаÑÑ Ð¿ÐµÑеменнÑÑ Ð² замÑкании. СмÑÑл в Ñом, ÑÑо в одинhtmlfileможно запиÑаÑÑ Ð¼Ð½Ð¾Ð³Ð¾ иÑÑеймов, Ñак ÑÑо не бÑдем множиÑÑ ÑÑÑноÑÑи и занимаÑÑ Ð¸Ð¼Ð¸ лиÑнÑÑ Ð¿Ð°Ð¼ÑÑÑ. -
Ð
htmlfileможно запиÑаÑÑ Ð»Ñбой ÑекÑÑ Ð¸, пÑи Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ÑÑи, ÑеÑезdocument.write('<script>...<\/script>). ÐдеÑÑ Ð¼Ñ Ð´ÐµÐ»Ð°ÐµÐ¼ пÑÑÑой докÑменÑ. -
Ðогда загÑÑзиÑÑÑ
iframe, он ÑÐ´ÐµÐ»Ð°ÐµÑ Ð²Ñзов:<script> parent.CallbackRegistry[window.name](обÑÐµÐºÑ Ñ Ð´Ð°Ð½Ð½Ñми); </script>ÐдеÑÑ
parent'омдлÑiframe'абÑдеÑhtmlfile, Ñ.е.CallbackRegistryбÑÐ´ÐµÑ Ð¸ÑкаÑÑÑÑ ÑÑеди пеÑеменнÑÑ ÑооÑвеÑÑÑвÑÑÑего ÐµÐ¼Ñ Ð¾ÐºÐ½Ð°, а вовÑе не веÑÑ Ð½ÐµÐ³Ð¾window.Ðкно длÑ
htmlfileдоÑÑÑпно какhtmlfile.parentWindow, копиÑÑем в него ÑÑÑÐ»ÐºÑ Ð½Ð° ÑееÑÑÑ ÐºÐ¾Ð»Ð±ÑковCallbackRegistry. ТепеÑÑ Ð¸ÑÑейм его найдÑÑ. -
Ðалее вÑÑавлÑем иÑÑейм в докÑменÑ. Ð ÑÑаÑÑÑ
IEнелÑÐ·Ñ Ð¿Ð¾Ð¼ÐµÐ½ÑÑÑnameиÑÑÐµÐ¹Ð¼Ñ ÑеÑез DOM, поÑÑÐ¾Ð¼Ñ Ð²ÑÑавлÑем ÑÑÑокой ÑеÑезinsertAdjacentHTML.
ÐÑÐ¸Ð¼ÐµÑ Ð² дейÑÑвии (ÑолÑко IE):
var CallbackRegistry = {}; // ÑееÑÑÑ
function iframeActiveXGet(url, onSuccess, onError) {
var iframeOk = false;
var iframeName = Math.random();
var iframe = createActiveXFrame(iframeName, url);
CallbackRegistry[iframeName] = function(data) {
iframeOk = true;
onSuccess(data);
}
iframe.onload = function() {
iframe.parentNode.removeChild(iframe); // оÑиÑÑка
delete CallbackRegistry[iframeName];
if (!iframeOk) onError(); // еÑли коллбÑк не вÑзвалÑÑ - ÑÑо-Ñо не Ñак
}
}
function createActiveXFrame(name, src) {
var htmlfile = window.htmlfile;
if (!htmlfile) {
htmlfile = window.htmlfile = new ActiveXObject("htmlfile");
htmlfile.open();
htmlfile.write("<html><body></body></html>");
htmlfile.close();
htmlfile.parentWindow.CallbackRegistry = CallbackRegistry;
}
src = src || 'javascript:false'; // пÑÑÑой src
htmlfile.body.insertAdjacentHTML('beforeEnd', "<iframe name='" + name + "' src='" + src + "'></iframe>");
return htmlfile.body.lastChild; // window in .document.parentWindow
}var http = require('http');
var url = require('url');
var static = require('node-static');
var file = new static.Server('.', {
cache: 0
});
var multiparty = require('multiparty');
function accept(req, res) {
var urlParsed = url.parse(req.url, true);
res.setHeader('Cache-Control', 'no-cache');
if (urlParsed.pathname == '/server') {
res.end(wrap(new Date()));
return;
} else if (urlParsed.pathname == '/diff') {
var form = new multiparty.Form();
form.parse(req, function(err, fields, files) {
var diff = new Date() - fields.clientDate[0];
res.end(wrap(diff));
});
} else {
file.serve(req, res);
}
}
function wrap(data) {
return '<script>parent.CallbackRegistry[window.name](' + JSON.stringify(data) + ')</script>';
}
// ------ запÑÑÑиÑÑ ÑеÑÐ²ÐµÑ -------
if (!module.parent) {
http.createServer(accept).listen(8080);
} else {
exports.accept = accept;
}<!DOCTYPE html>
<html>
<body>
<script src="activex.js"></script>
<script>
function ok(result) {
alert('result: ' + result);
}
function fail() {
alert('fail');
}
function go() {
if (!("ActiveXObject" in window)) {
alert("ТолÑко Internet Explorer");
return;
}
iframeActiveXGet("server", ok, fail);
}
</script>
<button onclick="go()">iframeActiveXGet server date</button>
</body>
</html>ÐапÑоÑ, коÑоÑÑй пÑоиÑÑ Ð¾Ð´Ð¸Ñ, полноÑÑÑÑ Ð½ÐµÐ·Ð°Ð¼ÐµÑен.
ÐеÑод POST делаеÑÑÑ Ð°Ð½Ð°Ð»Ð¾Ð³Ð¸Ñно, ÑолÑко ÑоÑÐ¼Ñ Ð½Ñжно добавлÑÑÑ Ð½Ðµ в оÑновное окно, а в htmlfile, ÑеÑез вÑзов htmlfile.appendChild. РоÑÑалÑном â вÑÑ Ñак же, как и пÑи обÑÑной оÑпÑавке ÑеÑез иÑÑейм.
ÐпÑоÑем, Ð´Ð»Ñ COMET нÑжен именно GET.
Ðожно и ÑоÑеÑаÑÑ ÑÑи ÑпоÑобÑ: еÑли еÑÑÑ ActiveX: if ("ActiveXObject" in window) â иÑполÑзÑем меÑÐ¾Ð´Ñ Ð´Ð»Ñ IE, опиÑаннÑе вÑÑе, а инаÑе â обÑÑнÑе меÑодÑ.
ÐÐ¾Ñ Ð¼Ð¸Ð½Ð¸-пÑиложение Ñ ÑеÑвеÑом на Node.JS, непÑеÑÑвно полÑÑаÑÑее ÑекÑÑее вÑÐµÐ¼Ñ Ñ ÑеÑвеÑа ÑеÑез <iframe>, ÑоÑеÑаÑÑее ÑÑи подÑ
одÑ:
var IframeComet = new function() {
var self = this;
var connectTries = 0,
reconnectTimer;
var htmlfile; // for ie only
var iframe;
this.onConnected = function() {
connectTries = 0;
clearTimeout(reconnectTimer);
};
this.onMessage = function(message) { /* ... */ };
this.onError = function(err) { /* ... */ };
this.open = function(url) {
connectTries++;
if (connectTries > 3) {
self.onError("Unable to connect");
}
if ("ActiveXObject" in window) { // IE
createActiveXFrame(url);
} else {
createIframe(url);
}
reconnectTimer = setTimeout(function() {
if (!self.isConnected()) {
self.open(url);
}
}, connectTries * 2000);
// в Chrome не ÑÑабаÑÑÐ²Ð°ÐµÑ Ð¿Ñи обÑÑве ÑоединениÑ,
// Ñак ÑÑо иÑполÑзÑем Ñам дÑÑгой =) ÑÑанÑпоÑÑ
iframe.onload = function() {
self.open(url);
};
};
this.isConnected = function() {
return connectTries == 0; // onConnect обнÑлÑÐµÑ connectTries
}
function cleanIframe() {
if (iframe) {
iframe.src = "javascript:false";
iframe.parentNode.removeChild(iframe); // оÑиÑÑка
}
}
function createIframe(src) {
cleanIframe();
iframe = document.createElement('iframe');
iframe.src = src || 'javascript:false';
iframe.style.display = 'none';
document.body.appendChild(iframe);
}
function createActiveXFrame(src) {
cleanIframe();
if (!htmlfile) {
htmlfile = new ActiveXObject("htmlfile");
htmlfile.open();
htmlfile.write("<html><body></body></html>");
htmlfile.close();
htmlfile.parentWindow.IframeComet = self;
}
src = src || 'javascript:false'; // пÑÑÑой src
htmlfile.body.insertAdjacentHTML('beforeEnd', "<iframe src='" + src + "'></iframe>");
iframe = htmlfile.body.lastChild; // window in .document.parentWindow
}
}var http = require('http');
var url = require('url');
var static = require('node-static');
var file = new static.Server('.', {
cache: 0
});
function accept(req, res) {
if (req.url == '/comet') {
res.writeHead(200, {
'Content-Type': 'text/html; charset=utf-8'
});
res.write('<!DOCTYPE HTML><html> \
<head><meta junk="' + new Array(2000).join('*') + '"/> \
<script> \
var i = parent.IframeComet; \
i.onConnected()</script> \
</head><body>');
setInterval(function() {
var now = new Date();
var timeStr = now.getHours() + ':' + now.getMinutes() + ':' + now.getSeconds();
res.write('<script>i.onMessage("' + timeStr + '")</script>');
}, 1000);
return;
} else {
file.serve(req, res);
}
}
// ------ запÑÑÑиÑÑ ÑеÑÐ²ÐµÑ -------
if (!module.parent) {
http.createServer(accept).listen(8080);
} else {
exports.accept = accept;
}<!DOCTYPE html>
<html>
<body>
<script src="iframeComet.js"></script>
<button onclick="go()">IframeComet.open("comet");</button>
<div id="showElem"></div>
<script>
IframeComet.onMessage = IframeComet.onError = show;
function show(msg) {
showElem.innerHTML = msg;
}
function go() {
IframeComet.open("comet");
}
</script>
</body>
</html>ÐÑÑ Ñаз замеÑим, ÑÑо обÑÑно Ñакое ÑоÑеÑание не нÑжно, Ñак как еÑли не IE9-, Ñо можно иÑполÑзоваÑÑ Ð±Ð¾Ð»ÐµÐµ ÑовÑеменнÑе ÑÑедÑÑва Ð´Ð»Ñ COMET.
ÐÑого
- Iframe позволÑÐµÑ Ð´ÐµÐ»Ð°ÑÑ Â«AJAX»-запÑоÑÑ Ð¸ Ñ
иÑÑо обÑ
одиÑÑ ÐºÑоÑÑ-доменнÑе огÑаниÑÐµÐ½Ð¸Ñ Ð² IE7-. ÐбÑÑно Ð´Ð»Ñ ÑÑого иÑполÑзÑÑÑ Ð»Ð¸Ð±Ð¾
window.nameÑ ÑедиÑекÑом, либо Ñ ÐµÑ Ñ Ð±Ð¸Ð±Ð»Ð¸Ð¾Ñекой Ñипа Porthole. - Ð IE9- iframe можно иÑполÑзоваÑÑ Ð´Ð»Ñ COMET. Ð IE10 Ñже еÑÑÑ WebSocket.
СÑÑеÑÑвÑÐµÑ ÑÑд Ñже гоÑовÑÑ ÐºÐ»Ð¸ÐµÐ½Ñ-ÑеÑвеÑнÑÑ Ð±Ð¸Ð±Ð»Ð¸Ð¾Ñек, коÑоÑÑе ÑеализÑÑÑ AJAX/COMET, в Ñом ÑиÑле и ÑеÑез iframe, Ð¼Ñ ÑаÑÑмоÑÑим Ð¸Ñ Ð¿Ð¾Ð·Ð¶Ðµ. ÐоÑÑÐ¾Ð¼Ñ ÑовÑем не обÑзаÑелÑно делаÑÑ Â«Ñ Ð½ÑлÑ». ХоÑÑ, как можно видеÑÑ Ð¸Ð· главÑ, ÑÑо ÑовÑем неÑложно.

ÐомменÑаÑии
<code>, Ð´Ð»Ñ Ð½ÐµÑколÑÐºÐ¸Ñ ÑÑÑок кода — Ñег<pre>, еÑли болÑÑе 10 ÑÑÑок — ÑÑÑÐ»ÐºÑ Ð½Ð° пеÑоÑниÑÑ (plnkr, JSBin, codepenâ¦)