Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
ʹÓà Web Workers Ìá¸ß web Ó¦ÓóÌÐò¿ÉÓÃÐÔ
 
×÷ÕߣºWei Shi, Bo Wang À´Ô´£º²©¿ÍÔ° ·¢²¼ÓÚ£º 2015-05-11
  1795  次浏览      27
 

Web Workers£¬Ò»¸öÐ嵀 JavaScript ±à³ÌÄ£ÐÍ£¬¿ÉÒÔÌá¸ßÄú web Ó¦ÓóÌÐòµÄ½»»¥ÐÔ¡£ÓÐÁËËüÄú¾Í¿ÉÒÔÒÔÒ»ÖÖ¶àÏ̷߳½·¨ÔËÐÐ JavaScript£¬¶øÇÒ¿ÉÒÔÔÚºǫ́ÔËÐнű¾¶ø²»ÒÀÀµÈκÎÓû§½çÃæ½Å±¾¡£±¾ÎĽéÉÜÁË Web Workers£¬²¢Òýµ¼ÄúÁ˽âÒ»¸öʵ¼ùʾÀý£¬ÏòÄúչʾÈçºÎ½« Web Workers ÔËÓõ½ÄúµÄ web Ó¦ÓóÌÐòÖС£

¼ò½é

Ëæ×Å Ajax ºÍ Web 2.0 Ó¦ÓóÌÐòµÄ³öÏÖ£¬ÖÕ¶ËÓû§±»¿ìËÙÏìÓ¦µÄ web Ó¦ÓóÌÐò³è»µÁË¡£ÒªÈà web Ó¦ÓóÌÐòÏìÓ¦µÃ¸ü¿ì£¬Æ¿¾±Ò»¶¨Òª½â¾ö¡£Æ¿¾±°üÀ¨ JavaScript ºÍºǫ́ I/O ÅÓ´óµÄ¼ÆËãÁ¿£¬ÕâÐèÒª´ÓÖ÷ UI ÏÔʾÁ÷³ÌÖÐÒÆ³ý£¬½»¸ø Web Workers ´¦Àí¡£

Web Workers ¹æ·¶Ìṩ²»ÒÀÀµÈκÎÓû§½çÃæ½Å±¾ÔÚºǫ́ÔËÐнű¾µÄÄÜÁ¦¡£³¤ÆÚÔËÐнű¾²»»á±»ÏìÓ¦µ¥»÷»òÆäËûÓû§½»»¥µÄ½Å±¾Öжϡ£Web Workers ÔÊÐíÖ´Ðг¤ÆÚÈÎÎñ£¬Í¬Ê±Ò²²»Ó°ÏìÒ³ÃæÏìÓ¦¡£

Web Workers ³öÏÖ֮ǰ£¬JavaScript ÊÇÏÖ´ú web Ó¦ÓóÌÐòµÄºËÐÄ¡£JavaScript ºÍ DOM ±¾ÖÊÉ϶¼Êǵ¥Ï̵߳ģºÔÚÈκÎʱ¼ä¶¼Ö»ÄÜÖ´ÐÐÒ»¸ö JavaScript ·½·¨¡£¼´Ê¹ÄúµÄ¼ÆËã»úÓÐ 4 ¸öÄںˣ¬ÔÚ½øÐг¤ÆÚ¼ÆËãʱ£¬Ò²Ö»ÓÐÒ»¸öÄں˱ȽϷ±Ã¦¡£ÀýÈ磬ÄúÔÚ¼ÆËãµ½´ïÔÂÇòµÄ×î¼Ñ¹ìµÀʱ£¬ÄúµÄä¯ÀÀÆ÷²»ÄÜäÖȾһ¸öÏÔʾ¹ì¼£µÄ¶¯»­£¬ÒÔ¼° ¡ª ͬʱ ¡ª ¶ÔÓû§Ê¼þ×÷³öÏìÓ¦£¨±ÈÈçÊó±êµ¥»÷»ò¼üÅÌÊäÈ룩¡£

