2010-04-30 2 views
4

Не мог бы кто-нибудь рассказать мне, что я делаю неправильно? Я не новичок в программировании, но сегодня мне это нравится! Каждый раз, когда я увеличиваю инкрементную переменную, она бросает подгонку! Когда добавляете один к нему, он ведет себя отлично, но если я попытаюсь добавить еще один, он захочет добавить еще 2. И затем, если я попытаюсь деинкремент, он хочет вычесть из исходного номера, которому он был назначен.jQuery i ++ и i-- проблемы

Я пробовал:

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

Ничто не похоже на работу. Это глупая ошибка.

вот код:

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

Возможно, проблема? –

+3

Кроме того, ** почему вы гнездились в 'готовых' обработчиках **? –

+0

Этот '.tap()' также разбит на Chrome. Кажется, регистрируется несколько раз. –

ответ

4

Я не очень хорошо знаком с jqTouch. Но происходит то, что обработчик кликов привязывается к ссылкам каждый раз, когда нажимается ссылка. Таким образом, с каждым щелчком он пропустит стих N + 1 раз.

EDIT: Я вижу его сейчас. Ваша updateVerse функция имеет следующее:

$("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"); 
}); 

Этот код должен работать РАЗ только и того, что происходит это добавление tap() обработчика каждый раз вы на самом деле нажмите на ссылку. Вот почему он пропускает N + 1 стихи каждый раз, когда вы нажимаете ссылку.

Вот что ваш код должен выглядеть следующим образом:

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

Это определенно проблема. После того, как я снова посмотрел на него, это не имеет никакого отношения к jQtouch. В основном ваша 'updateVerse()' функция вызывала '$ (" ... "). Tap (function() {...});'. То, что это делает каждый раз, когда вызывается updateVerse *, к гиперссылке прикрепляется другой обработчик tap/click. В свою очередь, каждый обработчик, который вы прикрепляли, на самом деле вызывал 'updateVerse()' снова. Таким образом, с каждым щелчком мыши вы добавляете +1 кран/клик по ссылке. Вы должны помнить, что когда обработчики привязаны к элементам с jQuery, они являются кумулятивными, поэтому предыдущие обработчики не очищаются. – Strelok

+0

О, ничего себе. Это действительно только второй раз с использованием jQuery. Это так отличается от всего остального ... Хм, может быть, мне стоит найти книгу, чтобы прочитать ее для легкого чтения. Или просто прочитайте JQuery Docs. Имею смысл сейчас, спасибо огромное! Кажется, что наследование - это то, что не так хорошо объяснено на каком-либо языке, но оно, кажется, укусит меня каждый раз. – michael

0

Вы не должны делать i = i++. В C это неопределенное поведение, называемое модификацией переменной дважды без промежуточной точки между ними, хотя я не думаю, что это применимо здесь.

i++ будет увеличивать i и дает первоначальное значение. Так,

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

поэтому, если вы говорите i = i++, вы говорите, увеличивает значение i, а затем присвоить исходное значение i. Это глупо.

Я подозреваю, что у вас могут быть более глубокие проблемы, но это одна вещь, которая сразу же ударила меня.

+1

** О да, у него гораздо большие проблемы **, поверьте мне. –

1

Попробуйте alert()ing, когда обработчик щелчка называется. Помните, что это может привести к тому, что ваш браузер будет неработоспособным, потому что он постоянно появляется. Нет ничего плохого в ваших попытках в ++ и -- (кроме i = i++ - это неопределенное поведение). В Chrome он заметно обновляет стих несколько раз и использует 100% процессор. Возможно, обработчик клика каким-то образом рекурсивно ссылается на него.

+0

Это тоже мое подозрение. –

0

Я думаю, вы не можете публиковать код в комментариях ... вы обычно используете теги pre или только WYSIWYG?

@strelokstrelok кажется, что это может быть проблемой. вот фактическая функция tap() в jQTouch. Является ли параметр внутри функции другой функцией? Какая разница?

Смежные вопросы