#1 - 2019-9-2 06:49
chitanda@Lv2 (小圣杯推荐码 261227#122769 ,填了各有1w资金。 ... .. ...)
RT。简单点来说,想写个小圣杯的插件,但是现在遇到个问题:
我想在个人主页的小圣杯tab里添加一个按钮。
效果如图:

这需要小圣杯本身的组件XHR先执行完成,但是正常情况下两个组件都是加载完成后就开始执行了,结果我的脚本就会因为找不到小圣杯相关的HTML DOM元素而执行失败,无法添加按钮


我自己的解决方法有2个:
1.用“setTimeout”来强行延迟我自身组件的开始执行时间,但是过于粗暴,而低网速环境下还是会提前执行。
2.将按钮上移,从小圣杯相关的DOM里迁移至BGM原先的页面元素中,这样的话无论如何一开始都能将按钮添加完成,同时将是否运行组件的时机交了给用户自己判断。但是这种方法会让UI有一种割裂感。

所以想问下各位有什么更好解决之道吗?毕竟JS我也就会一点点,很多新特性都没了解过

update:
目前采用的是#3提供的“MutationObserver”方法,自己这边低网速和高网速的情况下测试了貌似效果才行,虽然偶尔有监控不到的情况,不过准备先这样了。(bgm38)
#2 - 2019-9-2 07:33
(站外点格子工具 https://bgm.tv/group/topic/346446 . ...)
用setInterval和clearInterval定时检查另一个组件是否已经被成功加载,(判断对应dom元素是否存在),然后在自己组件的同步逻辑结束后clearInterval避免重复加载自己的组件
#2-1 - 2019-9-2 07:43
chitanda@Lv2
这个方案我不是很喜欢的原因其实和第一个类似,本质上没什么太大区别。其实我是想问问promise之类的特性可以解决这个问题吗?
#2-2 - 2019-9-2 07:57
Trim21
chitanda@Lv2 说: 这个方案我不是很喜欢的原因其实和第一个类似,本质上没什么太大区别。其实我是想问问promise之类的特性可以解决这个问题吗?
以我的js知识水平想不到…
#2-3 - 2019-9-2 08:03
chitanda@Lv2
Trim21 说: 以我的js知识水平想不到…
晕= =不过还是先谢谢啦,我等下看看有没有其他人有别的思路
#2-4 - 2019-9-2 08:09
Trim21
chitanda@Lv2 说: 晕= =不过还是先谢谢啦,我等下看看有没有其他人有别的思路
如果不想轮询就只能通过某个事件得知组件是否被成功加载, 比如检测dom修改, 或者py开发者让他在组件的结束调用某个函数...其实都不如轮询来得简单...
#3 - 2019-9-2 08:59
(-Wish upon a Shooting Star-)
#3-1 - 2019-9-2 09:28
rnono
Intersection 如果能监测小圣杯DOM 感觉可行?
#3-2 - 2019-9-2 09:43
#3-3 - 2019-9-2 09:57
chitanda@Lv2
rnono 说: Intersection 如果能监测小圣杯DOM 感觉可行?
第一个看了下案例感觉有点复杂,而且貌似还是草案;后面的“MutationObserver”试了下倒是不错。虽然偶尔还是会有监视不到的情况发生,不过很少遇到。准备就用这个了。
#3-4 - 2019-9-2 09:57
chitanda@Lv2
MutationObserver效果还可以,谢谢大佬
#4 - 2019-9-2 09:39
之前我写userscript的时候使用过 waitForKeyElements.js ,但其实质还是setInterval
#4-1 - 2019-9-2 09:58
chitanda@Lv2
setinterval就是感觉有点暴力所以有点抗拒,虽然我去搜的时候也有看到有些人因为observe的性能转投setinterval的。。
#5 - 2019-9-2 09:48
(プリキュアなりたい)
可以请原作者写一个自定义事件放到window上,甚至多写几个实现生命周期。比如圣杯加载完成触发,开启交易触发等等
#5-1 - 2019-9-2 09:59
chitanda@Lv2
这个就有点麻烦了bgm38。641现在bug都修不完,肯定没时间给我做这种接口
#5-2 - 2019-9-2 10:49
CureDovahkinn🤔
chitanda@Lv2 说: 这个就有点麻烦了bgm38。641现在bug都修不完,肯定没时间给我做这种接口
只加一个自定事件就是代码结尾加几行,不影响其他东西