Web Workers ´òÆÆÁË´«Í³ JavaScript µÄµ¥Ïß³Ìģʽ£¬ÒýÈëÁ˶àÏ̱߳à³Ìģʽ¡£Ò»¸ö worker ÊÇÒ»¸ö¶ÀÁ¢µÄÏ̡߳£Óжà¸öÈÎÎñÐèÒª´¦ÀíµÄ web Ó¦ÓóÌÐò²»ÔÙÐèÒªÖð¸ö´¦ÀíÈÎÎñ¡£·´Ö®£¬Ó¦ÓóÌÐò¿ÉÒÔ½«ÈÎÎñ·ÖÅ䏸²»Í¬µÄ workers¡£

ÔÚ±¾ÎÄÖУ¬Äú½«Ñ§Ï° Web Workers API¡£Ò»¸öʵÀýÒýµ¼ÄúÖð²½Ê¹Óà Web Workers À´¹¹½¨Ò»¸ö web Ò³Ãæ¡£

´ÓÏÂÃæµÄ ÏÂÔØ±í¸ñ ÏÂÔØ±¾ÎÄʾÀýµÄÔ´´úÂë¡£

»ù±¾¸ÅÄî

Web Workers µÄ»ù±¾×é³É£º

Worker

Ò»¸öÐÂỊ̈߳¬ÔÚºǫ́ÔËÐУ¬²»»á×èÈûÈκÎÖ÷Óû§½çÃæ½Å±¾£¨×÷Ϊºǫ́½Å±¾±»µ÷Óã©¡£Workers ÊÇÏà¶ÔÖØÁ¿¼¶µÄ£¬²»Òª´ó¹æÄ£Ê¹Óá£

Ò»¸ö worker ¿ÉÒÔÖ´Ðв»ÉÙÈÎÎñ£¬°üÀ¨²¢ÐмÆËã¡¢ºǫ́ I/O¡¢ÒÔ¼°¿Í»§¶ËÊý¾Ý¿â²Ù×÷¡£worker ²»Ó¦¸ÃÖжÏÖ÷ UI »òÖ±½Ó²Ù×÷ DOM£»ËüÓ¦¸ÃÏòÖ÷Ï̷߳µ»ØÒ»¸öÏûÏ¢£¬²¢ÈÃÖ÷Ï̸߳üÐÂÖ÷ UI¡£

Subworker

ÔÚÒ»¸ö worker Öд´½¨µÄ worker¡£Subworkers ±ØÐëÓë¸¸Ò³ÃæÍ¬¸ùͬԴ¡£subworkers µÄ URI ÊǸù¾Ý¸¸ worker µÄµØÖ·¶ø²»ÊÇ×Ô¼ºÒ³ÃæµØÖ·È·¶¨µÄ¡£

Shared worker

Ò»¸ö¿ÉÒÔ±»¶à¸öÒ³ÃæÍ¨¹ý¶à¸öÁ¬½ÓËùʹÓÃµÄ worker£¬¹²Ïí worker ºÍÆÕͨ worker µÄ¹¤×÷·½Ê½ÂÔÓв»Í¬£¬Ö»ÓÐһС²¿·Öä¯ÀÀÆ÷Ö§³ÖÕâÒ»ÌØÐÔ¡£

Web Workers API

±¾Ð¡½Ú½éÉÜ Web Workers API µÄ»ù±¾¸ÅÄî.

´´½¨Ò»¸ö worker

Òª´´½¨Ò»¸öРworker£¬ÄúÖ»ÐèÒªµ÷Óà worker ¹¹Ô캯Êý£¬worker ½Å±¾ URL ÊÇΩһ²ÎÊý¡£worker ´´½¨Íê³ÉµÄͬʱÆô¶¯Ò»¸öÐÂỊ̈߳¨»òÕß¿ÉÄÜÊÇÒ»¸öнø³Ì£¬¸ù¾ÝÄúä¯ÀÀµÄʵÏÖ¶ø¶¨£©¡£

