UNPKG

pusher-js

Version:

Pusher Channels JavaScript library for browsers, React Native, NodeJS and web workers

86 lines (77 loc) 2.49 kB
import ScriptReceiver from './script_receiver'; /** Sends a generic HTTP GET request using a script tag. * * By constructing URL in a specific way, it can be used for loading * JavaScript resources or JSONP requests. It can notify about errors, but * only in certain environments. Please take care of monitoring the state of * the request yourself. * * @param {String} src */ export default class ScriptRequest { src: string; script: any; errorScript: any; constructor(src: string) { this.src = src; } send(receiver: ScriptReceiver) { var self = this; var errorString = 'Error loading ' + self.src; self.script = document.createElement('script'); self.script.id = receiver.id; self.script.src = self.src; self.script.type = 'text/javascript'; self.script.charset = 'UTF-8'; if (self.script.addEventListener) { self.script.onerror = function() { receiver.callback(errorString); }; self.script.onload = function() { receiver.callback(null); }; } else { self.script.onreadystatechange = function() { if ( self.script.readyState === 'loaded' || self.script.readyState === 'complete' ) { receiver.callback(null); } }; } // Opera<11.6 hack for missing onerror callback if ( self.script.async === undefined && (<any>document).attachEvent && /opera/i.test(navigator.userAgent) ) { self.errorScript = document.createElement('script'); self.errorScript.id = receiver.id + '_error'; self.errorScript.text = receiver.name + "('" + errorString + "');"; self.script.async = self.errorScript.async = false; } else { self.script.async = true; } var head = document.getElementsByTagName('head')[0]; head.insertBefore(self.script, head.firstChild); if (self.errorScript) { head.insertBefore(self.errorScript, self.script.nextSibling); } } /** Cleans up the DOM remains of the script request. */ cleanup() { if (this.script) { this.script.onload = this.script.onerror = null; this.script.onreadystatechange = null; } if (this.script && this.script.parentNode) { this.script.parentNode.removeChild(this.script); } if (this.errorScript && this.errorScript.parentNode) { this.errorScript.parentNode.removeChild(this.errorScript); } this.script = null; this.errorScript = null; } }