提问人:bakedmcgaked 提问时间:4/12/2023 最后编辑:bakedmcgaked 更新时间:4/13/2023 访问量:192
Tampermonkey 脚本看不到 ajax 加载的影子根(打开)元素
Tampermonkey script does not see shadow-root (open) elements loaded by ajax
问:
我正在尝试在 Chrome 中为我在工作中一直使用的网站编写一个 Tampermonkey 脚本。我希望脚本删除某个类或标题的按钮上的 disabled 属性。在我看来,这似乎是一项非常简单的任务,但由于该网站大量使用 Ajax,我遇到了一堵砖墙。
当我第一次加载网站时,有一个标题、一个左侧边栏,占据屏幕其余部分的主应用程序窗口是空白的。
用户将单击标题或侧边栏中的可用选项之一,然后通过ajax将内容加载到主应用程序窗口中。主应用程序窗口有一个标题,其中包含出现新选项卡的选项卡,我可以在打开的选项卡和关闭选项卡之间切换。主应用程序窗口主体是所有内容出现的地方,并且有许多不同的格式,具体取决于我正在处理的内容。
我已经能够成功地为标题和侧边栏中出现的按钮执行选择器并禁用/启用它们。
编辑:我今天玩了一会儿,意识到在HTML包含的几个地方,所以我开始研究这是什么。直到我今天做了一些研究,我才知道影子 DOM 树是与主文档 DOM 树分开渲染的。这是有道理的,为什么它没有触发我的函数。我做了一些进一步的测试,并能够在第一次出现 .#shadow-root (open)
#shadow-root (open)
到目前为止,这是我的 Tampermonkey 脚本,它需要 JQuery 和 waitForKeyElements(),我通过有关 ajax 内容的堆栈溢出的其他问题发现了这些脚本:
// ==Userscript==
// @name Enable buttons
// @match my.website.url.org
// @require https://code.jquery.com/jquery-3.6.4.min.js
// @require https://gist.github.com/raw/2625891/waitForKeyElements.js
// @grant GM_addStyle
// @version 0.1
// ==/Userscript==
(function() {
waitForKeyElements ('button.btn.ripple.primary', modifyButtons, false);
function modifyButtons(jNode) {
console.log ("~~~~~~~~ Button has been encountered ~~~~~~~~");
var buttons = document.querySelectorAll('button.btn.ripple.primary');
for (var i=0; i<buttons.length; i++) {
buttons[i].disabled = false;
console.log(i + " buttons touched and enabled.");
}
}
})();
这是我尝试修改的按钮的 HTML:
#shadow-root (open)
<!---->
<button type="button" title="Create" class="btn ripple primary" disabled>
<span>Create</span>
</button>
<!---->
我也试过:
waitForKeyElements ('button[title="Create"]', modifyButtons, false);
这些都不会触发 modifyButtons 函数,即使我通过右键单击菜单进入正确的页面后手动运行脚本。
标题和侧边栏中有一些按钮,我已经成功地触发了modifyButtons函数来测试我的脚本。以下是其中一个侧边栏按钮的 HTML:
<button title="Search" class="pull-right blue__btn sat-stroked-button">
<span class="sat-button-wrapper">
Search
</span>
</button>
这些类的侧边栏中有六个按钮,我能够使用以下命令在所有六个按钮上触发 modifyButtons 函数:
waitForKeyElements ('button.pull-right.blue__btn.sat-stroked-button', modifyButtons, false);
我能够通过以下方式在侧边栏中的一个特定按钮上触发 modifyButtons 函数:
waitForKeyElements ('button[title="Search"]', modifyButtons, false);
在那之后,我已经搞砸了,当我让它在侧边栏的按钮上触发时,它完成了我需要它完成的任务。在这个阶段,我只需要它来实际查看和触发主应用程序窗口中的按钮。buttons[i].disabled = false;
buttons[i].disabled = true;
- 如何让 Tampermonkey 脚本查看通过 ajax 加载到主应用程序窗口中的元素?
#shadow-root (open)
- 是否有任何特定的 Tampermonkey Run at(document-start、document-body、document-end、document-idle 或 context-menu)设置更适合 ajax 网站?我希望它无需手动右键单击即可工作,并在每次到达相应页面后运行脚本。
答: 暂无答案
评论