Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Chrome扩展内容脚本-应用程序未在Ember站点上定义_Javascript_Google Chrome_Ember.js_Google Chrome Extension_Twitch - Fatal编程技术网

Javascript Chrome扩展内容脚本-应用程序未在Ember站点上定义

Javascript Chrome扩展内容脚本-应用程序未在Ember站点上定义,javascript,google-chrome,ember.js,google-chrome-extension,twitch,Javascript,Google Chrome,Ember.js,Google Chrome Extension,Twitch,我正在为频道编写一个简单的Google Chrome扩展。 我唯一需要的功能是发送聊天信息,最好不用显式使用聊天文本框和按钮 通过查看的源代码,我找到了负责发送聊天信息的函数: App.\uuuuu容器\uuuuuu.lookup('controller:chat').currentRoom.tmiRoom.sendMessage('testmessage') 现在,当我使用Chrome DevTools中的控制台执行此操作时,效果非常好。 但是,从扩展的内容脚本使用它时抛出:script1.j

我正在为频道编写一个简单的Google Chrome扩展。 我唯一需要的功能是发送聊天信息,最好不用显式使用聊天文本框和按钮

通过查看的源代码,我找到了负责发送聊天信息的函数:

App.\uuuuu容器\uuuuuu.lookup('controller:chat').currentRoom.tmiRoom.sendMessage('testmessage')

现在,当我使用Chrome DevTools中的控制台执行此操作时,效果非常好。

但是,从扩展的内容脚本使用它时抛出:
script1.js:28未捕获引用错误:未定义应用程序

当尝试使用
window.Ember
(在控制台中工作,抛出未在内容脚本中定义)时,也会出现相同的情况

以防万一,下面是内容脚本的全部测试代码:

$(document).ready(function() {
    setTimeout(function() {
        main();
    }, 5000);
});

function main() {
    var tmi = App.__container__.lookup('controller:chat').currentRoom;

    tmi.tmiRoom.sendMessage('TEST'); 
}


虽然我在chrome扩展方面有一些经验,但我从来没有处理过关于Ember.js的任何事情。此外,我还没有发现任何类似的问题。

发生此错误是因为
content\u script
webpage
具有一些DOM层,但具有不同的JavaScript上下文,因此您无法从
content\u script
访问网页的JavaScript对象

你可以通过这种方式做你想做的事情:

  • 注入页面
    代理
    脚本,该脚本将在页面的JS上下文中工作,并从
    内容脚本
    中侦听自定义事件
  • 将带有消息的自定义消息从
    content\u script
    发送到页面的侦听器
  • 运行你的
    应用程序。_容器__.lookup('controller:chat').currentRoom.tmiRoom.sendMessage('testmessage')内容\u脚本的消息时的侦听器中的code>
  • 不幸的是,从你的问题中,我不明白你想用什么方式输入你想发送的聊天信息,所以我将举几个例子来说明如何发送固定消息

    一步一步地 定义
    content\u脚本
    并使
    proxy.js
    web可在manifest.js中访问:

    content\u脚本中
    runner.js将
    proxy.js
    注入页面并向其发送消息:

    ...
    var inject = document.createElement("script");
    inject.src=chrome.extension.getURL("proxy.js");
    (document.head||document.documentElement).appendChild(inject);
    
    
    // replace it with your code which sends message to the proxy, now for example it sends "Hi!" message for every second
    setInterval('window.postMessage({"event":"chatMessage","value":"Hi!"},"*");',1000);
    ...
    
    在proxy.js中,侦听消息并将其代理到聊天室(如果是您的活动):

    ...
    window.addEventListener("message", function(event){
        if(event.data.hasOwnProperty("event") && event.data.event == "chatMessage")
        {
            App.__container__.lookup('controller:chat').currentRoom.tmiRoom.sendMessage(event.data.value);
        }
    });
    ...
    
    就这些!:)

    阅读更多
    Chrome content scripts docs about cross page comminication:

    发生此错误的原因是
    content\u script
    WEB page
    具有一些DOM层,但具有不同的JavaScript上下文,因此无法从
    content\u script
    访问网页的JavaScript对象

    你可以通过这种方式做你想做的事情:

  • 注入页面
    代理
    脚本,该脚本将在页面的JS上下文中工作,并从
    内容脚本
    中侦听自定义事件
  • 将带有消息的自定义消息从
    content\u script
    发送到页面的侦听器
  • 运行你的
    应用程序。_容器__.lookup('controller:chat').currentRoom.tmiRoom.sendMessage('testmessage')内容\u脚本的消息时的侦听器中的code>
  • 不幸的是,从你的问题中,我不明白你想用什么方式输入你想发送的聊天信息,所以我将举几个例子来说明如何发送固定消息

    一步一步地 定义
    content\u脚本
    并使
    proxy.js
    web可在manifest.js中访问:

    content\u脚本中
    runner.js将
    proxy.js
    注入页面并向其发送消息:

    ...
    var inject = document.createElement("script");
    inject.src=chrome.extension.getURL("proxy.js");
    (document.head||document.documentElement).appendChild(inject);
    
    
    // replace it with your code which sends message to the proxy, now for example it sends "Hi!" message for every second
    setInterval('window.postMessage({"event":"chatMessage","value":"Hi!"},"*");',1000);
    ...
    
    在proxy.js中,侦听消息并将其代理到聊天室(如果是您的活动):

    ...
    window.addEventListener("message", function(event){
        if(event.data.hasOwnProperty("event") && event.data.event == "chatMessage")
        {
            App.__container__.lookup('controller:chat').currentRoom.tmiRoom.sendMessage(event.data.value);
        }
    });
    ...
    
    就这些!:)

    阅读更多
    Chrome内容脚本文档关于跨页面通信:

    请查看您的
    setTimeout
    code立即执行
    main()
    ,而不是在延迟后执行。您应该在不使用
    ()
    的情况下使用
    main
    。当前,您告诉它执行通过立即执行
    main()
    返回的函数。我用于测试页面设置时间问题的一种方法是从按钮触发相关代码。在测试中这样做允许您直接控制代码的执行时间。显然,如果这是一个时间问题,那么您将需要确定一种编程方法来等待您需要的可用内容。一种简单的方法是使用
    setTimeout
    循环,反复检查是否定义了
    App
    ,如果没有定义,则继续执行,然后设置另一个超时。也许最好是观察提供代码/信息的请求的完成情况。请参阅
    setTimeout
    code立即执行
    main()
    ,而不是在延迟后执行。您应该在不使用
    ()
    的情况下使用
    main
    。当前,您告诉它执行通过立即执行
    main()
    返回的函数。我用于测试页面设置时间问题的一种方法是从按钮触发相关代码。在测试中这样做允许您直接控制代码的执行时间。显然,如果这是一个时间问题,那么您将需要确定一种编程方法来等待您需要的可用内容。一种简单的方法是使用
    setTimeout
    循环,反复检查是否定义了
    App
    ,如果没有定义,则继续执行,然后设置另一个超时。也许最好是观察提供代码/信息的请求的完成情况。