首页 > 解决方案 > 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);
    }

})();

标签: javascriptjquerygreasemonkeytampermonkey

解决方案


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

关于您的问题,内联事件属性,例如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);
  }
})();

推荐阅读