2011-01-29 48 views
38

Tôi tự hỏi liệu tôi có thể sử dụng jQuery bên trong tệp công nhân web hay không. Google Chrome cung cấp cho tôi lỗi này: "Tham chiếu không bắt buộcLỗi: $ không được xác định".HTML Web Worker và Jquery Ajax gọi

Đây là mã: Các tập tin mẹ:

var loader = new Worker(BASE_URL + "js/rss_loader_worker.js"); 
// Ask the worker to start loading the RSS from the server 
loader.postMessage("loadRss"); 
// When receive the response from the server 
loader.onmessage = function (event) { 
    console.log(event.data); 
} 

Hồ sơ người lao động:

onmessage = function (event) { 
    if (event.data === "loadRss") { 
    loadRss(); 
    } 
} 

/** 
* This function handles the AJAX request to the server side 
* then pass the content to the view page 
* @param none 
* @return html text 
*/ 
loadRss = function() { 
    $.ajax({ 
    data: {city: CITY_LOCATION}, 
    url: BASE_URL + "/getfeeds", 
    onsucess: function (data) { 

    } 
    }); 
} 

Hãy giúp đỡ, cảm ơn bạn :)

+0

importScripts ("jquery.js"); không thể làm việc: jQuery sử dụng biến 'cửa sổ', điều này không thể truy cập được đối với nhân viên web. Nhưng bạn có thể sử dụng một thư viện khác sẽ thực hiện công việc =) –

+0

Để rõ ràng đối với người tìm kiếm trong nước, có thể và thường có lợi khi chạy yêu cầu ajax từ 'Công nhân'. Chỉ cần không có 'jQuery' truyền thống, vì' jQuery' là một thư viện thao tác DOM và các Web Worker có 'WorkerGlobalScope' và không phải là' Window' và do đó không có quyền truy cập vào tài liệu hoặc DOM. – buley

Trả lời

37

Không bạn không thể. Không có quyền truy cập vào các thành phần không an toàn không phải là luồng hoặc DOM và bạn phải chuyển dữ liệu cụ thể vào và ra khỏi một chuỗi thông qua các đối tượng được tuần tự hóa. Vì vậy, bạn phải làm việc thực sự khó khăn để gây ra vấn đề trong mã của bạn. jQuery là một thư viện JavaScript DOM.

Tuy nhiên, bạn có thể sử dụng số XMLHttpRequest gốc trong nhân viên của mình.

Và, nhập tập lệnh bên ngoài không đi qua trang có thẻ script: sử dụng importScripts() cho điều đó trong tệp công nhân của bạn.

+0

ok cảm ơn sự giúp đỡ của bạn. Bây giờ đã rõ rồi. Tôi sẽ tìm cách khác. – Tri

2

Môi trường thực thi trong Node.JS cũng thiếu triển khai DOM gốc. Tôi nghĩ thật công bằng khi nói rằng Node.JS và HTML5 Web Workers chia sẻ những hạn chế nhất định.

Có nhiều cách để mô phỏng triển khai DOM với mục đích sử dụng jQuery trong Node.JS. Nếu bạn vẫn muốn sử dụng jQuery trong các Web Worker, tôi nghĩ bạn nên tìm kiếm các giải pháp Node.JS và xem chúng có áp dụng hay không.

1

có một cái nhìn về vấn đề này plug-in https://github.com/rwldrn/jquery-hive

+0

jQuery hive là một trừu tượng cho việc sử dụng công nhân web trong jQuery, không phải là cách khác xung quanh – thomaux

+0

Plugin này là lỗi thời bây giờ. Giao diện của nó khác với giao diện bạn đang sử dụng trong jQ hiện tại. – Samuel

+1

@Anzeo Trong khi jQuery Hive được sử dụng trong các kịch bản lệnh DOM của bạn, jQuery Hive Pollen sẽ được sử dụng bên trong Worker của bạn. Có lẽ tại thời điểm viết, Pollen không có sẵn. –

22

Đây là những gì tôi thấy:

You can load external script files or libraries into a worker with the importScripts() function.

http://www.html5rocks.com/en/tutorials/workers/basics/#toc-enviornment-loadingscripts

importScripts('script1.js'); 
importScripts('script2.js'); 

hoặc

importScripts('script1.js', 'script2.js'); 

Mặc dù, bạn không thể tải jQuery, vì jQuery yêu cầu truy cập DOM, mà các công nhân web không có.

+0

Được bình chọn để trả lời câu hỏi trong một fasion chung hơn – Tarynn

+0

Cũng upvoting vì bạn đã giải thích vấn đề liên quan đến truy cập DOM. – ametren

2

jQuery chủ yếu để làm việc với DOM và làm việc với các trang web. Vì vậy, nó không phải là như vậy thích hợp cho các công nhân Web mà không có quyền truy cập vào DOM. Bạn có thể muốn sử dụng thư viện tiện ích thay vì thư viện DOM, chẳng hạn như underscore.js hoặc có thể ai đó phải tạo thư viện jQuery Worker, phiên bản jQuery bị tước bỏ ánh sáng mà không có tất cả chức năng thao tác DOM, chỉ cần giữ Các chức năng tiện ích.

4

Kể từ khi người lao động web là trong các tập tin bên ngoài, họ không có quyền truy cập vào các đối tượng JavaScript sau:

  • Cửa sổ đối tượng đối tượng
  • Tài liệu
  • Đối tượng cha mẹ

Vì vậy, bạn không thể sử dụng $ bên trong tập tin công nhân. Tốt hơn bạn có thể sử dụng một cái gì đó AJAX truyền thống như

if (window.XMLHttpRequest) 
{ 
    // code for IE7+, Firefox, Chrome, Opera, Safari 
    xmlhttp=new XMLHttpRequest(); 
} 
else 
{ 
    // code for IE6, IE5 
    xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); 
} 

Reference này tại http://www.w3schools.com/html/html5_webworkers.asp

+1

Lời xin lỗi của tôi về nitpicking, nhưng nếu bạn đang sử dụng tỷ lệ cược của Web Worker thì bạn chỉ nhắm mục tiêu IE10 + anyways. Vì vậy, mã của bạn có thể được đơn giản hóa. –

+0

Một nit khác để chọn. Vui lòng liên kết tới các tài liệu tham khảo * tốt *: https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Using_web_workers –