Javascript 丢失上下文引用

Javascript 丢失上下文引用,javascript,google-chrome,google-chrome-extension,Javascript,Google Chrome,Google Chrome Extension,在“选项”页面中创建新对象时,我遇到了一个“小”问题 在选项页面中,我创建了一些对象,并将它们保存为常规设置。这些对象具有与不同API通信的方法。但是,一旦我使用其中一个对象,我就失去了当前页面上的上下文 例如: 在选项页面中,我创建了一个对象,该对象有一个“request”方法,我用这个方法向某个api发送了一个ajax请求。当我在另一个页面上调用它时,ajax请求记录在选项页面中。当我关闭选项页面时,我会丢失它生成的所有日志的上下文 有没有办法强制上下文引用当前页面?还是我在错误的页面上创建

在“选项”页面中创建新对象时,我遇到了一个“小”问题

在选项页面中,我创建了一些对象,并将它们保存为常规设置。这些对象具有与不同API通信的方法。但是,一旦我使用其中一个对象,我就失去了当前页面上的上下文

例如:

在选项页面中,我创建了一个对象,该对象有一个“request”方法,我用这个方法向某个api发送了一个ajax请求。当我在另一个页面上调用它时,ajax请求记录在选项页面中。当我关闭选项页面时,我会丢失它生成的所有日志的上下文

有没有办法强制上下文引用当前页面?还是我在错误的页面上创建对象/保存对象并在需要它们的页面上检索它们时出错了?(也就是说,我应该只保存在页面上创建对象所需的数据吗?(对于同样的事情来说,这似乎是一个很大的开销(?)

提前谢谢

编辑

我有一个选项页面,可以创建一个对象,称之为MyApi。我创建一个新的MyApi并将其存储在chrome.storage.local中。当用户选择了一些文本并单击上下文菜单时,我会打开一个新页面(selectedText.html)其中显示了选定的文本和一些API调用,这些调用主要是ajax请求。当我从selectedText.html中的存储中获取对象并使用MyApi发出任何请求时,我在ajax请求的网络选项卡中看不到任何日志,也看不到任何控制台日志。但打开选项页面后,我看到了其中的所有内容

EDIT2

save : function()
{
    var obj = {'api':this.data};
    chrome.storage.local.set(obj,function() { if(chrome.runtime.lastError) console.warn(chrome.runtime.lastError); });
}

这在后台脚本中。

您可以通过以下方式实现所需:

  • 在背景页面中定义您的对象/功能/任何内容
  • 使用在背景页面
    窗口
    对象上获得保留
  • 执行所需的方法,将本地上下文的对象作为参数传递(当然,您必须修改函数以接受并使用这样的参数)
  • 例如:

    在background.js中:

    function myFunc(winObj, msg) {
        winObj.console.log(msg);
    }
    
    chrome.runtime.getBackgroundPage(function(bgPage) {
        bgPage.myFunc(window, "This will be logged in 'otherPage.html' !");
    });
    
    在otherPage.js中:

    function myFunc(winObj, msg) {
        winObj.console.log(msg);
    }
    
    chrome.runtime.getBackgroundPage(function(bgPage) {
        bgPage.myFunc(window, "This will be logged in 'otherPage.html' !");
    });
    

    这不是最干净的解决方案,但它可能会起作用…

    我们不太清楚您想要实现什么,但很明显,选项页面的上下文不适合这个目的。您查看过chrome.storage吗?我创建了对象并将其保存到chrome.storage中。但是,当任何方法调用时,它都没有控制台来记录任何内容到.T这里总是有一个控制台(当然你必须打开它)。它仍然不清楚你的意思。试着发布一些代码,并对每个步骤中发生的事情进行更详细的解释。希望我的编辑能澄清一点。我仍然不明白你如何能够使用chrome.storage中的方法存储对象,然后检索它(我不能这样做)。在任何情况下,如果您想要一个具有“实用程序”方法的对象,我建议将其放置在后台页面中,并从任何其他页面调用它(使用chrome.runtime.getBackgroundPage()。如果在后台页面上进行ajax调用,则此操作将不起作用。它将登录到后台页面的“网络”选项卡,这些页面将通过我所在页面上的“我的ajaxSend”和“我的ajaxComplete”事件(但会为后台页面触发)。诀窍是不要在后台页面的上下文中触发它。因为我知道您想要使用jQuery的
    .ajax()
    ,所以您可以传递内容脚本的
    jQuery
    对象(以及任何其他必要的参数),只需使用函数“instrument”即可。