공부/Javascript

IE에서 web worker 사용하기

딸기버블티 2024. 8. 19. 16:32

1. 아래 내용의 스크립트를 추가한다.

첫번째줄은 브라우저가 ie 일때만 사용자 정의 Worker 를 사용하려고 넣었다.

if(window.navigator.userAgent.toLowerCase().indexOf('trident') > -1 || window.navigator.userAgent.toLowerCase().indexOf('MSIE') > -1)
{
	var Worker = function ( scriptFile )
	{
		console.log('익스플로어 워커다');
		var self = this ;
		var __timer = null ;
		var __text = null ;
		var __fileContent = null ;
		var onmessage ;
	
		self.onerror = null ;
		self.onmessage = null ;

		// child has run itself and called for it's parent to be notified
		var postMessage = function( text )
		{
			if ( "function" == typeof self.onmessage )
			{
				return self.onmessage( { "data" : text } ) ;
			}
			return false ;
		} ;

		// Method that starts the threading
		self.postMessage = function( text )
		{
			__text = text ;
			__iterate() ;
			return true ;
		} ;

		var __iterate = function()
		{
			// Execute on a timer so we dont block (well as good as we can get in a single thread)
			__timer = setTimeout(__onIterate,1);
			return true ;
		} ;

		var __onIterate = function()
		{
			try
			{
				if ( "function" == typeof onmessage )
				{
					onmessage({ "data" : __text });
				}
				return true ;
			}
			catch( ex )
			{
				if ( "function" == typeof self.onerror )
				{
					return self.onerror( ex ) ;
				}
			}
			return false ;
		} ;


		self.terminate = function ()
		{
			clearTimeout( __timer ) ;
			return true ;
		} ;


		/* HTTP Request*/
		var getHTTPObject = function () 
		{
			var xmlhttp;
			try 
			{
				xmlhttp = new XMLHttpRequest();
			}
			catch (e) 
			{
				try 
				{
					xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
				}
				catch (e) 
				{
					xmlhttp = false;
				}
			}
			return xmlhttp;
		}

		var http = getHTTPObject()
		http.open("GET", scriptFile, false)
		http.send(null);

		if (http.readyState == 4) 
		{
			var strResponse = http.responseText;
			//var strResponse = http.responseXML;
			switch (http.status) 
			{
				case 404: // Page-not-found error
					alert('Error: Not Found. The requested function could not be found.');
					break;
				case 500: // Display results in a full window for server-side errors
					alert(strResponse);
					break;
				default:
					__fileContent = strResponse ;
					// IE functions will become delagates of the instance of Worker
					eval( __fileContent ) ;
					/*
					at this point we now have:
					a delagate "onmessage(event)"
					*/
					break;
			}
		}

		self.importScripts = function(src)
		{
			// hack time, this will import the script but not wait for it to load...
			var script = document.createElement("SCRIPT") ;
			script.src = src ;
			script.setAttribute( "type", "text/javascript" ) ;
			document.getElementsByTagName("HEAD")[0].appendChild(script)
			return true ;
		} ;

		return true ;
	} ;
}

 

2. jsp 나 html 파일에서 스크립트를 포함시켜준다.

<script type="text/javascript" src="/ie_worker.js"></script>

 

3. 이제 사용하던 worker 를 그대로 사용해준다.

worker = new Worker("my_worker.js");   //위의 worker 파일 아님
var sessionTimeout = $("#sessionTimeOut").val();
worker.postMessage(sessionTimeout);
			 
worker.onerror = function(e) {        
	//로직
}   

worker.onmessage = function(e) {  
	//로직
}