Предотвращение выполнения функции JavaScript более одного раза - PullRequest
4 голосов
/ 11 января 2009

Я использую 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]);
}

Можно ли ограничить выполнение функции JavaScript в части успеха jQuery Ajax?

Ответы [ 6 ]

10 голосов
/ 11 января 2009

В jQuery вы можете использовать функцию .one() для привязки метода, который будет выполняться только один раз. Например,

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

См. jQuery один раздел справки .

5 голосов
/ 17 сентября 2010

Вы можете заменить функцию пустой функцией - это по сути то же самое, что и решение Рене Саарсоо, но выглядит лучше:

var get_list = function(param1, param2, ...) {
     // your code here
     get_list = function() {};
};
3 голосов
/ 11 января 2009

Чтобы создать функцию, которая выполняется только один раз:

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();
3 голосов
/ 11 января 2009

Три варианта:

  1. Установите логический флаг в глобальной области видимости, установите его после успешного запуска и проверьте его перед запуском

  2. После успешного запуска отключите кнопку (или любой другой элемент управления, который вы используете для вызова одноразового метода)

  3. Чуть менее предпочтителен, но вы также можете выполнять проверку на стороне сервера, то есть каждый раз вызывать метод, но проверять на стороне сервера. Положительным моментом является то, что это обеспечит согласованность данных на сервере.

1 голос
/ 12 января 2009

Самый быстрый способ - добавить одну дополнительную строку в объявление успеха:

$.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
0 голосов
/ 11 января 2009

Попробуйте отключить триггер 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
...