AJAX on Button Click逐步运行

时间:2019-02-15 13:11:10

标签: javascript jquery ajax

我已经实现了一个绑定到按钮的简单AJAX调用。单击时,该调用从处获取输入,然后使用getJSON将值转发到FLASK服务器。使用提供的值(URL),将请求发送到网站,并将网站的html发送回。

问题在于AJAX调用似乎多次运行,具体取决于单击它的次数。

示例;

(单击) 1个 (点击) 2 1个 (点击) 3 2 1

因为我正在将请求从FLASK服务器发送到另一个网站,所以它实际上看起来像是在尝试对服务器进行DDOS。知道如何解决这个问题吗?

我的AJAX代码;

var requestNumber = 1; //done for testing purposes

    //RUNS PROXY SCRIPT
    $("#btnProxy").bind("click", function() . //#btnProxy is the button
        {
     $.getJSON("/background_process", //background_process is my FLASK route
                   {txtAddress: $('input[name="Address"]').val(), //Address is the input box
                   },
                   console.log(++requestNumber), //increment on function call
                   function(data)
                   {$("#web_iframe").attr('srcdoc', data.result); //the FLASK route retrieves the html of a webpage and returns it in an iframe srcdoc.
                   });
        return false;
    });

我的FLASK代码(虽然可能不是原因)

@app.route('/background_process')
def background_process():
    address = None
    try:
        address = request.args.get("txtAddress")
        resp = requests.get(address)
        return jsonify(result=resp.text)

    except Exception, e:
        return(str(e))

我的测试输出的图像(我压制了FLASK脚本)

https://snag.gy/bikCZj.jpg

3 个答案:

答案 0 :(得分:0)

您可以尝试使用preventDefault(),看看它是否符合您的需求。

  $("#btnProxy").bind("click", function(e) {
    e.preventDefault();

   $.getJSON("/background_process", 
                 {txtAddress: $('input[name="Address"]').val(),
                 },
                 console.log(++requestNumber),
                 function(data)
                 {$("#web_iframe").attr('srcdoc', data.result);
                 });
      return false;
  });

答案 1 :(得分:0)

可能您多次绑定了click事件。

$("#btnProxy").bind("click", function() { ... } );

可能的解决方案替代方法:

a)仅在文档加载时绑定click事件:

$(function() {
    $("#btnProxy").bind("click", function() { ... } );
});

b)使用setTimeout和clearTimeout过滤多个调用:

var to=null;
$("#btnProxy").bind("click", function() {
    if(to) clearTimeout(to);
    to=setTimeout(function() { ... },500);
});

c)在设置呼叫之前清除其他绑定:

$("#btnProxy").off("click");
$("#btnProxy").bind("click", function() { ... } );

答案 2 :(得分:0)

最简单的操作之一是在第一次单击后禁用该按钮,仅在AJAX调用完成后才启用它:

var btnProxy = $("#btnProxy");
//RUNS PROXY SCRIPT
btnProxy.bind("click", function ()  //#btnProxy is the button
{
    btnProxy.attr('disabled', 'disabled');//disable the button before the request
    $.getJSON("/background_process", //background_process is my FLASK route
        {
            txtAddress: $('input[name="Address"]').val(), //Address is the input box
        },
        function (data) {
            $("#web_iframe").attr('srcdoc', data.result); //the FLASK route retrieves the html of a webpage and returns it in an iframe srcdoc.
           btnProxy.attr('disabled', null);//enable button on success
        });
    return false;
});