在一个间隔中调用的函数后运行函数?

时间:2015-05-01 14:28:20

标签: javascript jquery greasemonkey

我正在制作Greasemonkey脚本,我发现了一个问题。该网站有一个间隔运行的功能:

jQuery(function1.run);
setInterval(function1.run, function1.interval);

我想在function1.run间隔结束后立即运行我的函数。我无法改变网站代码中的任何内容,因此我只能依赖于我将添加的内容。

到目前为止,我尝试的所有内容都只调用了一次。

1 个答案:

答案 0 :(得分:1)

  

我想在function1.run间隔完成后立即运行我的函数。我无法更改网站代码中的任何内容

可靠地做到这一点很棘手。您可以设置自己的函数间隔运行(通过将函数传递给setInterval),如果你的间隔小于他们的间隔,你应该保证你的功能在他们打电话之前至少会被召唤一次(有时是两次),但你不能确定它会在他们之后立即

一些想法:

  1. 只是让你的计时器间隔比他们的少;它们的功能运行与你的功能之间仍然存在显着延迟:

    例如(最多运行30秒):

  2. // Their function: Once a second
    var theirs = setInterval(function() {
      snippet.log("Theirs");
    }, 1000);
    
    // Your function: Once every 9/10ths of a second
    var yours = setInterval(function() {
      snippet.log("Yours");
    }, 900);
    
    setTimeout(function() {
      snippet.log("Stopping");
      clearInterval(theirs);
      clearInterval(yours);
    }, 30000);
    <!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
    <script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>

    1. 如果 他们的功能运行效果是你可以在你的功能中测试的(所以你知道你的功能是否已经运行,因为他们上次执行了),你可以安排你的经常运行,但如果他们没有在此期间运行则不做任何事情。将你的函数的间隔设置为你愿意在他们的运行和你的运行之间通过的最长时间。

      示例:

    2. var theyran = false;
      
      // Their function: Once a second
      var theirs = setInterval(function() {
        snippet.log("Theirs");
        theyran = true;
      }, 1000);
      
      // Your function: 20 times a second
      var yours = setInterval(function() {
        if (theyran) {
          theyran = false;
          snippet.log("Yours");
        }
      }, 50);
      
      setTimeout(function() {
        snippet.log("Stopping");
        clearInterval(theirs);
        clearInterval(yours);
      }, 30000);
      <!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
      <script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>

      1. 如果 他们的功能可以收到您的通知,您可以使用该通知来调用您的功能。例如,在现代浏览器中,如果它以某种方式修改DOM,您可以使用mutation observers接收该修改的通知(在较旧的浏览器上,您可以使用模拟突变观察者的库)使用旧的变异事件):

        示例:

      2. // Their function: Once a second
        var theirs = setInterval(function() {
          document.getElementById("content").innerHTML =
            "Theirs at " + new Date();
          snippet.log("Theirs");
        }, 1000);
        
        // Your function: Run by a mutation observer
        var ob = new MutationObserver(function() {
          snippet.log("Yours");
        });
        ob.observe(document.getElementById("content"), {
          subtree: true,
          childList: true,
          characterData: true
        });
        
        setTimeout(function() {
          snippet.log("Stopping");
          clearInterval(theirs);
        }, 30000);
        <div id="content">
          In this scenario, their function modifies this div.
        </div>
        <!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
        <script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>