Tampermonkey 脚本看不到 ajax 加载的影子根(打开)元素

Tampermonkey script does not see shadow-root (open) elements loaded by ajax

提问人:bakedmcgaked 提问时间:4/12/2023 最后编辑:bakedmcgaked 更新时间:4/13/2023 访问量:192

问:

我正在尝试在 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;

  1. 如何让 Tampermonkey 脚本查看通过 ajax 加载到主应用程序窗口中的元素?#shadow-root (open)
  2. 是否有任何特定的 Tampermonkey Run at(document-start、document-body、document-end、document-idle 或 context-menu)设置更适合 ajax 网站?我希望它无需手动右键单击即可工作,并在每次到达相应页面后运行脚本。
jquery ajax jquery-selectors tampermonkey shadow-dom

评论

0赞 double-beep 4/13/2023
嗨,欢迎来到 Stack Overflow!我想影子根元素被包装在另一个元素中 - 父元素的外部 HTML 是什么?

答: 暂无答案