2010-04-30 9 views
4

Quelqu'un pourrait me dire ce que je fais mal? Je ne suis pas un débutant en programmation mais j'en ai envie ce soir! Chaque fois que j'incrémente la variable incrémentée, elle lance un ajustement! Quand on en ajoute un, il se comporte bien, mais si j'essaie d'en ajouter un de plus, il veut en ajouter 2 de plus. Et puis, si j'essaie de dé-incrémenter, il veut soustraire du numéro d'origine auquel il a été assigné.jQuery i ++ et i-- problèmes

J'ai essayé:

i++; 
i = i+1; 
i = i++; 

Rien ne semble fonctionner. Ça doit être une erreur stupide.

est ici le code:

var dayNum = 30; 
//---------------------------------------------------------------------- 
$.jQTouch({ 
     icon: 'dailyqoteicon.png', 
     statusBar: false, 
     initializeTouch: 'a.touch' 
    }); 

//---------------------------------------------------------------------- 
$(document).ready(function(){ 
    //$(function(){}); 
    $(function(){ 
     $('a.touch').swipe(function(event, info){ 
      //alert("jQTouch swipe event"); 
      //alert(info.direction); 
     }); 
    }); 
    $(function updateVerse(){ 
     //alert("updateVerse called"); 
     $.ajax({ 
      type: "GET", 
      dataType: 'JSON', 
      data: 'day='+ dayNum, 
      url: 'forward.php', 
      success: function(data){ 
       var obj = $.parseJSON(data); 
       $("h2.quote").html(""); 
       $("h3.reference").html(""); 
       $("h2.quote").append(obj.quote); 
       $("h3.reference").append(obj.reference, " ", obj.version); 
       //$("span.version").append(obj.version); 
       //----------------------------------- 
       // JSON string {"id":"1","quote":"For to me, to live is Christ, and to die is gain","reference":"Philippians 1:21","version":"NKJV"} 
      }, 
      error: function(request, error){ 
       alert("problem retrieving json data string"); 
      } 
     }); 
     function addDayNum(){ 
      dayNum = dayNum + 1; 
      //dayNum = dayNum++; 
     } 
     function subDayNum(){ 
      dayNum = dayNum - 1; 
      //dayNum = dayNum--; 
     } 

     $("div#header a.next").tap(function(){ 
      addDayNum(); 
      //dayNum++;// doesn't work at all 
      //dayNum = dayNum + 1;//doesn't work at all 
      updateVerse(); 
      //alert(dayNum); 
      //alert("next clicked"); 
     }); 
     $("div#header a.prev").live('click', function(){ 
      subDayNum(); 
      //dayNum--;//doesn't work at all 
      //dayNum = dayNum - 1;// doesn't work at all 
      updateVerse(); 
      //alert(dayNum); 
      //alert("previous clicked"); 
     }); 
    }); 
}); 
+0

Peut-être un problème de portée? –

+3

En outre, ** pourquoi diable emboîtez-vous les gestionnaires 'ready' **? –

+0

Que '.tap()' est aussi cassé comme diable sur Chrome. Semble s'inscrire plusieurs fois. –

Répondre

4

Je ne connais pas trop jqTouch. Mais ce qui se passe, c'est qu'un gestionnaire de clic est attaché aux liens chaque fois que le lien est effectivement cliqué. Donc, à chaque clic, il va passer un verset N + 1 fois.

EDIT: Je le vois maintenant. Votre fonction updateVerse a ceci:

$("a.next").tap(function(){ 
addDayNum();// doesn't work at all 
//dayNum++;// doesn't work at all 
    //dayNum = dayNum + 1;//doesn't work at all 
updateVerse(); 
//alert(dayNum); 
//alert("next clicked"); 
}); 
$("a.prev").tap(function(){ 
subDayNum();// doesn't work at all 
//dayNum--;//doesn't work at all 
//dayNum = dayNum - 1;// doesn't work at all 
updateVerse(); 
//alert(dayNum); 
//alert("previous clicked"); 
}); 

Ce code ne doit exécuter UNE FOIS et ce qui se passe, il est l'ajout tap() gestionnaire chaque fois que vous appuyez sur en fait un lien. C'est pourquoi il saute N + 1 versets chaque fois que vous appuyez sur un lien.

Voici ce que votre code devrait ressembler à:

var dayNum = 30; 

//---------------------------------------------------------------------- 
function setupClickHandlers() { 
     $("div#header a.next").tap(function(){ 
      addDayNum(); 
      //dayNum++;// doesn't work at all 
      //dayNum = dayNum + 1;//doesn't work at all 
      updateVerse(); 
      //alert(dayNum); 
      //alert("next clicked"); 
     }); 
     $("div#header a.prev").live('click', function(){ 
      subDayNum(); 
      //dayNum--;//doesn't work at all 
      //dayNum = dayNum - 1;// doesn't work at all 
      updateVerse(); 
      //alert(dayNum); 
      //alert("previous clicked"); 
     }); 
} 

