是否可以将事件侦听器绑定到外部脚本的阴影dom中的元素?

时间:2015-12-05 23:18:01

标签: javascript google-chrome dom content-script shadow-dom

我有一个chrome扩展,它将一个阴影dom元素注入页面以保持css分离。但是我需要将onclick绑定到内容脚本中阴影dom中的一些元素,因为我需要能够通过单击阴影dom中的元素来调用内容脚本中的函数。

我尝试在模板元素中的元素和实际的影子dom元素上使用.bind('click',function(){}),但我似乎无法访问它们。这可能吗?

2 个答案:

答案 0 :(得分:8)

尝试查询元素的shadowRoot。换句话说,假设你有一个元素<super-ultra-element>,并且在该元素的阴影中,dom是一个带有类&#39;土豆&#39;的div。您希望附加单击处理程序。

您应该可以通过首先获取元素的shadowRoot:var superUltraRoot = document.querySelector('super-ultra-element').shadowRoot;来实现此目的。

获得shadowRoot后,您可以查询元素的阴影dom以查找您关注的项目:var potatoDiv = superUltraRoot.querySelector('.potato');

您现在可以引用您尝试添加点击处理程序的元素,因此这样做应该相当简单:potatoDiv.addEventListener('click', someClickCallback);

答案 1 :(得分:0)

  

我尝试过使用.bind(&#39;点击&#39;,function(){})   模板元素中的元素

  1. 向模板添加事件监听器不会起作用。您绑定的元素应该是DOM的一部分。
  2.   

    和实际的影子dom元素,但我似乎无法访问它们

    1. 我不认为jquery能理解阴影根。如果你使用jquery来查询shadow-dom中的元素,我不认为它会返回一个节点(应该吗?)
    2. 所以,你有两个选择:

      1. 正如其他答案所建议的那样,你可以通过在shadow-root中查询eventlistener来绑定eventlistener,它可以通过元素上的shadowRoot属性访问。
      2. 或者,您可以使用jquery event-delegation将父级的事件侦听器(在本例中为shadow-dom的 host )与适当的选择器绑定。当事件将传播到父级时,将触发侦听器。
      3. 例如:

        $( "#list" ).on( "click", "a", function( event ) {
            event.preventDefault();
            console.log( $( this ).text() );
        });