停止功能,直到用户按下输入jQuery

时间:2018-07-15 18:14:07

标签: javascript jquery

我已经为此工作了好几天,但似乎找不到解决方法。

我希望该脚本等待,直到在将第一个值输入到字段中之后用户按下Enter键。我希望脚本在每次添加值时都继续执行此操作,但是我似乎不太了解如何执行此操作。

$(document).ready(function() {

  console.log("script loaded");

  var apiKey = "";
  var itemImage = $(".title-wrap img");
  var itemList = [];
  var i = 0;
  var addPage = false;

  // Run through all images and grab all item ID's.
  function scrapeItems() {
    itemImage.each(function() {
      var grabItemID = $(this).attr("src").match(/\d+/)[0];
      var disabled = $(this).closest("li.clearfix").hasClass("disabled");

      // Add item number as class for easy reference later.
      $(this).addClass("item-" + grabItemID);

      // If the item's row has "disabled" class, skip this item.
      if (disabled) {
        return true;
        scrapeItems();
      }

      // Add item to array.
      itemList.push(grabItemID);
    });
  }

  scrapeItems();

  // Call the API request function and start gathering all bazaar prices.
  function getPricing() {
    console.log("script started");

    $.each(itemList, function(key, value) {

      // Set three second timer per API request.
      setTimeout(function() {

        // Actual API request.
          return $.ajax({
            dataType: "json",
            url: "https://api.torn.com/market/" + value,
            data: {
              selections: "bazaar",
              key: apiKey
            },

            // When data is received, run this.
            success: function(data) {

              console.log(value + " request was successful");

                var cheapest = null;

                // Run through all results and return the cheapest.
                $.each(data["bazaar"], function(key, val) {
                  var cost = val["cost"];

                  if (cheapest == null || cost < cheapest) {
                    cheapest = cost;
                  }
                });

                var inputMoney = $(".item-" + value).closest("li.clearfix").find(".input-money:text");

                inputMoney.val(cheapest - 1).focus();
								
								
								
								
                // I WANT THE FUNCTION TO WAIT HERE UNTIL THE USER PRESSES ENTER
								
								
								

              },

            // When data is not received, run this.
            error: function() {
              console.log(value + " request was NOT successful");
            }
          });

      }, key * 3000);

    });
  }

  function checkPage() {
    var i = 0;
    var url = window.location.href;

    i++

    setTimeout(function() {
      if (url.indexOf("bazaar.php#/p=add") > 0) {
        addPage = true;
        addButton();
      } else {
        checkPage();
      }
    }, i * 1000);

  }

  checkPage();

  function addButton() {
    $("#inventory-container").prepend('<button id="start-button" style="margin-bottom:10px;margin-right:10px;">Run Auto-pricing script</button><p id="s-desc" style="display:inline-block;font-weight:bold;text-transform:uppercase;">Press the enter key after the price has shown up!</p>');
  }

  $(document).on("click", "#start-button", function() {
    getPricing();
  });

});

我对这个家伙完全不知所措,因此,感谢所有帮助!

1 个答案:

答案 0 :(得分:0)

我认为您应该进一步分解代码,并将代码的“输入时”部分移至单独的函数中,而不要在该成功回调中等待用户输入。

例如用伪代码,抓取的不同阶段

let priceData;
const preProcessPriceData = (data) => {
    // do some pre-processing, validate, change data formats etc
    // return processed data
};
const processPriceData = (data) => {
    // called when price data is ready and user pressed enter
    // in other words - script continues here
    console.log(priceData, 'or', data);

};

scrapeItems();

// in get prices function - remove event handler
$("#some-input-user-is-pressing-enter-in").offOnEnter(processPriceData);
priceData = null;
getPrices().then((data) => {
    priceData = data;
    let processedData = preProcessPriceData(data);
    // add listener to wait for user input
    $("#some-input-user-is-pressing-enter-in").onEnter(() => {
        // script continues after user presses enter
        processPriceData(processedData);
    });
});