防止多次执行 JavaScript 函数

Posted

技术标签:

【中文标题】防止多次执行 JavaScript 函数【英文标题】:Preventing to execute a JavaScript function more than once 【发布时间】:2010-09-30 18:28:05 【问题描述】:

我正在使用 javascript、jQuery 和 php。如何限制 JavaScript 函数执行一次?

我的 MainJQuery 文件有 Ajax。 display.php 执行一会:

....

$.ajax(
    type:'POST',
    url: 'display.php',
    data:'id='+id  ,
    success: function(data)
        $("#response").html(data);

        //Here Get_list should be execute only once.
        get_list('get');

        // Display should execute as usual
        display();
    //success
); //Ajax

.......

get.Php 文件向 JavaScript 写入一个值:

<?php
    print "<script language='javascript'>";
    print " g_cost[g_cost.length]=new Array('STA-VES','East',4500);";
    print " g_cost[g_cost.length]=new Array('STA-CRF','West',5400);";
    print "</script>";
?>

我的 JavaScript 函数具有来自 PHP 的以下值:

function get_list('get')
    for(var i=0;i<g_cost.length;i++)
        var temp = g_cost[i];

    var Name = temp[0];
    var direction = temp[1];
    var cost = temp[2];

    ..
    some code
    ...


function display()
    for(var i=0;i<g_cost.length;i++)
        alert(g_cost.length);
    var temp = g_cost[i];
    alert(temp[0]);
    alert(temp[1]);
    alert(temp[2]);

是否可以限制在 jQuery Ajax 成功部分执行 JavaScript 函数?

【问题讨论】:

Run javascript function only once的可能重复 【参考方案1】:

在 jQuery 中,您可以使用 .one() 函数来绑定只执行一次的方法。例如,

$("#someAnchorId").one("click", function()
    //Ajax method here 
);

见jQuery one help topic。

【讨论】:

【参考方案2】:

您可以用空函数替换该函数 - 这与 Rene Saarsoo 的解决方案基本相同,但看起来更好:

var get_list = function(param1, param2, ...) 
     // your code here
     get_list = function() ;
;

【讨论】:

在“// your code here”部分中,您留下将运行一次的代码,在子函数中您放置每次运行的代码。 最好做 get_list = Function('');防止内存泄漏。【参考方案3】:

三个选项:

    在全局范围内设置一个布尔标志,运行成功后设置,运行前检查

    成功运行后,禁用按钮(或您用来调用一次性方法的任何控件)

    不太受欢迎,但您也可以在服务器端进行验证,即每次调用该方法,但在服务器端进行验证。好处是这将确保服务器上的数据一致性。

【讨论】:

引入全局变量是个坏主意。【参考方案4】:

创建一个只执行一次的函数:

get_list = (function()
  var counter = 0;
  return function(param1, param2, ...) 
    if (counter > 0) 
      return;
    
    counter++;

    // your normal function code here
  ;
)();

这与使用全局变量来跟踪函数执行的次数几乎相同,只是我们创建了一个只有内部函数才能看到的变量而不是全局变量。之后,您将 get_list 用作任何其他函数。

这可能会在函数原型中被重构为更通用的东西,因此可以这样使用:

get_list = (function (param1, param2, ...) 
  ...
).once();

【讨论】:

【参考方案5】:

最快的方法是在成功声明中多加一行:

$.ajax(
    type:'POST',
    url: 'display.php',
    data:'id='+id  ,
    success: function(data)
        if(!arguments.callee.stop) arguments.callee.stop = true; else return; 

        $("#response").html(data);
        //Here Get_list should be execute only once   
        get_list('get');

        // display should execute as usual  
        display();

    //success
); //ajax

【讨论】:

【参考方案6】:

尝试在调用成功后禁用 Ajax 触发器(链接、按钮等)。

触发器示例:

<a id="ajax_trigger" href="#" onclick="yourAjaxCall(); return false;">Get List</a>

...

success: function(data)
    $("#response").html(data);
        //Here Get_list should be execute only once
         get_list('get');

        // Some code to disable, or hide #ajax_trigger
        // in other words, make it unclickable or disappear.
        $("#ajax_trigger").css('display': 'none'); // IIRC

        // Display should execute as usual
        display();
//success

【讨论】:

以上是关于防止多次执行 JavaScript 函数的主要内容,如果未能解决你的问题,请参考以下文章

javascript 防止多次提交或执行(在规定时间段内只允许执行一次) 默认 3000ms

javascript 如何防止多次触发hover事件

微信小程序:防止多次点击跳转(函数节流)

Javascript函数的防抖和节流

如何防止在页面加载时执行 javascript 函数?

Azure 函数 - 防止多次调用