worker Íê³É¹¤×÷»òÕßÓöµ½Ò»¸ö´íÎóʱ£¬Äú¿ÉÒÔʹÓÃ×÷ҵʵÀýµÄ onmessage ºÍ onerror ÊôÐÔ´Ó worker »ñȡ֪ͨ¡£Çåµ¥ 1 ÊÇÒ»¸öÑùÀý worker¡£

Çåµ¥ 1. ÑùÀý worker myWorker.js

// receive a message from the main JavaScript thread
onmessage = function(event) {
// do something in this worker
var info = event.data;
postMessage(info + ¡° from worker!¡±);
};

Èç¹ûÄúÔËÐÐÇåµ¥ 2 ÖÐµÄ JavaScript ´úÂ룬Äú½«µÃµ½ ¡°Hello World from worker¡± ¡£

Çåµ¥ 2. Ö÷ JavaScript Ïß³ÌÖÐµÄ Worker

// create a new worker
var myWorker = new Worker("myWorker.js");
// send a message to start the worker
var info = ¡°Hello World¡±;
myWorker.postMessage(info);
// receive a message from the worker
myWorker.onmessage = function (event) {
// do something when receiving a message from worker
alert(event.data);
};

ÖÕÖ¹ worker

Ò»¸ö worker ÊÇÒ»¸öỊ̈߳¬ÊÇÒ»¸ö¸ß×ÊÔ´ÏûºÄµÄ OS ¼¶¶ÔÏó¡£µ±·ÖÅ䏸 worker µÄÈÎÎñÍê³Éºó£¬»òÕßÏëÒªÖÕֹʱ£¬µ÷Óà worker µÄ terminate ·½·¨À´ÖÕÖ¹ÕýÔÚÔËÐÐµÄ worker¡£worker Ï̻߳ò½ø³Ì¼´¿ÉÖÕÖ¹£¬Ã»Óлú»áÍê³ÉËüµÄ²Ù×÷ÒÔ¼°×ÔÉíÇåÀí¡£Çåµ¥ 3 ÊÇÒ»¸öʾÀý¡£

Çåµ¥ 3. ÖÕÖ¹ myWorker

myWorker.terminate();

´íÎó´¦Àí

ºÍÆÕͨ JavaScript ´úÂëÀàËÆ£¬ÔËÐÐʱ´íÎóÒ²¿É³öÏÖÔÚÔËÐÐµÄ worker ÖС£Òª´¦ÀíÕâЩ´íÎó£¬ÄúÐèҪΪ worker ½¨Á¢ onerror ´¦Àí³ÌÐò£¬Èç¹ûÔڽű¾ÔËÐÐÆÚ¼ä³öÏÖ´íÎ󣬽«»áµ÷Óøô¦Àí³ÌÐò¡£Òª·ÀÖ¹·¢ÉúĬÈϻ£¬worker ¿ÉÒÔµ÷Óà worker ´íÎóʼþµÄ preventDefault() ·½·¨¡£

Çåµ¥ 4. Ϊ myWorker Ìí¼Ó´íÎó¾ä±ú

myWorker.onerror = function(event){
console.log(event.message);
console.log(event.filename);
console.log(event.lineno);
}

´íÎóʼþÓÐÒÔÏ 3 ¸ö×ֶΣ¬¿ÉÄܶԵ÷ÊÔÓаïÖú£º

message£ºÒ»¸öÈËÃǿɶÁµÄ´íÎóÏûÏ¢

filename£º³öÏÖ´íÎóÏûÏ¢µÄ½Å±¾ÎļþµÄÃû³Æ

lineno£º³öÏÖ´íÎóÏûÏ¢µÄ½Å±¾ÎļþµÄÐÐÊý

