Javascript 我应该为这个脚本选择哪个元素?或者它可以等到装载完所有东西后再进行?
我编写了这个简单的代码,以单击几个下载链接中的第一个下载链接。Javascript 我应该为这个脚本选择哪个元素?或者它可以等到装载完所有东西后再进行?,javascript,tampermonkey,Javascript,Tampermonkey,我编写了这个简单的代码,以单击几个下载链接中的第一个下载链接。 问题是我必须等待下载链接出现(有一些转换过程)。我做了一个测试,它们显示得比Load或domcontentload晚得多。(顺便问一下,有没有办法描述像这种情况下加载所有东西的真正目的?) 下面是一个示例链接: 无论如何,首先我组装了一个等待30秒的代码,然后为我点击链接,它工作了,我得到了正确的目标链接! 但互联网连接速度各不相同,30秒并不完美,所以现在我想要一个代码,当链接出现时自动点击下载链接。代码如下: /==U
问题是我必须等待下载链接出现(有一些转换过程)。我做了一个测试,它们显示得比Load或
domcontentload
晚得多。(顺便问一下,有没有办法描述像这种情况下加载所有东西的真正目的?)
下面是一个示例链接:无论如何,首先我组装了一个等待30秒的代码,然后为我点击链接,它工作了,我得到了正确的目标链接! 但互联网连接速度各不相同,30秒并不完美,所以现在我想要一个代码,当链接出现时自动点击下载链接。代码如下:
/==UserScript==
//@name saveoffline单击第一种格式
//@包括https://www.saveoffline.com/*
//@grant none
变量x=0
函数waitforgrab(){
//1200=等待10分钟/500毫秒
如果(x>1200)stopthere();//请使用错误的函数停止此js。
如果(document.getElementById(“output”)==null){//我必须选择正确的元素来描述出现的下载链接。
x=x+1
设置超时(waitforgrab(),500)
}
}
waitforgrab();
//以上几行:等待下载链接出现。
//下一行:单击第一个链接。这句话证明是正确的。
document.getElementById(“媒体格式”).firstElementChild.click();
测试结果:
错误:执行脚本“saveoffline单击第一种格式”失败!无法读取null的属性“click”
那么,我选择了错误的元素虽然这个元素不是空的,但这并不意味着下载链接会出现?但我尝试了4或5种元素,只是不正确
请帮我找到这个“正确”的元素。或者,也许我可以简单地单击目标下载链接来描述所有内容的真正负载结束
使用类似于
waitForKeyElements
或MutationObserver
的方法document.getElementById(“媒体格式”)
立即激发,而不是在setTimeout
s之后// ==UserScript==
// @name Saveoffline, click the first download format
// @match https://www.saveoffline.com/*
// @require https://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js
// @require https://gist.github.com/raw/2625891/waitForKeyElements.js
// @grant GM_addStyle
// @grant GM.getValue
// ==/UserScript==
//- The @grant directives are needed to restore the proper sandbox.
/* global $, waitForKeyElements */
waitForKeyElements ("#media-formats > a > .formatButton", clickNode, true);
function clickNode (jNode) {
//- The buttons are loaded in reverse order, so ensure we have the first child.
var frstNode = jNode.parent ().siblings ().first ().children (".formatButton");
var clickEvent = document.createEvent ('MouseEvents');
clickEvent.initEvent ('click', true, true);
frstNode[0].dispatchEvent (clickEvent);
}
使用类似于
waitForKeyElements
或MutationObserver
的方法document.getElementById(“媒体格式”)
立即激发,而不是在setTimeout
s之后// ==UserScript==
// @name Saveoffline, click the first download format
// @match https://www.saveoffline.com/*
// @require https://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js
// @require https://gist.github.com/raw/2625891/waitForKeyElements.js
// @grant GM_addStyle
// @grant GM.getValue
// ==/UserScript==
//- The @grant directives are needed to restore the proper sandbox.
/* global $, waitForKeyElements */
waitForKeyElements ("#media-formats > a > .formatButton", clickNode, true);
function clickNode (jNode) {
//- The buttons are loaded in reverse order, so ensure we have the first child.
var frstNode = jNode.parent ().siblings ().first ().children (".formatButton");
var clickEvent = document.createEvent ('MouseEvents');
clickEvent.initEvent ('click', true, true);
frstNode[0].dispatchEvent (clickEvent);
}
setTimeout(waitforgrab(),500)
没有意义waitforgrab
不返回函数,因此它应该是setTimeout(waitforgrab,500)
。#output
元素与#media formats
元素有什么关系?您似乎没有试图对#output
元素执行任何操作,为什么要检查它?@CertainPerformance谢谢您的帮助。这是因为目标链接是某个元素的子元素,不知道如何描述它,所以我尝试使用包含所有链接的块,此外,在加载的早期阶段,此块不存在。为什么不测试是否存在#媒体格式
,或者类似于#媒体格式>div:first child
,而不是#output
?考虑到你想做的,这似乎更符合逻辑achieve@CertainPerformance刚才我尝试了“document.getElementById(“媒体格式”).firstElementChild==null”,但仍然得到“无法读取null的属性‘click’”。setTimeout(waitforgrab(),500)
没有意义waitforgrab
不返回函数,因此它应该是setTimeout(waitforgrab,500)
。#output
元素与#media formats
元素有什么关系?您似乎没有试图对#output
元素执行任何操作,为什么要检查它?@CertainPerformance谢谢您的帮助。这是因为目标链接是某个元素的子元素,不知道如何描述它,所以我尝试使用包含所有链接的块,此外,在加载的早期阶段,此块不存在。为什么不测试是否存在#媒体格式
,或者类似于#媒体格式>div:first child
,而不是#output
?考虑到你想做的,这似乎更符合逻辑achieve@CertainPerformance刚才我试过“document.getElementById(“媒体格式”).firstElementChild==null”,仍然得到“无法读取null的属性‘click’”。谢谢!!!我发现这个jquery方法将单击这些下载链接中的最后一个链接,因此我将clickNode函数的内容替换为“document.getElementById(“媒体格式”).firstElementChild.click();”并且它可以工作。但是我应该如何用jquery的方式修复它呢?请参阅更新的答案。但是,如果您当前的方法有效,它也是可以接受的。jQuery很好,但是不需要为了使用它而使用它。()谢谢!!!我不知道