2013-04-09 68 views
0

我有一個腳本,通過jQuery ajax計算價格,我注意到在Firebug控制檯中,同一個Ajax GET調用正在發生多次(有時是幾十次) 。我正在使用JavaScript和jQuery的混合來啓動這個功能,我有一種感覺這是問題。我只是不知道一個更有效的方法來做到這一點。javascript/jQuery多次調用 - 需要弄清楚爲什麼

當從菜單中選擇一個值時,該函數運行。下面是該代碼:

<div id="order_promo"> 
<select name="promo1" id="promo1" onmouseover="CalcPromo(1)"> 
<option value="1">Name1</option 
..... 
..... 
</select> 
</div> 

這裏是JavaScript/jQuery函數:當從菜單中選擇「促銷1」選擇的值

function CalcPromo(row){ 
     $(function(){ 
     $('#promo' + row).change(function(){ 
       //values to pass to php script for calculations 

       var promo=$(this).val(); 
       var id=$('#item' + row).val(); 
       var qty=$('#qty' + row).val(); 
       var price=$('#price' + row).val(); 

       var dataString = 'prodid='+ id + '&qty=' + qty + '&price=' + price + '&promo=' + promo + '&type=promo' + '&row=' + row ; //string passed to url 
       $.ajax 
       ({ 
        url: "includes/ajax/orders2.php", //url of php script 
        dataType: 'json', //json is return type from php script 
        data: dataString, //dataString is the string passed to the url 
        success: function(pricedata) //pricedata is the name of json array that is returned 
        { 
         //individual values from json array 
         var listprice = pricedata["price"]; 
         var disc = pricedata["disc"]; 
         var total = pricedata["total"]; 
         var tax = pricedata["tax"]; 
         var grand = pricedata["grand"]; 

         //set each value using text box id value using javascript val() function 
         $('#price' + row).val(listprice); 
         $('#discprice' + row).val(disc); 
         $('#itemprice' + row).val(total); 
         $("#tax").val(tax); 
         $("#grandtotal").val(grand); 
        }, 
        error: function(request, status, error) 
        { 
         alert(request.responseText); 
        } 
      }); 

     }); 

    }); 
    } 

該函數應開球。這是我能做到的唯一方法。我假設他們是一個純粹的jQuery方式來做到這一點,並消除了多次調用。這是我掙扎的地方。

謝謝!

+1

你做一個鼠標懸停(從您的標記)每當它增加了一個新的處理程序:'函數CalcPromo(行){(function(){('#promo'+ row).change(function(){' – 2013-04-09 20:14:06

+0

你有多個' 2013-04-09 20:17:24

+0

@MarkSchultheiss啊......好吧,這是有道理的。是的,總共三個。 – XanderNGCC 2013-04-09 20:18:23

回答

2

你做一個鼠標懸停(從您的標記)每當它增加了一個新的處理程序:

function CalcPromo(row){ 
    $(function(){ 
     $('#promo' + row).change(function(){ 

應該是這樣的:

$(function(){ 
    $('select[id^="promo"]').change(function(){ 

您將需要得到一個「行」 - 哪些可能是和選擇的索引?沒有您的標記,以評估:

var row = $(this).index('select'); 

從您的標記刪除行爲:

<select name="promo1" id="promo1" onmouseover="CalcPromo(1)"> 

變爲

<select name="promo1" id="promo1"> 

替代將是一個類添加到標記或更好的數據元素:

<select name="promo1" id="promo1" class="myselectorclass" data-row="1"> 

THEN行將成爲其中之一:

var row = $(this).data("row");// use this one 
// OR 
var row = $(this).index('.myselectorclass'); 

,你的事件可能是:

$('.myselectorclass').change(function(){ 
+0

因爲你對於這個問題還相當陌生,所以如果這樣做,並且你沒有更好的答案,你應該點擊答案左邊的複選標記。這並不是說我在尋求聲譽,但只是這標誌着答案被接受,並且讓那些在沒有被接受的答案的情況下尋找問題的人更容易幫助人們。 – 2013-04-09 21:23:07

相關問題