function updateVerse(){ 
     //alert("updateVerse called"); 
     $.ajax({ 
      type: "GET", 
      dataType: 'JSON', 
      data: 'day='+ dayNum, 
      url: 'forward.php', 
      success: function(data){ 
       var obj = $.parseJSON(data); 
       $("h2.quote").html(""); 
       $("h3.reference").html(""); 
       $("h2.quote").append(obj.quote); 
       $("h3.reference").append(obj.reference, " ", obj.version); 
       //$("span.version").append(obj.version); 
       //----------------------------------- 
       // JSON string {"id":"1","quote":"For to me, to live is Christ, and to die is gain","reference":"Philippians 1:21","version":"NKJV"} 
      }, 
      error: function(request, error){ 
       alert("problem retrieving json data string"); 
      } 
     }); 
     function addDayNum(){ 
      dayNum = dayNum + 1; 
      //dayNum = dayNum++; 
     } 
     function subDayNum(){ 
      dayNum = dayNum - 1; 
      //dayNum = dayNum--; 
     } 

} 

$(document).ready(function(){ 
     $.jQTouch({ 
      icon: 'dailyqoteicon.png', 
      statusBar: false, 
      initializeTouch: 'a.touch' 
     }); 

    setupClickHandlers(); 
     $('a.touch').swipe(function(event, info){ 
      //alert("jQTouch swipe event"); 
      //alert(info.direction); 
     }); 

}); 
+0

C'est définitivement le problème. Après avoir regardé à nouveau, ça n'a rien à voir avec jQtouch. Fondamentalement, votre fonction 'updateVerse()' appelait '$ (" ... "). Tap (function() {...});'. Qu'est-ce que cela fait chaque fois que updateVerse est appelé * un autre gestionnaire * tap/click est attaché au lien hypertexte. À chaque tour, chaque gestionnaire que vous étiez en train d'appeler appelait 'updateVerse()' à nouveau. Donc, à chaque clic, vous avez ajouté +1 en tapant sur votre lien. Vous devez vous rappeler que lorsque les gestionnaires sont attachés à des éléments avec jQuery, ils sont cumulatifs, de sorte que les gestionnaires précédents ne sont pas effacés. – Strelok

+0

Oh wow. C'est vraiment la deuxième fois que j'utilise jQuery. C'est tellement différent de tout le reste ... Hum, peut-être que je devrais trouver un livre à lire à ce sujet pour une lecture facile. Ou allez simplement lire les documents jQuery. J'ai un sens maintenant, merci beaucoup! Il semble que l'héritage est quelque chose qui n'est pas bien expliqué dans une langue, mais il semble me mordre à chaque fois. – michael

0

Vous ne devriez pas faire i = i++. En C c'est un comportement indéfini, appelé modifier deux fois une variable sans aucun point de séquence - bien que je ne pense pas que cela s'applique ici.

i++ va incrémenter i et afficher la valeur d'origine. Ainsi,

i = 4 
print i++ # prints 4 
print i # prints 5 

donc, si vous dites i = i++, vous dites, augmenter la valeur de i, puis attribuez-lui la valeur initiale à i. C'est idiot.

Je suppose que vous pouvez avoir des problèmes plus profonds, mais c'est une chose qui m'a frappé immédiatement.

+1

** Oh oui, il a beaucoup plus de problèmes **, croyez-moi. –

1

Essayez alert()ing lorsque le gestionnaire de clic est appelé. Méfiez-vous que cela pourrait rendre votre navigateur inutilisable à cause de son apparition incessante. Il n'y a rien de mal avec vos tentatives à ++ et -- (autre que i = i++ étant un comportement indéfini). Dans Chrome, il est visiblement mis à jour le verset plusieurs fois et en utilisant 100% CPU. Peut-être que le gestionnaire de clic s'invoque de manière récursive.

+0

C'est aussi mon soupçon. –

0

Je suppose que vous ne pouvez pas poster de code dans les commentaires ... avez-vous habituellement nous pré-tags ou juste le WYSIWYG?

@strelokstrelok ressemble à cela pourrait être le problème. voici la fonction tap() actuelle dans jQTouch. Le paramètre à l'intérieur de la fonction est-il une autre fonction? Quelle différence cela ferait-il?

 $.fn.tap = function(fn){ 
     if ($.isFunction(fn)){ 
      var tapEvent = (jQTSettings.useFastTouch && $.support.touch) ? 'tap' : 'click'; 
      return $(this).live(tapEvent, fn); 
     } else { 
      $(this).trigger('tap'); 
     } 
    }