javascript/jQuery多次调用 - 需要弄清楚为什么

问题描述:

我有一个脚本,通过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

你有多个'

+0

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

你做一个鼠标悬停(从您的标记)每当它增加了一个新的处理程序:

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