【发布时间】:2017-09-04 02:47:53
【问题描述】:
以下脚本旨在在 facebook.com 的对话页面(用户可以查看其所有对话的页面)上运行。
该脚本的目的是自动化“删除对话”过程,该过程自然包括 4 次点击,当您有数百个对话时可能会很烦人且浪费时间 --- 删除将通过按“D”键从键盘完成。
我用 Greasemonkey 运行脚本。
脚本由 4 个主要部分组成:
- 收听所有“D”键击事件。
- 点击打开带有“删除”选项的模态的链接(小链轮)。
- 单击该模式中的“删除”链接(它将打开第二个模式“删除确认”)。
- 点击该模式中新的“删除”链接,以确认对话删除。
我的脚本
document.addEventListener('keydown', (k)=>{
if ( k.keyCode === 68 ) {
console.log('keydown: D');
return dC();
}
});
let dC = ()=>{
document.querySelector('._5blh._4-0h').click();
document.querySelector('.uiContextualLayer > [id^="js"] > div > ul > li:nth-child(4)').click();
setTimeout(()=>{ document.querySelector('._3quh._30yy._2t_._3ay_._5ixy').click(); }, 500);
};
作为一个初学者,我尝试将部分代码放入函数中,我尝试使用for 而不是forEach() 进行迭代,我尝试在dC() 调用下使用return dC() 或return false。所有这些都产生了相同的结果,所以我绕着圈子不理解(或否认)我非常想念的更深层次的逻辑错误。
复制
安装为 Greasemonkey 脚本,(匹配为 https:www.facebook.com/* 仅用于测试),进入对话页面并点击“D”。
我的问题
为什么事件只被监听一次?也就是说,为什么单击 D 一次会使脚本工作,但任何进一步的单击都无济于事?
我必须刷新页面才能重用脚本,这不是预期的行为。
注意:我更喜欢原版解决方案。
【问题讨论】:
-
如果
document.querySelector(' ._5blh._4-0h ')没有找到任何东西,那么脚本的其余部分将不会运行,因为document.querySelector(' ._5blh._4-0h ').click();抛出的错误 -
我发誓它会为我找到并打开模态...
-
哦,我不是说这是你的问题,我是说如果失败了,那么下面的代码甚至不会运行 - 你检查过 developer 工具了吗控制台是否有任何错误?
-
是的,好几次。那里没有错误 - 事实上,如果我单击“D”并移动直到卡在第 2 段,但在控制台中运行第 3 段 --- 它可以工作(对话被删除)......但我仍然可以'点击“D”时重用脚本。
-
你肯定在这段代码或其他地方有一个错误......或者点击正在触发,但也许对话并没有真正删除(即删除)而是隐藏在 DOM 中,所以之后第一个 keydown 看起来什么都没有发生,但事件仍在隐藏元素上触发。请参阅:jsfiddle.net/wmvLv7jL 您可以按住 D 键或多次按下它 - 它显然有效。
标签: javascript loops events keyboard-shortcuts