2012-02-11 162 views
1

我在移动应用程序。不止一次执行jquery函数

我有一个函数,它创建一个动态复选框(getItem1),在这个函数内我调用另一个更新sqlite。

function getItem1(flatname, flatdescription) { 

    $(document).ready(function(){ 
    $('#Code').empty(); 
    $('#displayflat article3').empty(); 
    $('#displayflat article1').empty(); 
    $('#displayflat article2').empty(); 
    $('#shares').val(''); 
    }); 
     var gtotal=0; 
     var total = 0; 
     var payment = 0; 
     var previouspayments = 0; 
     var sofeilon = 0; 
     var total1 = 0; 
     var payment1 = 0; 
     var previouspayments1 = 0; 
     var sofeilon1 = 0; 
     var len = 0; 
     var list = $('#Code'), 
      allbarcode = [], 
      my = {}, 
      barcode = [], 
      barcodeamount = [], 
      barcodeprevious = [], 
      items = []; 

     $.mobile.notesdb.transaction(function(t) { 
      t.executeSql('SELECT barcode, buildingcode, buildingaddress, flatname, flatdescription, entryseason, period, amount, pastpayments, todaypayments, paydate, receiptno FROM bill WHERE flatname = ? AND flatdescription = ?', 
      [flatname, flatdescription], 
      function(t, resultflatname) { 
       var i, 
        ib, 
        len = resultflatname.rows.length, 
        row = 0, 
        rowprev = 0, 
        rowb = 0; 

       for (i = 0; i < len; i += 1) { 
        row = resultflatname.rows.item(i); 

    if (row.amount > row.todaypayments + row.pastpayments) { 
        if (row.receiptno == 0){ 
         items.push('<input type="checkbox" name="code_'+ i +'" id="code_'+ i +'" value="' + row.amount + '" previous="' + row.pastpayments + '" barcode="' + row.barcode + '" todayp="' + row.todaypayments + '"/><label for="code_'+ i +'">' + row.period +'..........'+ row.amount+'</label></br>'); 
        } else { 
        if ((row.receiptno > 0) && (row.amount > row.todaypayments + row.pastpayments)){ 
         items.push('<input type="checkbox" name="code_'+ i +'" id="code_'+ i +'" value="' + row.amount + '" previous="' + row.pastpayments + '" barcode="' + row.barcode + '" todayp="' + row.todaypayments + '"/><label for="code_'+ i +'">' + row.period +'..........'+ row.amount+'</label></br>'); 


        } 
    } 
       } 
         allbarcode[i] = row.barcode; 
    //     barcodeamount[i] = row.amount; 
    //     barcodeprevious[i] = row.pastpayments; 
         previouspayments1 = previouspayments1 + row.pastpayments; 
         previouspayments = previouspayments1.toFixed(2); 
         sofeilon1 = sofeilon1 + row.amount; 
         sofeilon = sofeilon1.toFixed(2); 
         total1 = sofeilon - previouspayments; 
         total = total1.toFixed(2); 

        list.html(items.join('\n')); 

       $('#displayflat h1').text(row.flatname); 
       $('#displayflat article').html('<h2>Flatname : ' + row.flatdescription + '</h2>'); 
       if (total != 0){ 
        $('#displayflat article1').html('<p>Total : ' + total + '</p>'); 
        $('#displayflat article2').html('<p>Months Total : ' + sofeilon + '</p>'); 
       } 
       if (previouspayments != 0) { 
        $('#displayflat article3').html('<p>Previous Payments : <font color="red">' + previouspayments + '</font></p>'); 
       } 
     } 

       function calcTotal() { 
        $("input:checked").each(function() { 
         var value = [$(this).attr("value")]-[$(this).attr("previous")]; 
         payment = payment + parseFloat(value); //total = total + value   
        }); 
       } 

       function barcodeTotal() { 
        barcode = []; 
        barcodeamount[i]; 
        barcodeprevious[i]; 
        $("input:checked").each(function(i) { 
         barcode[i] = $(this).attr("barcode"); 
         barcodeamount[i] = $(this).attr("value"); 
         barcodeprevious[i] = $(this).attr("previous"); 
        }); 
       } 

       calcTotal(); 
       $("#Payment").html('<p class="total">Total Payment: <strong>' + payment.toFixed(2) + '</strong></p>'); 

       $("input:checkbox, input:radio").click(function() { 
        payment = 0; 
        calcTotal(); 
        $("p.total").html("Total Payment: <strong>" + payment.toFixed(2) + "</strong>"); 
       }); 

       $('#shares').keyup(function(){ 
        payment = 0; 
        calcTotal(); 
        gtotal = ($('#shares').val() * 1) + payment; 
        gtotal = gtotal.toFixed(2); 
        $("p.total").html("Total Payment: <strong>" + gtotal + "</strong>"); 
       }); 


       $('#shares').keyup(function(){ 
        $("input:checkbox, input:radio").click(function() { 
         payment = 0; 
         calcTotal(); 
         gtotal = ($('#shares').val() * 1) + payment; 
         gtotal = gtotal.toFixed(2); 
         $("p.total").html("Total Payment: <strong>" + gtotal + "</strong>"); 
        }); 
       }); 

       $("#pay").click(function(e) { 
        barcodeTotal(); 
        updateItem(payment.toFixed(2), gtotal, barcode, barcodeamount, barcodeprevious, allbarcode); 
       }); 

      }) 
     }); 
} 