µ¼Èë½Å±¾ºÍ¿â

Worker Ï߳̿ÉÒÔ·ÃÎÊÒ»¸öÈ«¾Öº¯Êý£¬importScripts()£¬¸Ãº¯ÊýÖ§³Ö½«½Å±¾ºÍÊý¾Ý¿âµ¼ÈëËüÃǵÄ×÷ÓÃÓò¡£Ëü¿ÉÒÔ²»½ÓÊÕ²ÎÊý£¬Ò²¿ÉÒÔ½ÓÊÕ¶à¸öÒªµ¼ÈëµÄ×ÊÔ´µÄ URL ×÷Ϊ²ÎÊý¡£

Çåµ¥ 5. µ¼Èë½Å±¾

//import nothing
importScripts();
//import just graph.js
importScripts('graph.js');
//import two scripts
importScripts('graph.js', 'controller.js');

ʹÓà Web Workers

±¾Ð¡½Ú¼òÒª½éÉÜ Web Workers µÄÒ»¸öʵ¼ÊÓÃÀý¡£¸ÃʾÀý°üÀ¨ÏÔʾһ¸öº¬Óжà¸ö»ùÓÚ Dojo µÄ Website Displayer С²¿¼þµÄÒ³Ãæ¡£ÕâЩС²¿¼þ¹ýȥͨ³£Ê¹Óà iFrame À´ÏÔʾһ¸öÍøÕ¾¡£Ã»ÓÐ Web Workers ʱ£¬Äú±ØÐëͨ¹ý Ajax ÇëÇóÀ´»ñȡС²¿¼þ¶¨Ò壬ȻºóÔÚÒ»¸ö¶ÀÁ¢µÄ JavaScript Ïß³ÌÖÐÏÔʾËüÃÇ¡£Èç¹ûС²¿¼þ¶¨Ò庬ÓдóÁ¿Êý¾Ý£¬Õâ¸ö¹ý³ÌÊǷdz£ÂýµÄ¡£

¸ÃʾÀý´´½¨Ò»Ð© workers À´»ñȡС²¿¼þ¶¨Ò塣ÿ¸ö worker µÄÈÎÎñÊÇ»ñȡһ¸öС²¿¼þ¶¨Ò壬¶øÇÒ¸ºÔð֪ͨÖ÷ UI JavaScript Ïß³ÌÀ´ÏÔʾËü£¬ÕâÊÇÒ»¸ö½Ï¿ìµÄ½â¾ö·½°¸¡£

¸ÃʾÀýÓõÄÊÇ Dojo 1.4¡£Èç¹ûÄúÏëÔÚÄúµÄä¯ÀÀÆ÷ÖÐÔËÐиÃʾÀý£¬ÏÂÔØ±¾ÎÄËùʹÓÃµÄ Dojo ¿â£¨¼û ²Î¿¼×ÊÁÏ£©ºÍÔ´´úÂ루¼û ÏÂÔØ £©¡£Í¼ 1 չʾÁËʾÀýÓ¦ÓóÌÐòµÄ½á¹¹¡£

ͼ 1. Web Workers Ó¦ÓóÌÐò

ÔÚͼ 1 ÖУº

lib ÊÇÒ»¸ö dojo ¿â¡£

/widgets/WebsiteDisplayer.js ÊÇÒ»¸ö»ùÓÚ dojo µÄ Website Displayer С²¿¼þʵÏÖ¡£

/loadwidget/widgets/widgetDefinition[0....3] ÊÇÿ¸ö Website Displayer С²¿¼þµÄ¶¨Òå¡£

/loadwidget/Workers.js ÊÇ worker ʵÏÖ¡£

/loadwidget/XMLHttpRequest.js ÊÇÒ»¸ö js ¿â£¬º¬ÓÐÒ»¸ö´´½¨ XMLHttpRequst µÄ·½·¨¡£

