Tampermonkey 中未定义的函数

Function not defined in Tampermonkey

我有下面的代码,但是当我点击按钮时,它找不到所需的功能。我不太擅长示波器,所以我认为这与此有关。

在此之前,我将其设置为 var name = function 并且一直有效,直到我需要使用 GM_setValue(尚未定义,但稍后会定义)。

// ==UserScript==
// @name         Futbin Extractor
// @namespace    http://tampermonkey.net/
// @version      0.1
// @description  try to take over the world!
// @author       You
// @match        https://www.futbin.com/players
// @grant        GM_getValue, GM_setValue
// ==/UserScript==

/* global $ */

(function() {
    'use strict';

//defining all the variables


    function extract (e) {
//all the stuff in this function
    }


    function startExtractor () {
        console.log('Starting Extractor');
        extractorRunning = true;

        $('.player_tr_1').each(function () {
            extract(this);
        });

        $('.player_tr_2').each(function () {
            extract(this);
        });
    };

    function siteSetup () {
        var newBox = '<div id="fiddleBar"><button "startButton" onClick="startExtractor();">Test</button></div>';
        $(newBox).insertBefore('#repTb');
    }



    if (!$('#fiddleBar')) {
        siteSetup;
    } else {
        console.log('Repeating Site Setup');
        setTimeout(siteSetup,100);
    }

})();

这里有几个问题需要解决。首先,您可以将两个 .player_tr_1.player_tr_2 选择器连接到一个 jQuery 对象中一起循环。此外 if (!$('#fiddleBar')) 永远不会命中,因为 jQuery 对象总是强制为真。如果您想知道元素是否存在于 DOM.

中,请使用 length 属性

关于您的问题,内联事件属性(例如 onclick)需要在全局范围内声明该函数。这是它们是不良做法的部分原因,应该避免。而是使用委托事件处理程序,如下所示:

(function() {
  'use strict';
  
  function extract(e) {
    // all the stuff in this function
  }

  function startExtractor() {
    console.log('Starting Extractor');
    extractorRunning = true;

    $('.player_tr_1, .player_tr_2').each(function() {
      extract(this);
    });
  };
  
  $(document).on('click', '.startButton', function() {
    startExtractor();
  }); 

  function siteSetup() {
    var newBox = '<div id="fiddleBar"><button class="startButton">Test</button></div>';
    $(newBox).insertBefore('#repTb');
  }

  if (!$('#fiddleBar').length) {
    siteSetup();
  } else {
    console.log('Repeating Site Setup');
    setTimeout(siteSetup, 100);
  }
})();