Bir kereden fazla bir JavaScript işlevi yürütmek için önleme

6 Cevap php

JavaScript, jQuery ve PHP kullanıyorum. Nasıl JavaScript işlevi bir kez çalıştırmak için sınırı mı?

Benim MainJQuery dosya Ajax sahiptir. display.php bir süre yürütün:

....

$.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 dosya JavaScript bir değer yazıyor:

<?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>";
?>

Benim JavaScript işlevi PHP aşağıdaki değeri vardır:

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]);
}

Bu jQuery Ajax başarı kısmında bir JavaScript işlevi yürütmek için sınırlamak mümkün mü?

6 Cevap

JQuery sadece bir kez yürütecek bir yöntem bağlamak için .one() işlevini kullanabilirsiniz. Örneğin,

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

Bkz jQuery one help topic.

Üç seçenekleri:

  1. , Küresel alanda bir boolean bayrak ayarlamak başarılı bir çalıştırdıktan sonra ayarlayın ve çalıştırmadan önce kontrol

  2. Başarılı bir çalıştırdıktan sonra, düğmesini devre dışı (veya bir kerelik yöntemi çağırmak için kullandığınız her türlü kontrolü)

  3. Biraz daha az tercih edilen, ama aynı zamanda sunucu tarafında doğrulama yapabilirsiniz, yani yöntem, her zaman aramak, ancak sunucu tarafında doğrulamak. Yukarı tarafı, bu sunucu üzerindeki veri tutarlılığını sağlamak olacaktır.

Sadece bir kez çalışan bir işlevi oluşturmak için:

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

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

Bu, sadece iç işlev görebilmesi, bir değişken oluşturmak yerine küresel değişkeni hariç, neredeyse işlevi çalıştırılır kaç kez izleme için global bir değişken kullanarak aynıdır. Bundan sonra başka bir işlev olarak get_list kullanabilirsiniz.

Bu muhtemelen işlev prototye daha genel bir şey haline refactored, bu yüzden bu gibi kullanılabilir:

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

Sen boş bir fonksiyonu işlevini değiştirebilirsiniz - Bu aslında Rene Saarsoo 'çözüm olarak aynıdır, ama güzel görünüyor:

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

Hızlı şekilde başarı beyanı ekstra bir satır eklemek için:

$.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

Başarılı bir çağrıdan sonra Ajax Tetiği (bağlantı, düğme, vb) devre dışı bırakmayı deneyin.

Bir tetikleyici örneği:

<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