javascript - 注入(inject)时 Jquery 对话框无法正确显示

标签 javascript jquery html css google-chrome-extension

我正在制作一个 Chrome 扩展程序,并尝试在用户单击页面上的元素时注入(inject) Jquery。当我尝试通过 Jquery 创建对话框时:

var box = document.createElement('div');
box.id = 'box'
box.title = 'hello'
document.body.appendChild(box);

然后

$("#box").dialog();

仅显示关闭按钮及其旁边的文本。我不确定为什么它不显示完整的对话框。奇怪的是,它也因站点而异。因此,如果我加载 SO 并调用对话框,则会出现:

close button screenshot

但是如果我加载 reddit,则会出现:

close button screenshot

注入(inject)的对话框似乎继承了我将其注入(inject)的网站的属性。我想注入(inject)它并让它显示默认框(如果可能的话)。它真正显示默认框的唯一一次是我将其注入(inject)到他们提供的 Jquery index.html 示例页面中:

website screenshot

我的扩展目录中有 jquery-ui.min.css、jquery-ui.min.js 和 jquery.min.js。当我尝试加载他们的示例页面并在那里注入(inject)对话框时,它起作用,但在其他网站上不起作用。如果有人可以帮助解决这个问题,我将非常感激。

谢谢

最佳答案

将样式与页面完全隔离的唯一方法是使用 Shadow DOM(Chrome 于 2013 年推出)。您还可以使用 Dialog 元素,因此甚至不需要 Jquery。

let shadow
try {
 shadow = document.body.attachShadow({ mode: "open" })
 shadow.appendChild(document.createElement("slot"))
} catch(error) {
 shadow = document.body.createShadowRoot()
 shadow.appendChild(document.createElement("content"))
}
let dialog = document.createElement("dialog")
dialog.innerHTML = `
 Test Dialog<br><br>
 <button>Close</button>
`
shadow.appendChild(dialog)
dialog.querySelector("button").addEventListener("click", function() {
 dialog.remove()
})
dialog.showModal() //or show()

引用文献:

https://developer.mozilla.org/en-US/docs/Web/Web_Components/Shadow_DOM https://developer.mozilla.org/en-US/docs/Web/HTML/Element/dialog https://developers.google.com/web/fundamentals/getting-started/primers/shadowdom https://developers.google.com/web/updates/2013/09/dialog-element-Modals-made-easy

关于javascript - 注入(inject)时 Jquery 对话框无法正确显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43037157/

相关文章:

javascript - 禁用提交按钮

javascript - 需要将光标位置设置到 contentEditable div 的末尾,选择和范围对象问题

javascript - 如何解析大数据?

c# - 无法将 Json 对象反序列化为字典

html - 如何使子 div 始终适合父 div?

javascript - 如何在 Angular 中使用表单名称来获取输入数据?

javascript - rails : How to loading Animations with jQuery UJS in form submit button?

php - 通过 Ajax 从 Woocommerce 中的购物车商品数据中获取重命名的购物车商品名称

html - HTML和CSS中的单独div

css - 每个 div 的底部添加 5px 额外边距