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种元素,只是不正确

请帮我找到这个“正确”的元素。或者,也许我可以简单地单击目标下载链接来描述所有内容的真正负载结束

  • 不要重新发明轮子。正如您所发现的,在web上尝试猜测加载延迟是一种非常脆弱的方法。
    使用类似于
    waitForKeyElements
    MutationObserver
    的方法
  • document.getElementById(“媒体格式”)
    立即激发,而不是在
    setTimeout
    s之后
  • 该代码还有一些其他问题,请用如下所示的内容替换它
  • 在AJAX驱动的页面上,很少有方法“描述加载所有内容的真正目的”。如果有的话,它是高度特定于页面的,因此不值得依赖
  • 无论如何,由于您链接了目标页面,因此正确的选择器将显示在此完整工作脚本中:

    // ==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);
    }
    
  • 不要重新发明轮子。正如您所发现的,在web上尝试猜测加载延迟是一种非常脆弱的方法。
    使用类似于
    waitForKeyElements
    MutationObserver
    的方法
  • document.getElementById(“媒体格式”)
    立即激发,而不是在
    setTimeout
    s之后
  • 该代码还有一些其他问题,请用如下所示的内容替换它
  • 在AJAX驱动的页面上,很少有方法“描述加载所有内容的真正目的”。如果有的话,它是高度特定于页面的,因此不值得依赖
  • 无论如何,由于您链接了目标页面,因此正确的选择器将显示在此完整工作脚本中:

    // ==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很好,但是不需要为了使用它而使用它。()谢谢!!!我不知道