4

我正在使用 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 函数?

4

6 回答 6

10

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

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

请参阅jQuery 一个帮助主题

于 2009-01-11T14:26:59.727 回答
5

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

var get_list = function(param1, param2, ...) {
     // your code here
     get_list = function() {};
};
于 2010-09-17T13:14:43.047 回答
3

三个选项:

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

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

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

于 2009-01-11T10:48:31.230 回答
3

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

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();
于 2009-01-11T13:21:52.760 回答
1

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

$.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
于 2009-01-12T14:43:34.937 回答
0

尝试在成功调用后禁用 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
于 2009-01-11T10:45:07.040 回答