【问题标题】:web worker doesn't work网络工作者不工作
【发布时间】:2011-04-26 00:28:22
【问题描述】:

谁能告诉我为什么我的网络工作者不能工作? 我画了一个运行良好的动画画布。但是当我通过文本框调整它的大小时,它会停止运行,直到 JavaScript 执行。现在,我创建了一个 worker 来承担在不停止画布移动的情况下调整图形大小的任务。我希望它通过获取文本框的值来更新隐藏字段的值,转换为字符串,然后将结果设置为隐藏字段值。为此,我制作了文件。我的意思是 html 标记中没有 JavaScript 代码。代码文件如下

/* Code that will be run by the worker */

function applyChanges(radius, size) {
    return radius + "," + size;
}

/*
    Add an event listener to the worker, this will be called when      
    the worker receives a message from the main page.
*/
this.onmessage = function (event) {
    var data = event.data;

    // Message sent by the worker to the main page.
    postMessage(applyChanges(data.radius, data.size));
}

/* Worker's code */

// Create a new worker
var myWorker = new Worker("C:\applications\bb\scripts\setValues.js");
/*
    Add a event listener to the worker, this will be called whenever the worker posts any message.
*/
myWorker.onmessage = function (event) {
    document.getElementById().value = event.data;
};

// Register events for button.
document.getElementById("button").onclick = function () {
    var circle = document.getElementById("tcircle");
    var square = document.getElementById("tsquare");
    var radius = circle.value;
    var size = square.value;

    // check if those are numerics
    if (!isNaN(radius) && !isNaN(size)) {
        // verify that the won't hide more the 1/4 of the circle.
        if (radius >= size / Math.SQRT2) {
            // since we are going to test scrolling and zooming, we are not going to  set max values of radius and size.

            message = { "tcircle": radius, "tsize": size };

            // Message sent by the main page to the worker.
            myWorker.postMessage(message);

        }
        else {
            alert("The radius must not be less that: size/sqrt(2)");
        }
    }
    else {
        alert("Required numeric type!");
    }
}

// Terminate the worker.
myWorker.terminate(); 

【问题讨论】:

  • 请将代码缩进 4 个空格,以便格式正确。您可以使用编辑器中的按钮

标签: javascript html


【解决方案1】:

Web Worker 是异步 JavaScript 处理环境,无法访问其宿主环境:DOM。在 Web Worker 中,您可以卸载繁重的算法、数学计算,但您无法访问表单元素、更改或访问 DOM,而且我也相信您无法产生 ajax 请求。

【讨论】:

  • 谢谢伊莱。那么如何在不停止画布运动的情况下更新隐藏字段的值呢?
【解决方案2】:

Chrome 现在允许的内容已更新,可能有助于解决此问题。

基于这个答案,您可以使用 Chrome 将数据传回给工作人员,然后将其写回画布,因此其他人可能会跟随,但至少这是继续测试的一种方式。

Web Workers and Canvas

您可能想看看这个演示是如何工作的,以了解您可以使用 WebWorkerCanvas 做什么。

http://www.robodesign.ro/coding/html5-demo-video-histogram/index-web-worker.html

【讨论】:

  • 谢谢詹姆斯。该应用程序将在黑莓手机上运行。所以我的主要问题是如何获取输入文本的值,然后将这些值发送到隐藏字段。这是一种方法吗?
  • 为什么不在有变化时停止 webworker,然后用新值启动一个新的。它在 javascript 中会很快,所以用户不应该看到任何变化。
  • 我输了。我有正在运行的示例。我不明白我的不运行。我减少了代码,但什么也没有。如果你不喜欢看一眼。
  • // worker.js function applyValues(radius, size) { return radius + "," + size; } /* 给worker添加一个事件监听器,当worker从主页面接收到消息时会调用它。 */ this.onmessage = function(event) { var data = event.data; postMessage(applyValues(data.radius, data.size)); };
  • // 工作函数 getWebWorkerSupport() { return (typeof (Worker) !== "undefined") ?真假; } if (getWebWorkerSupport() == true) { 变量半径,大小,消息; worker = new Worker("worker.js"); worker.onmessage = function(event) { alert(event.data); document.getElementById("hidden").value = event.data; }; document.getElementById("btn").onclick = function() { radius = document.getElementById("tcircle").value;大小 = document.getElementById("tsquare").value;消息= {'半径':半径,'大小':大小}; worker.postMessage(message);} }
最近更新 更多