Javascript Chrome扩展内容脚本-应用程序未在Ember站点上定义
我正在为频道编写一个简单的Google Chrome扩展。 我唯一需要的功能是发送聊天信息,最好不用显式使用聊天文本框和按钮 通过查看的源代码,我找到了负责发送聊天信息的函数: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
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')从1接收来自内容\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')从1接收来自内容\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
,如果没有定义,则继续执行,然后设置另一个超时。也许最好是观察提供代码/信息的请求的完成情况。