/loadwidget/LoadWidget.html ÊÇ´øÓ줻îµÄ Web Workers µÄÑÝʾµÄÖ÷Ò³Ãæ£¬Ëü½«»áÊÇÖ÷ JavaScript Ï̡߳£

/loadwidget/LoadWidget-none-web-workers.html ÊÇÔÚûÓÐ Web Workers µÄÇé¿öÏÂʵÏÖµÄÖ÷Ò³Ãæ¡£

´´½¨Ò»¸ö Website Displayer С²¿¼þ

Website Displayer С²¿¼þÊÇÒ»¸ö·Ç³£¼òµ¥µÄ»ùÓÚ Dojo-TitlePane-dijit µÄС²¿¼þ¡£Ëü½«ÏÔʾһ¸ö¹æ·¶»¯±êÌâÀ¸µÄ UI£¬Èçͼ 2 Ëùʾ¡£

ͼ 2. Website Displayer С²¿¼þ

Çåµ¥ 6 ÊÇ WebsiteDisplayer.js µÄ´úÂë¡£

Çåµ¥ 6. WebsiteDisplayer.js µÄÄÚÈÝ

dojo.require("dijit._Widget");
dojo.require("dijit._Templated");
dojo.require("dijit.TitlePane"); dojo.declare("loadWidget.WebsiteDisplayer", [dijit.TitlePane], {
title: "",
url: "",
postCreate: function() {
var ifrm = dojo.create("iframe", {
src: this.url,
style: "width:100%;height:20%;"
});
dojo.place(ifrm, this.domNode.children[1], "first");
this.inherited(arguments);
var contentFrame = this.domNode.children[1].children[0];
if (contentFrame.attachEvent) {
contentFrame.attachEvent("onload",
function() {
dojo.publish("frameEvent/loaded");
}
);
} else {
contentFrame.onload = function() {
dojo.publish("frameEvent/loaded");
};
}
}
});

´´½¨Ò»¸ö worker

ҪʵÏÖ worker.js£¬µ¼ÈëÒ»¸öÈ«¾Ö JavaScript Îļþ XMLHttpRequest.js£¬ÆäÖк¬ÓÐÈ«¾Ö·½·¨ creatXMLHTTPRequest¡£¸Ã·½·¨½«·µ»ØÒ»¸ö XMLHttpRequest ¶ÔÏó¡£

worker Ö÷Òª½« XMLHttpRequest ·¢Ë͵½·þÎñÆ÷¶Ë£¬È»ºó¼ìË÷С²¿¼þ¶¨Òå·µ»Ø¸øÖ÷Ï̡߳£Çåµ¥ 7 ºÍÇåµ¥ 8 չʾÁËÒ»¸öʾÀý¡£

Çåµ¥ 7. Worker.js µÄÄÚÈÝ

importScripts("XMLHttpRequest.js");
onmessage = function(event) {
var xhr = creatXMLHTTPRequest();
xhr.open('GET', 'widgets/widgetDefinition' + event.data + '.xml', true);
xhr.send(null);
xhr.onreadystatechange = function() {
if (xhr.readyState == 4) {
if (xhr.status == 200 || xhr.status ==0) {
postMessage(xhr.responseText);
} else {
throw xhr.status + xhr.responseText;
}
}
}
}

Çåµ¥ 8. widgetDefinition0.xml

<div dojoType="loadWidget.WebsiteDisplayer" title="This is Test Widget 0"
url="http://www.yahoo.com" ></div>

´´½¨Ö÷ web Ò³

Ö÷ web Ò³¾ÍÊÇÄú½øÐÐÕâЩ²Ù×÷µÄµØ·½£º´´½¨¼¸¸ö workers£»·¢ËÍÏûÏ¢µ½ workers ²¢Æô¶¯ workers£»´Ó workers ÖмìË÷ÏûÏ¢£»Ê¹ÓüìË÷µÄÏûÏ¢²Ù×÷Ö÷ UI¡£

