我正在尝试为自举插件动态创建一个关键元素。当前,我创建一个keyset
元素,并将其附加到带有document.getElementById('mainKeyset').parentNode
的appendChild()
中,然后创建key
元素(myKey
),并将其附加到keyset
中。我设置了key
的id
,modifiers
和key
属性,然后执行myKey.addEventListener('command', function() {myFunction()});
将功能添加到key
中。之后,我可以通过执行myFunction()
来成功调用myKey.doCommand()
。但是,当我按下在key
属性中分配的修饰符和键时,什么也没有发生。
我试图避免设置command
和oncommand
属性,因为我知道动态设置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);
-因此,在那里没有问题。