我有一个 chrome 扩展,它将一个 Shadow dom 元素注入到页面中以保持 css 分离。但是我需要从内容脚本将 onclick 绑定到 Shadow dom 中的某些元素,因为我需要能够通过单击 Shadow dom 中的元素来调用内容脚本中的函数。
我尝试在模板元素和实际的 Shadow dom 元素上使用 .bind('click', function(){}) ,但我似乎无法访问它们。这可能吗?
尝试查询元素的shadowRoot。换句话说,假设您有一个元素
<super-ultra-element>
,并且在该元素的 Shadow dom 内是一个类为“potato”的 div,您希望将点击处理程序附加到该 div。
您应该能够通过首先获取元素的shadowRoot来做到这一点:
var superUltraRoot = document.querySelector('super-ultra-element').shadowRoot;
。
一旦有了shadowRoot,您就可以查询元素的shadow dom来查找您关心的项目:
var potatoDiv = superUltraRoot.querySelector('.potato');
。
您现在已经有了对尝试添加点击处理程序的元素的引用,因此这样做应该相当容易:
potatoDiv.addEventListener('click', someClickCallback);
我尝试在两个上使用 .bind('click', function(){}) 模板元素中的元素
以及实际的 Shadow dom 元素,但我似乎无法访问它们
所以,你有2个选择:
例如:
$( "#list" ).on( "click", "a", function( event ) {
event.preventDefault();
console.log( $( this ).text() );
});
我正在使用 Jquery
find
和 on
函数的替代方法,请在此处尝试我的代码片段。
$("#CreateShadowRoot").on('click', function (event) {
const shadowDiv = document.getElementById('ShadowDiv');
const shadowRoot = shadowDiv.attachShadow({ mode: 'open' });
const jQueryScript = document.createElement('script');
jQueryScript.src = 'https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js';
shadowRoot.appendChild(jQueryScript);
shadowRoot.innerHTML += '<button id="example-action">Im inside ShadowRoot</button>';
function initShadowDOM() {
// Get the Shadow DOM root element
// Attach a click event listener using jQuery
$(shadowRoot).find("#example-action").on('click', function (event) {
// Handle the click event within the Shadow DOM
// You can access the event object and perform actions here
console.log('Event received');
});
}
jQueryScript.onload = function () {
// jQuery is now loaded and ready to use
// You can use jQuery event listeners like .on() here
initShadowDOM(); // Call a function to set up the Shadow DOM content and event listeners
};
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<button id="CreateShadowRoot">Create ShadowRoot</button>
<div id="ShadowDiv"></div>