Çåµ¥ 9. Ö÷ web Ò³

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>
Load widgets with Web Workers
</title>
<style type="text/css">
@import "../lib/dijit/themes/soria/soria.css";
@import "../lib/dojo/resources/dojo.css";
@import "../lib/dojox/layout/resources/GridContainer.css";
@import "../lib/dojox/layout/resources/DndGridContainer.css"
</style>
<script type="text/javascript" src="../lib/dojo/dojo.js"
djConfig="parseOnLoad: true,isDebug:true">
</script>
<script>
dojo.require("dojo.parser");
dojo.require("dojo.io.script");
dojo.require("dojox.layout.GridContainer");
dojo.require("dijit.layout.LayoutContainer");
dojo.require("dijit.TitlePane");
dojo.require("dojox.layout.DragPane");
dojo.registerModulePath("loadWidget", "../../loadWidget");
dojo.require("loadWidget.WebsiteDisplayer");
</script>
<script type="text/javascript" language="javascript">
var workersCount = 4;
var haveLoadedCount = 0;
var widgetCount = 4;
var startTime = new Date().getTime();
var endTime = null;
var executeTime = 0;
try {
for (var i = 0; i < workersCount; i++) {
var loadWorker = new Worker("Worker.js");
loadWorker.postMessage(i);
loadWorker.onmessage = processReturnWidgetDefinition;
loadWorker.onerror = handleWorkerError;
}
} catch(ex) {
console.log(ex);
}

function processReturnWidgetDefinition(event) {
var txt = document.createElement("p");
txt.innerHTML = event.data;
var div = document.getElementById("loadingDiv");
div.appendChild(txt);
haveLoadedCount++;
if (haveLoadedCount == widgetCount) {
dojo.parser.parse();
}
} function handleWorkerError(event){
console.log(event.message);
} dojo.subscribe("frameEvent/loaded", dojo.hitch(null, handelFrameLoaded)); function handelFrameLoaded() {
if (haveLoadedCount == widgetCount) {
endTime = new Date().getTime();
executeTime = endTime - startTime;
dojo.byId("loading").innerHTML = "Loading cost time:" + executeTime;
}
}
</script>
</head> <body class="soria">
<div dojoType="dijit.TitlePane" title="Load widgets with Web Workers"
style="border: 2px solid black; padding: 10px;"
id="main">
<div id="loadingDiv">
<div id="loading">
Widgets are loading......
</div>
</div>
</div>
</body> </html>

½«Õâ¸öÖ÷Ò³ÃæÇ¶Èëµ½Ò»¸ö web Ó¦ÓóÌÐòÖУ¬È»ºóÔËÐÐËü¡£½á¹ûÈçͼ 3 Ëùʾ¡£

ͼ 3. ʹÓà Web Workers ¼ÓÔØÐ¡²¿¼þ

ÏëÒª²é¿´Ê¹Óà Web Workers ºÍ²»Ê¹Óà Web Workers µÄÇø±ð£¬·Ö±ðÔËÐÐ LoadWidget.html ºÍ LoadWidget-none-web-workers.html£¬È»ºó²é¿´½á¹û¡£×¢Ò⣬ÔÚÕâÀïûÓÐÔËÐÐ Web Workers µÄÒ³Ãæ±ÈÔËÐÐ Web Workers µÄÒ³ÃæÍê³ÉµÃÒª¿ì£¬ÕâÊÇÒòΪ´úÂëÑùÀý´¦ÀíµÄÊý¾ÝÌ«ÉÙ¡£Êµ¼ÊÉÏ£¬½ÚÊ¡µÄʱ¼äƽºâÁËÆô¶¯ worker µÄ³É±¾¡£

ʹÓà Web Workers ¼¼ÇÉ

