Function JavaScript between popup.html and popup.js in chrome extension (taking into account message from Backrgound)
我想通过点击一个innerhtml中的按钮来执行chrome扩展中的函数(在popup.js中)。
popup.html中的代码是:
1 2 3 4 5 6 7 8 9
< html>
< head>
< script src= "popup.js" >
</ head>
< body>
</ body>
</ html>
popup.js中的我的代码:
1 2 3 4 5 6 7 8 9 10 11
chrome.runtime .onMessage .addListener ( function ( msg, sender, sendResponse) {
if ( msg.text === 'results' ) {
var panier_container = document.getElementById ( "panier_container" ) ;
var texte = "<button onclick=" toto( ) "> TOTO </button>" ;
panier_container.innerHTML = texte;
} ) ;
} ) ;
function toto( ) {
alert( "toto" ) ;
}
当我执行代码时,我看到了按钮"toto",但是当我点击按钮时,什么都没有发生。在chrome.runtime.onMessage.addListener(function (msg, sender, sendResponse) { 中,按钮执行功能。但里面没有。
你有主意吗?
控制台有什么错误吗?chrome://extensions中应该有一个错误按钮。
这可能是因为您不能在扩展中使用任何内联JS(onclick="toto()")。我想这就是你要找的答案。stackoverflow.com/a/13592045
多个问题。因此,有多个重复项:纯javascript相当于jquery的$.ready()如何在页/dom准备就绪时调用函数,$(document).ready相当于不使用jquery,而onclick在chrome扩展中不起作用
如果事实不同,因为我的问题出现在chrome.runtime.onmessage.addListener(函数(msg,sender,sendResponse)中{
@JeremyBergeret,很好,您已经更新了问题,使它不再是两个问题的副本,这两个问题处理的是,当您的代码运行时,页面的问题没有准备好(即,不等待DOMContentLoaded )。最重要的是,编辑并没有使您已经得到的答案无效,因为该答案解决了试图使用内联onclick 属性的问题,这也是第三个重复地址的问题。但是,请不要暗示我们错误地根据当时存在的问题和代码(即在您编辑之前)采取行动。
注意:我没有能力更改副本列表,或者考虑到问题中的更改,我会这样做。但是,如果这仍然是第三个重复目标的副本,那么它仍然应该作为副本关闭。
您应该查看弹出窗口的控制台。它会通知您,您违反了默认内容安全策略的限制。Chrome有各种各样的控制台供您扩展。您需要在所有适当的控制台中查找错误/输出。
我建议使用javascript dom函数而不是html onclick属性来附加函数。chrome扩展不允许在HTML中使用内联javascript,请参阅下面的问题和chrome开发人员文档。如果你给按钮一个类似ID的方便手柄,用.addClickListener() 代替它,会怎么样?
1 2 3 4 5 6 7 8
var panier_container = document.getElementById ( "panier_container" ) ;
var texte = "<button id='totoButton'> TOTO </button>" ;
panier_container.innerHTML = texte;
document.getElementById ( "totoButton" ) .addEventListener ( "click" , toto) ;
function toto( ) {
alert( "toto" ) ;
}
同样值得注意的是,您可能希望将您的 标记移动到 的末尾,或者给它一个async 属性,因为根据脚本标记的位置,#panier_container 可能还没有加载,请参阅这里的第一个答案以了解浏览器如何解释脚本标记。
谢谢你的回答,我只是更正了我的firts问题,因为当我在chrome.runtime.onmessage.addListener(函数(msg,sender,sendResponse)中时,问题就出现了。{
如果解决了使用内联HTML onclick 处理程序不起作用的原因(有关详细信息,请参阅第三个副本),那么这个答案会更好。
@Makyen,我在第三个副本中没有找到解决方案(chrome扩展中的onclick不起作用)。我更正了我的代码,然后放了一个ID,然后点击。但是在chrome.runtime.onmessage.addListener中,我看到弹出窗口上的按钮,但是如果我单击什么也不发生。如果我在chrome.runtime.onmessage.addListener之外放置了相同的按钮,那么当我单击该按钮时,就会出现toto。事实上,我不明白它为什么不工作,因为加载了DOM,所以我放入document.addEventListener('domcontentloaded',function()。{
@jeremybergeret,如第三个副本中所述,chrome扩展弹出窗口不工作,点击事件不处理(还有更多问题),不能使用内联javascript,包括像 TOTO </button> 这样的HTML。它不起作用。Chrome将报告错误。如果您正在查看弹出窗口的控制台,您将看到一个错误,说明这一点。您需要使用addEventListener() 从javascript添加事件侦听器。
我已经完成了:删除onclick并替换为"id"。我还添加了eventlisterner。我将在另一个主题中问我的问题,因为我的问题与现在的第一个不同
@真的,我已经相应地更新了答案。谢谢!
@jeremybergeret根据您更新的问题,您需要使用事件委托,因为在您调用getElementById() 尝试访问该按钮之前,不必创建该按钮。