/** * socket.io * Copyright(c) 2011 LearnBoost * MIT Licensed */ (function (exports, io, global) { /** * There is a way to hide the loading indicator in Firefox. If you create and * remove a iframe it will stop showing the current loading indicator. * Unfortunately we can't feature detect that and UA sniffing is evil. * * @api private */ var indicator = global.document && "MozAppearance" in global.document.documentElement.style; /** * Expose constructor. */ exports['jsonp-polling'] = JSONPPolling; /** * The JSONP transport creates an persistent connection by dynamically * inserting a script tag in the page. This script tag will receive the * information of the Socket.IO server. When new information is received * it creates a new script tag for the new data stream. * * @constructor * @extends {io.Transport.xhr-polling} * @api public */ function JSONPPolling (socket) { io.Transport['xhr-polling'].apply(this, arguments); this.index = io.j.length; var self = this; io.j.push(function (msg) { self._(msg); }); }; /** * Inherits from XHR polling transport. */ io.util.inherit(JSONPPolling, io.Transport['xhr-polling']); /** * Transport name * * @api public */ JSONPPolling.prototype.name = 'jsonp-polling'; /** * Posts a encoded message to the Socket.IO server using an iframe. * The iframe is used because script tags can create POST based requests. * The iframe is positioned outside of the view so the user does not * notice it's existence. * * @param {String} data A encoded message. * @api private */ JSONPPolling.prototype.post = function (data) { var self = this , query = io.util.query( this.socket.options.query , 't='+ (+new Date) + '&i=' + this.index ); if (!this.form) { var form = document.createElement('form') , area = document.createElement('textarea') , id = this.iframeId = 'socketio_iframe_' + this.index , iframe; form.className = 'socketio'; form.style.position = 'absolute'; form.style.top = '-1000px'; form.style.left = '-1000px'; form.target = id; form.method = 'POST'; form.setAttribute('accept-charset', 'utf-8'); area.name = 'd'; form.appendChild(area); document.body.appendChild(form); this.form = form; this.area = area; } this.form.action = this.prepareUrl() + query; function complete () { initIframe(); self.socket.setBuffer(false); }; function initIframe () { if (self.iframe) { self.form.removeChild(self.iframe); } try { // ie6 dynamic iframes with target="" support (thanks Chris Lambacher) iframe = document.createElement('