ÉÏÃæµÄʾÀýֻɿ¼° XMLHttpRequest ºÍ¼ÆË㣻²»ÊǺܴóÒ²²»¸´ÔÓ¡£Èç¹ûÄúÈà worker ´¦Àí¸ü¸´ÔÓµÄÈÎÎñ£¬±ÈÈç´¦Àí´óÁ¿¼ÆË㣬Ëü½«»áÊÇÒ»¸ö¹¦ÄÜÇ¿´óµÄÌØÐÔ¡£ÔÚ½«Õâ¸öºÜ¿áµÄ¼¼ÊõÔËÓõ½ÄúµÄÏîĿ֮ǰ£¬Á˽âһЩʹÓü¼ÇÉ¡£

ÔÚ workers Öв»ÄÜ·ÃÎÊ DOM

ΪÁ˰²È«£¬workers ²»ÄÜÖ±½Ó¶Ô HTML ½øÐвÙ×÷¡£Í¬Ò» DOM ÉϵĶàÏ̲߳Ù×÷¿ÉÄÜ»áÒý·¢Ḭ̈߳²È«ÎÊÌâ¡£ÓÅÊÆÊÇÄú²»ÔÙµ£ÓÇ worker ʵÏÖÖеĶàḬ̈߳²È«ÎÊÌâ¡£

ÕâÔÚ¿ª·¢ worker ʱÓÐһЩ¾ÖÏÞÐÔ£¬Äú²»ÄÜÔÚ worker Öе÷Óà alert()£¬ÕâÊÇÒ»¸ö·Ç³£Á÷Ðеĵ÷ÊÔ JavaScript ´úÂëµÄ·½·¨¡£ÄúÒ²²»Äܵ÷Óà document.getElementById()£¬ÒòΪËüÖ»ÄܼìË÷ºÍ·µ»Ø±äÁ¿£¨¿ÉÄÜÊÇ×Ö·û´®¡¢Êý×é¡¢JSON ¶ÔÏ󣬵ȵȣ©¡£

worker ÖпÉÓõĶÔÏó

¾¡¹Ü worker ²»ÄÜ·ÃÎÊ window ¶ÔÏ󣬵«¿ÉÒÔÖ±½Ó·ÃÎÊ navigator¡£ÄúÒ²¿ÉÒÔÔÚ navigator ¶ÔÏóÖзÃÎÊ appName¡¢appVersion¡¢platform ºÍ userAgent¡£

location ¶ÔÏó¿ÉÒÔÒÔÖ»¶Á·½Ê½·ÃÎÊ¡£Äú¿ÉÒÔÔÚ location ¶ÔÏóÖлñÈ¡ hostname ºÍ port¡£

ÔÚ worker ÖÐÒ²Ö§³Ö XMLHttpRequest£¬Èç±¾ÎÄʾÀýËùʾ¡£ÓÐÁËÕâÒ»ÌØÐÔ£¬Äú¾Í¿ÉÒÔ½«´óÁ¿¸ÐÐËȤµÄÀ©Õ¹Ìí¼Óµ½ worker ÖС£

´ËÍ⻹ÓУº

importScripts() ·½·¨£¨ÔÚͬһ¸öÓòÉÏ·ÃÎʽű¾Îļþ£©

JavaScript ¶ÔÏ󣬱ÈÈç Object¡¢Array¡¢Date¡¢Math ºÍ String

setTimeout() ºÍ setInterval() ·½·¨

postMessage ÖÐЯ´øµÄÊý¾ÝÀàÐÍ

postMessage µÄʹÓÃÊ®·ÖƵ·±£¬ÒòΪËüÊÇÖ÷ JavaScript Ï̵߳ÄÖ÷Òª·½·¨£¬ÓÃÓÚºÍ workers ½»»¥¡£È»¶ø£¬ÏÖÔÚ postMessage ÖÐЯ´øµÄÊý¾ÝÀàÐͽöÏÞÓÚ±¾µØ JavaScript ÀàÐÍ£¬±ÈÈ磬Array¡¢Date¡¢Math¡¢String¡¢JSON µÈµÈ¡£½á¹¹¸´ÔÓµÄ×Ô¶¨Òå JavaScript ¶ÔÏó²»Äܱ»ºÜºÃµØÖ§³Ö¡£

   
1795 ´Îä¯ÀÀ       27
 
