如何让一些代码只在`.html`网页上运行?

时间:2015-07-19 22:57:21

标签: javascript jquery greasemonkey tampermonkey

我有一些我希望在mywebsite.com/x.html上运行的代码 (其中x可以是任何东西)。

以下代码(我希望)会在网页上找到ID为'mybutton'的按钮,并在延迟1秒后自动点击它:

<script>
  window.onload = function() {
      setTimeout('document.getElementById('mybutton').click()', 1000);
  }
</script>

我用Google搜索并找到了Tampermonkey Chrome扩展程序,但唯一的问题是我不知道如何仅在上面提到的特定网页上运行它。

我有点把我的代码打到了Tampermonkey给出的示例布局的末尾并得到了这个:

// ==UserScript==
// @name         My Fancy New Userscript
// @namespace    http://your.homepage/
// @version      0.1
// @description  enter something useful
// @author       You
// @match        http://website.com
// @grant        none
// ==/UserScript==

<script>
  window.onload = function() {
      setTimeout('document.getElementById('mybutton').click()', 1000);
  }
</script>

如何让它在开头提到的特定网页上运行?

3 个答案:

答案 0 :(得分:3)

有几件事:

  1. 将操作仅限于.html个页面,请检查location.pathname(见下文)
    或使用@include。 EG:

    // @include http://website.com/*.html
    

    为了精确度和性能,我建议使用@match以上@include

  2. @match指令的末尾,您几乎总是需要通配符。 EG:

    // @match http://website.com/*
    

    请注意,@include中的通配符更加灵活,但它们更安全且更安全。并在@match s。

  3. 中执行得更快
  4. 无法在用户脚本中添加直接HTML标记,如<script>。无论如何,在这种情况下根本不需要它。

  5. 您在用户脚本中很少需要window.onload在大多数情况下,默认情况下,用户脚本会在理想的时间点亮。

  6. 请勿使用&#34; eval&#34; setTimeout中的字符串。这有性能,故障排除和安全问题 - 如果它可以工作的话 问题的setTimeout使用了大部分问题,也存在语法错误。

  7. 直接.click()来电有时会有效,many times not 如果它不起作用,发送a click event

  8. 避免任意计时器。 EG:setTimeout(..., 1000);
    这是&#34;定时炸弹&#34;码。它有时会起作用。其他时候,页面将被延迟。当它工作时,它可能会使你的脚本减慢到远远超过必要的程度 使用an AJAX aware utility请参阅以下代码。

  9. 总而言之,使用jQuery和标准实用程序来节省工作并提高稳健性,您的脚本将是这样的:

    // ==UserScript==
    // @name     _Auto click the X button on Y pages
    // @match    http://website.com/*
    // @require  http://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js
    // @require  https://gist.github.com/raw/2625891/waitForKeyElements.js
    // @grant    GM_addStyle
    // ==/UserScript==
    /*- The @grant directive is needed to work around a design change
        introduced in GM 1.0.   It restores the sandbox.
    */
    
    //--- Does the *path* part of the URL end in `.html`?
    if (/\.html$/i.test (location.pathname) ) {
        waitForKeyElements ("#mybuttonID", clicktargetButton);
    
        function clicktargetButton (jNode) {
            var clickEvent  = document.createEvent ('MouseEvents');
            clickEvent.initEvent ('click', true, true);
            jNode[0].dispatchEvent (clickEvent);
        }
    }
    

答案 1 :(得分:1)

您可以使用星号作为外卡来定义Tampermonkey代码将运行的网页。
所以这使它适用于您网站的任何子目录:

// @match   http://www.mywebsite.com/*

要使其与html页面一起使用,请更改外卡:

// @match   http://www.mywebsite.com/*.html

答案 2 :(得分:0)

您可以使用以下代码通过纯javascript获取当前网址片段:

var url = window.location.pathname.split( '/' );

所以,如果你的链接是mywebsite.com/about,那将是url [1]

您可以定义要在其中执行代码的页面数组,然后使用当前URL检查

var url = window.location.pathname.split( '/' );
var pages = ['home', 'about', 'services'];

for(var i=0; i<pages.length; i++) {
    if(pages[i] === url[1]) {
        // execute your code
    }
}