2012-07-18 88 views
7

我正在嘗試將我的代碼移到web worker中的navigator.geolocation中。Web Workers中的HTML5 navigator.geolocation

我用Chrome和Safari瀏覽器,但是,得到 '未定義' 試了一下

VAR isGPSSupported = navigator.geolocation;

失意......他們中的規範, '導航' 的對象應該在網絡工作者的支持表示...

我的代碼如下:

index.js

var gpsWorker = new Worker("app/gpsworker.js"); 

gpsWorker.onmessage = function (e) { 
    alert(e.data); 
}; 

gpsWorker.postMessage("Start GPS!"); 

gpsWorker.onerror = function (e) { 
    alert("Error in file: " + e.filename + "\nline: " + e.lineno + "\nDescription: " + e.message); 
}; 

gpsworker .js

self.onmessage = function (e) { 
    initGeoLoc(); 
} 

function initGeoLoc() { 
    if (navigator.geolocation) { 
     navigator.geolocation.getCurrentPosition(function (position) { 
      self.postMessage("Got position!"); 
     }); 
    } else { 
     self.postMessage("GPS is not supported on this platform."); 
    } 
} 

任何暗示什麼是錯誤將不勝感激。

回答

0

鉻檢查它,它看起來絕對不具有地理位置屬性:

WorkerNavigator 
appName: "Netscape" 
appVersion: "5.0 (Windows NT 6.1) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1" 
onLine: true 
platform: "Win32" 
userAgent: "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1" 
__proto__: WorkerNavigator 

在Chrome中,你可以設置你的工人一個斷點。我建議爲你的錯誤做這個,它非常有幫助。

4

「導航器」對象支持,但它只包含四個屬性:appName,appVersion,userAgent和platform。

從查看您的代碼看來,您正試圖跟蹤用戶位置發生變化。您不必使用網絡工作者來完成此任務。你可以簡單地使用watchPosition在主線程監視用戶的位置(),它會自動通知回調函數,每當用戶的位置的變化:

navigator.geolocation.watchPosition(function(position) { 
    document.getElementById('currentLat').innerHTML = position.coords.latitude; 
    document.getElementById('currentLon').innerHTML = position.coords.longitude; 
}); 
+3

但是,如果我們最小化瀏覽器或屏幕熄滅 – narush 2017-04-01 14:13:30

8

我以前也有類似的問題,因爲你,問a related question。現在我相信我已經回答了你的問題(也是我的一個相關問題)。

navigator.geolocation僅在主線程中屬於導航器,但不屬於工作線程中的導航器。

主要原因是即使工作線程中的導航器看起來與主線程中的導航器完全相同,但這兩個導航器在C++端有獨立的實現。這就是爲什麼navigator.geolocation在工作線程中不受支持的原因。

相關代碼位於Chromium代碼中的Navigator.idlWorkerNavigator.idl之間。您可以看到它們是.idl文件中的兩個獨立接口。而且它們在綁定的C++端有獨立的實現。導航器屬於DOMWindow,而WorkerNavigator屬性爲WorkerGlobalScope

但是,在JavaScript方面,它們具有相同的名稱:navigator。由於兩名導航員在兩個不同的範圍內,因此沒有名稱衝突。但是,當在JavaScript中使用API​​時,如果主線程和輔助線程具有相同的名稱,那麼人們通常會期望類似的行爲。這就是模糊性發生的原因。

-1

在主線程postMessage()中將watchPosition(成功)放到webWorker的新位置是不夠的嗎?

+0

這不起作用雖然這個鏈接可能回答這個問題,但最好在這裏包含答案的基本部分並提供參考鏈接。如果鏈接頁面更改,則僅鏈接答案可能會失效。 - [來自評論](/ review/low-quality-posts/12297275) – 2016-05-10 04:22:57

+0

Ashish,答案在上面的第一行。鏈接提供了未來解決方案的背景。歡呼理查德 – 2016-05-10 06:23:21