Ïà¹ØÎÄÕÂ

ÊÖ»úÈí¼þ²âÊÔÓÃÀýÉè¼ÆÊµ¼ù
ÊÖ»ú¿Í»§¶ËUI²âÊÔ·ÖÎö
iPhoneÏûÏ¢ÍÆËÍ»úÖÆÊµÏÖÓë̽ÌÖ
AndroidÊÖ»ú¿ª·¢£¨Ò»£©
 
Ïà¹ØÎĵµ

Android_UI¹Ù·½Éè¼Æ½Ì³Ì
ÊÖ»ú¿ª·¢Æ½Ì¨½éÉÜ
androidÅÄÕÕ¼°ÉÏ´«¹¦ÄÜ
Android½²ÒåÖÇÄÜÊÖ»ú¿ª·¢
Ïà¹Ø¿Î³Ì

Android¸ß¼¶Òƶ¯Ó¦ÓóÌÐò
Androidϵͳ¿ª·¢
AndroidÓ¦Óÿª·¢
ÊÖ»úÈí¼þ²âÊÔ
×îл¼Æ»®
DeepSeekÔÚÈí¼þ²âÊÔÓ¦ÓÃʵ¼ù 4-12[ÔÚÏß]
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢Êµ¼ù 4-19[ÔÚÏß]
UAF¼Ü¹¹ÌåϵÓëʵ¼ù 4-11[±±¾©]
AIÖÇÄÜ»¯Èí¼þ²âÊÔ·½·¨Óëʵ¼ù 5-23[ÉϺ£]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 4-26[±±¾©]
ÒµÎñ¼Ü¹¹Éè¼ÆÓ뽨ģ 4-18[±±¾©]

androidÈË»ú½çÃæÖ¸ÄÏ
AndroidÊÖ»ú¿ª·¢£¨Ò»£©
AndroidÊÖ»ú¿ª·¢£¨¶þ£©
AndroidÊÖ»ú¿ª·¢£¨Èý£©
AndroidÊÖ»ú¿ª·¢£¨ËÄ£©
iPhoneÏûÏ¢ÍÆËÍ»úÖÆÊµÏÖ̽ÌÖ
ÊÖ»úÈí¼þ²âÊÔÓÃÀýÉè¼ÆÊµ¼ù
ÊÖ»ú¿Í»§¶ËUI²âÊÔ·ÖÎö
ÊÖ»úÈí¼þ×Ô¶¯»¯²âÊÔÑо¿±¨¸æ

Android¸ß¼¶Òƶ¯Ó¦ÓóÌÐò
AndroidÓ¦Óÿª·¢
Androidϵͳ¿ª·¢
ÊÖ»úÈí¼þ²âÊÔ
ǶÈëʽÈí¼þ²âÊÔ
AndroidÈí¡¢Ó²¡¢ÔÆÕûºÏ

ÁìÏÈIT¹«Ë¾ android¿ª·¢Æ½Ì¨×î¼Ñʵ¼ù
±±¾© Android¿ª·¢¼¼Êõ½ø½×
ijÐÂÄÜÔ´ÁìÓòÆóÒµ Android¿ª·¢¼¼Êõ
ijº½Ì칫˾ Android¡¢IOSÓ¦ÓÃÈí¼þ¿ª·¢
°¢¶û¿¨ÌØ LinuxÄÚºËÇý¶¯
°¬Ä¬Éú ǶÈëʽÈí¼þ¼Ü¹¹Éè¼Æ
Î÷ÃÅ×Ó Ç¶Èëʽ¼Ü¹¹Éè¼Æ