Firefox Can';t导入nsidomgeolocation XPCOM接口

Firefox Can';t导入nsidomgeolocation XPCOM接口,firefox,firefox-addon,firefox-addon-sdk,Firefox,Firefox Addon,Firefox Addon Sdk,使用firefox的插件sdk,我将遵循一个关于创建可重用模块的教程,该示例使用,因此代码很简单: function getCurrentPosition(callback){ var xpcomGeolocation = Cc["@mozilla.org/geolocation;1"].getService(Ci.nsIDOMGeoGeolocation); xpcomGeolocation.getCurrentPosition(callback); } var widget =

使用firefox的插件sdk,我将遵循一个关于创建可重用模块的教程,该示例使用,因此代码很简单:

function getCurrentPosition(callback){
    var xpcomGeolocation = Cc["@mozilla.org/geolocation;1"].getService(Ci.nsIDOMGeoGeolocation);
 xpcomGeolocation.getCurrentPosition(callback);
}

var widget = require("sdk/widget").Widget({ 
    id: "whereami",
    label: "Where Am I?",
    contentURL: "http://www.mozilla.org/favicon.ico",
    onClick: function(){
        console.log("clicked!");        
        getCurrentPosition(function(position){
            console.log("latitude: " + position.coords.latitude);
            console.log("longitude: " + position.coords.longitude);
        });
    }
});
在插件打开的情况下运行firefox时,单击小部件会出现以下错误:

消息:[异常…”组件返回故障代码:0x80570018(NS_错误\u XPC\u错误\u IID)[nsIJSCID.getService]“nsresult:“0x80570018(NS_错误\u XPC\u错误\u IID)”位置:“JS框架::resource://gre/modules/XPIProvider.jsm ->罐子:file:///tmp/tmpTFowYc.mozrunner/extensions/jid1-LIBIfbK6zvWAiQ@jetpack.xpi!/bootstrap.js->resource://gre/modules/commonjs/toolkit/loader.js -> resource://jid1-libifbk6zvwaiq-at-jetpack/whereami/lib/main.js ::getCurrentPosition::第7行“数据:否]

,导入
nsidgeolocation
时可能会出错,因此您必须使用
Cc[“@mozilla.org/geolocation;1”].getService(Ci.nsISupports);
。此外,您必须请求访问geolocation的权限,请参阅参考资料中的提示权限部分

顺便提一下,作为建议,我认为使用
navigator.geolocation.getCurrentPosition(successCallback,errorCallback)会更简单
因为它可以为您处理权限提示,但我不知道除此之外您还想做什么。简单解释一下,您可以有一个附加页
data/index.html
,告诉用户您将提示他地理位置。此外,您必须有一个运行
data/script.js用于该加载项页面,该页面可以访问
navigator.geology
。该内容脚本可以与您的
lib/main.js
文件通信,因此它可以访问用户的地理位置。例如:

data/index.html

<html>
  <body>
    <h1>Hello user!</h1>
  </body>
</html>
lib/main.js

var successCallback = function(position) {
    /* this way this script will talk to the pagemod in lib/main.js the user's position */
    self.port.emit("gotGeolocation", position.coords.latitude, position.coords.longitude);
};
navigator.geolocation.getCurrentPosition(successCallback, errorCallback);
var data = require("sdk/self").data;
var pageMod = require("sdk/page-mod");
var tabs = require("sdk/tabs");

pageMod.PageMod({
  /* attach the contentScriptFile to this html page */
  include: data.url("index.html"),
  contentScriptFile: data.url("script.js"),
  onAttach: function(worker) {
    /* listen to the script.js worker "gotGeolocation" message */
    worker.port.on("gotGeolocation", function(latitude, longitude) {
      console.log("latitude:", latitude);
      console.log("longitude:", longitude);
    });
  }
});

/* this will open the index.jtml page and promt the user to access his geo position */
tabs.open(data.url("index.html"));

所有这些代码只是为了更好地描述这个想法,它还没有经过测试,事实上还有一些未发现的对象。但我希望让您了解如何访问navigator.geolocation并将其坐标传递给main.js脚本。

我想您只是忘记了上面的内容:

var { Cc, Ci } = require('chrome');

还有一个第三方的地理定位模块

sdk没有提供API来使用navigator.geolocation访问地理定位。我尝试了nsISupports,但出现了另一个错误。我所要做的就是完成教程。我编辑了我以前的回答,解释了如何访问navigator对象。希望有帮助。谢谢,我非常确定在内容页中插入脚本将使用
navigator
解决此问题,但我想访问chrome服务,不知道为什么我不能访问,如果我做得不对。好的,请编辑您的问题,向我们展示当您使用
nsistups
而不是
nsidgeogolocation
时,您会遇到什么错误。