我正在尝试为自举插件动态创建一个关键元素。当前,我创建一个keyset元素,并将其附加到带有document.getElementById('mainKeyset').parentNodeappendChild()中,然后创建key元素(myKey),并将其附加到keyset中。我设置了keyidmodifierskey属性,然后执行myKey.addEventListener('command', function() {myFunction()});将功能添加到key中。之后,我可以通过执行myFunction()来成功调用myKey.doCommand()。但是,当我按下在key属性中分配的修饰符和键时,什么也没有发生。

我试图避免设置commandoncommand属性,因为我知道动态设置oncommand存在安全问题,但也许我确实需要以某种方式使用它们?我有seen it stated,如果没有命令或oncommand设置,键将无法使用,因此,如果不设置它们之一就无法动态创建键。如果将oncommand设置为“void(0);”,我的事件侦听器将起作用。 (以下示例给出here)。但是,我不知道这样的事情能否通过Mozilla的扩展程序批准过程。

最佳答案

关于需要<key>command属性的oncommand元素的陈述是正确的。查看code triggering key handlers,它具有优化功能,该优化将忽略任何已禁用或没有<key>command属性的oncommand元素-因此command事件甚至不会触发这些元素。我通过添加一个包含JavaScript注释的虚拟oncommand属性来解决此问题:

key.setAttribute("oncommand", "//");

但是void(0);当然也可以作为属性值。

对此进行审核不会有任何问题。您听说过的潜在安全问题是动态生成oncommand值,例如:

key.setAttribute("oncommand", "foo('" + bar + "')");

根据bar的值(尤其是当bar来自网站时),这可能非常危险。但是,您不会动态生成属性值,在您的情况下,它始终是void(0);-因此,在那里没有问题。

08-18 23:57