和updateItem的代码。我只使用alert来观察执行了多少次。

function updateItem(payment, gtotal, barcodetotal, barcodeamount, barcodeprevious, allbarcode) { 
alert(allbarcode); 
alert(barcodeamount); 
alert(barcodeprevious); 
    var i, 
     j, 
     len = barcodetotal.length, 
     lenall = allbarcode.length, 
     today, 
     receiptno, 
     row = [], 
     barcodeamount, 
     barcodeprevious, 
     enanti = 0, 
     newbarcode, 
     pasttotal, 
     minimum = 0, 
     myrow; 

    $.mobile.notesdb.transaction(function(t) { 
     t.executeSql('SELECT userid, name, receiptno FROM collector', 
      [], function(t, resultcollector) { 
       myrow = resultcollector.rows.item(0); 
       receiptno = myrow.receiptno + 1; 
       t.executeSql('UPDATE collector SET receiptno = ?', [receiptno]); 

       if (payment > 0 && gtotal == 0) { 
        for (i = 0; i < len; i += 1) { 
         row = barcodetotal[i]; 
          for (j = 0; j < lenall; j += 1) { 
           if (allbarcode[j] == row){ 
            var place = j; 
           } 
          } 
         allbarcode.splice(place, 1); 
         barcodeprevious.slice(place, 1); 

         today = barcodeamount[i] - barcodeprevious[i]; 
         var billtoday = barcodeamount[i]; 
         t.executeSql('UPDATE bill SET pastpayments = ?, receiptno = ?, paydate = date("now") WHERE barcode = ?', [billtoday, receiptno, row]); 
         t.executeSql('INSERT INTO billpayments (barcode, amount, collectorid, receiptno) VALUES (?,?,?,?)', 
          [row, today, myrow.userid, receiptno]); 
        } 
       } 


        if (gtotal > 0) { 
         enanti = gtotal - payment; 
         //alert(enanti); 
         var minimum = Math.min.apply(null, allbarcode); 
         alert(minimum); 
         t.executeSql('SELECT barcode, amount, pastpayments, todaypayments FROM bill WHERE barcode = ?', 
          [minimum], 
          function(t, previousp) { 
           var myr = previousp.rows.item(0); 
           var todaypp = myr.pastpayments + enanti; 

           t.executeSql('UPDATE bill SET pastpayments = ?, todaypayments = ?, receiptno = ?, paydate = date("now") WHERE barcode = ?', [todaypp, enanti, receiptno, minimum]); 
           t.executeSql('INSERT INTO billpayments (barcode, amount, collectorid, receiptno) VALUES (?,?,?,?)', 
            [minimum, enanti, myrow.userid, receiptno]); 
         }); 
        } 






        $.mobile.changePage('#display', 'slideup', false, true); 
      }) 
    }); 

} 

当getItem1第一次执行时,一切正常。

对于getItem1的第二次执行updateItem,我认为两次。

getItem1的第三次updateItem 3次等等。

所有,如果数据是好,我可以不看后...

+0

昨天你问了同样的问题[这里](http://stackoverflow.com/questions/9234809/jquery-more-than-once-function-called),我再次重申,你需要把你的SQL查询您的javascript – Henesnarfel 2012-02-11 14:27:43

回答

3

你钩住你的点击事件不止一次。每次通过您都需要删除点击事件。

您的线路更改:

$("#pay").click(function(e) { 

到:

$("#pay").unbind('click').click(function(e) { 
+0

thx为您的快速答案...它的工作原理 – kosbou 2012-02-11 14:24:41

+0

我很高兴它适合你。 – 2012-02-11 14:26:34

+0

为什么要解除绑定并重新绑定点击事件?完全多余? – Richard 2012-02-11 14:28:24

0

移动功能的

  $("#pay").click(function(e) { 
       barcodeTotal(); 
       updateItem(payment.toFixed(2), gtotal, barcode, barcodeamount, barcodeprevious, allbarcode); 
      }); 

外,进入document.ready和使用onhttp://api.jquery.com/on/