2014-06-10 2 views
3

jQuery Mobile을 사용하는 작은 퀴즈 앱이 있습니다. 0 초에서 1 시간까지 실행하고 싶은 타이머를 만들고 있습니다. 그러나 타이머가 사용자가 특정 페이지를 볼 때, 즉 사용자가 질문 할 때만 실행되도록합니다. 질문에 대답 한 후 애니메이션이있는 다른 페이지가 나타나고 설명이되는 다른 페이지로 이동하기 때문입니다. 내 질문의 헤더 부분에 타이머를 표시하고 있습니다. 나는이 하나 같이 HTML이 :jQuery Mobile을 사용하여 특정 페이지에서 타이머를 실행하는 방법은 무엇입니까?

<div id="q1" data-role="page" data-add-back-btn="true" data-back-btn-text="Home"> 
       <div data-role="header" data-position="fixed" data-tap-toggle="false"> 
        <h1><img src="images/timer.png"> <span id="timer"></span></h1> 
       </div> 
      <!--Here comes some other code related to the quiz question--> 
</div> 

내가 30 개 질문을하고, 모든 사람의 id는 예를 들어 1 분기에 같은 수에 따라 'Q'로 시작합니다. 그리고 모든 사람의 머리말에는 "타이머"라는 이름의 스팬 요소가 있습니다. 여기에 숫자가 표시되기를 원합니다.

 var timestamp; 
     var interval = 1; 
     var initTimer = true; 
     var timerEl = $('span#timer'); 
     var qNumber; 
     var qCorrect; 
     var qFalse; 

     function relocateTimer(newEl) { 
      timerEl.prependTo(newEl); 
     } 

     function pad(n) { return ("0" + n).slice(-2); } 

     Number.prototype.pad = function (len) { 
      return (new Array(len+1).join("0") + this).slice(-len); 
     } 

     $(document).on("pagechange", function(event, ui) { 
      if (($.mobile.activePage[0].id != "correctGIF") && ($.mobile.activePage[0].id != "wrongGIF")) { 
       page = $.mobile.activePage[0].id; 

       if (page.match(/\d+$/) != null) { 
        qNumber = page.match(/\d+$/)[0]; 
        qCorrect = q.concat(qNumber, 'Correct'); 
        qFalse = q.concat(qNumber, 'False'); 
       } 

       if (page !== qCorrect || page !== qFalse) { 
        if (page == "q1") { 
         timestamp = new Date(0, 0, 0, 0, 0, 0); 
         if (initTimer) { 
          setInterval(function() { 
           timestamp = new Date(timestamp.getTime() + interval * 1000); 
          document.getElementById('timer').innerHTML = timestamp.getMinutes().pad(2) + ':' + timestamp.getSeconds().pad(2); 
          }, Math.abs(interval) * 1000); 

          initTimer = false; 
         } 
        } 
       } 
      } 

위와 같은 코드가 있습니다. 사용자가 quesiton 1 (q1)에있을 때 타이머를 재설정하고 싶습니다. q2에서 q30까지 다른 질문을 할 때 타이머를 표시하고 마지막 왼쪽 시간부터 계속하십시오. 따라서 그 기능은 if (page !== qCorrect || page !== qFalse) 안에 포함되어야합니다. 그러나 그것을 달성하는 방법을 모르겠습니다. 누구나, 어떤 생각?

편집 1 :

내가 말했듯이, 나는 30 질문이 있습니다, 그들은 Q30에 1 분기 사이의 ID를 가지고있다. 타이머를 q1에서 다시 설정하거나 1 시간이 지나면 경고를 표시하고 id 홈이있는 홈 페이지로 이동해야합니다. 따라서 현재 활성 페이지가 q1에서 q30 사이 인 경우에만 코드가 if (page !== qCorrect || page !== qFalse) 안에 입력됩니다. 그래서 타이머를 활성화하면 현재 페이지가 q1인지 확인합니다. 그래서, 내가 대답에서 이해하는 것은 내가이이 같은 것을 할 필요가 있다는 것입니다 :

if (page !== qCorrect || page !== qFalse) { 
    var curpage = '#'.concat(page); 
    timestamp = new Date(0, 0, 0, 0, 0, 0); 

    $(curpage).on("pagebeforeshow", function(event) 
    { 
     var element = $(this).find("span#timer"); 
     if (initTimer) { 
       setInterval(function() { 
       timestamp = new Date(timestamp.getTime() + interval * 1000); 
      document.getElementById(element).innerHTML = timestamp.getMinutes().pad(2) + ':' + timestamp.getSeconds().pad(2); 
       }, Math.abs(interval) * 1000); 

       initTimer = false; 
     } 
    } 
} 

비록를,이 맞다면 어떤 생각, 어떻게 pagehide 이벤트에 타이머를 중지하는 아무 생각. }});

편집 2 :

당신의 좋은 예 후, 나는 나 자신을 위해 뭔가를 시도했다. 아래 코드가 있지만 작동하지 않는 것 같습니다. 타이머가 멈추지 않는다는 뜻입니다. 각 질문이 끝나면 정답인지 틀린 지 (#correctGIF 및 #wrongGIF 페이지) 표시 한 다음 애니메이션을 보여줍니다. 중요한 점은 해당 페이지에서 타이머가 나타나지 않아야한다는 것입니다. 그러나 다음 질문에 도달 할 때 이전에 왼쪽 시간에서 계속하는 대신 이전에 왼쪽 시간에 3-4 초를 더한 시간부터 계속합니다. 내 애니메이션 (GIF)은 각각 3 초입니다. 어쩌면 타이머가 표시된 시간 동안 활성화되어있을 수도 있습니다.

var timestamp = new Date(0, 0, 0, 0, 0, 0); 
var interval = 1; 
var initTimer = true; 
var timer = null; 

function pad(n) { return ("0" + n).slice(-2); } 

Number.prototype.pad = function (len) { 
    return (new Array(len+1).join("0") + this).slice(-len); 
} 

function startTimer() { 
    var currentPage = $.mobile.activePage[0].id; 
    if (timer == null) { 
     var $timer = $("#"+currentPage +" span#timer"); 
     timer = setInterval(function() { showTimer() }, 1000); 
    } 
} 

function stopTimer() { 
    if (timer !== null) { 
     clearInterval(timer); 
     timer = null; 
    } 
} 

function showTimer() { 
    timestamp = new Date(timestamp.getTime() + interval * 1000); 
    var currentPage = $.mobile.activePage[0].id; 
    var $timer = $("#"+currentPage +" span#imter"); 
    $timer.html(timestamp.getMinutes().pad(2) + ':' + timestamp.getSeconds().pad(2)); 
    return false; 
} 


$(document).on("pagechange", function(event, ui) { 

    $("[id^=q]").on('pagebeforeshow', function() { 
     var currentPage = $.mobile.activePage[0].id; 
     console.log("Current page is: " + currentPage); 

     var correctIndex = currentPage.indexOf('Correct'); 
     var falseIndex = currentPage.indexOf('False'); 

     if (correctIndex > -1 || falseIndex > -1) { 
      stopTimer(); 
     } else { 
      startTimer(); 
     } 
    }); 

    // I have some more code down here, checking which page is currently active and 
    // acting accordingly. This part is crucial for my app. 

}); 

해결했다) (

하는 stopTimer가 추가, 애니메이션 동안 실행 된 타이머 같아; #correctGIF 및 #wrongGIF가 작동하게했습니다. 감사! 특히 'pagebeforeshow'에서

http://api.jquerymobile.com/category/events/ (pagebeforeshow) :

+0

내가, –

+0

답을 확인 다시 답을 확인 작업 코드로 업데이트되었습니다. –

+0

@ Floradu88 원래 게시물에 새 수정 사항을 작성했습니다. 확인해주세요. –

답변

0

나는 페이지를 변경할 때 jQuery를 모바일에서 이벤트에 살펴한다고 생각합니다.

$(".selector").on("pagebeforeshow", function(event) 
{ 
    var element = $(this).find("span#timer"); 
    //start element animation here, start the timer 
}); 

은 또한이 기능에 타이머를 죽일해야합니다 :

$(".selector").on("pagehide", function(event) { ... }); 

추신 : 귀하의 경우 '선택'에서

는 해당 사업부의 클래스 또는 ID 될 것이다 질문이 수정되거나 의견을 보낸 후 답변을 업데이트합니다.

Jsfiddle.net 예제는 여기에 있습니다 : 코드 http://jsfiddle.net/floradu88/sW8kv/1/

편집, 단지 aaa.html이 점을 추가하고 브라우저에서 실행

<!DOCTYPE html> 
<html> 
    <head> 
    <title>My Page</title> 
    <meta name="viewport" content="width=device-width, initial-scale=1"> 
    <link rel="stylesheet" href="http://code.jquery.com/mobile/1.1.0/jquery.mobile-1.1.0.min.css" /> 
    <script src="http://code.jquery.com/jquery-1.9.1.min.js"></script> 
    <script src="http://code.jquery.com/mobile/1.3.0/jquery.mobile-1.3.0.min.js"></script> 
</head> 
<body> 

<div data-role="page"> 

    <div data-role="header"> 
     <h1>My Title</h1> 
    </div><!-- /header --> 

    <div data-role="content"> 
     <p>Hello world</p> 
    <a href="#" data-role="button" data-icon="star" onclick="showPage1();">Star button</a>  
    </div><!-- /content --> 

</div><!-- /page --> 

<div id="q1" data-role="page" data-add-back-btn="true" data-back-btn-text="Home"> 
       <div data-role="header" data-position="fixed" data-tap-toggle="false"> 
        <h1><img data-icon="arrow-l"> <span id="timer">Timer not started</span></h1> 
       </div> 
      <!--Here comes some other code related to the quiz question--> 
      Question 1 - text 
      <a href="#" data-role="button" data-icon="star" onclick="showNextPage()">Next</a> 
      <a href="#" data-role="button" data-icon="star" onclick="showAnswerPage()">Show answer</a> 
</div> 

<div id="q1Answer" data-role="page" data-add-back-btn="true" data-back-btn-text="Home"> 


       <div data-role="header" data-position="fixed" data-tap-toggle="false"> 
        <h1><img data-icon="arrow-l"> <span id="timer">Timer not started</span></h1> 
       </div> 
      <!--Here comes some other code related to the quiz question--> 
      Question 1 answer 
      <a href="#" data-role="button" data-icon="star" onclick="showNextPage()">Next</a> 
</div> 

<div id="q2" data-role="page" data-add-back-btn="true" data-back-btn-text="Home"> 
       <div data-role="header" data-position="fixed" data-tap-toggle="false"> 
        <h1><img data-icon="arrow-l"> <span id="timer">Timer not started</span></h1> 
       </div> 
      <!--Here comes some other code related to the quiz question--> 
      Question 2 - text 
      <a href="#" data-role="button" data-icon="star" onclick="showNextPage()">Next</a> 
      <a href="#" data-role="button" data-icon="star" onclick="showAnswerPage()">Show answer</a> 
</div> 

<div id="q2Answer" data-role="page" data-add-back-btn="true" data-back-btn-text="Home"> 
    <div data-role="header" data-position="fixed" data-tap-toggle="false"> 
        <h1><img data-icon="arrow-l"> <span id="timer">Timer not started</span></h1> 
       </div> 
       Question 2 answer 
      <!--Here comes some other code related to the quiz question--> 
      <a href="#" data-role="button" data-icon="star" onclick="showNextPage()">Next</a> 
</div> 

<div id="q3" data-role="page" data-add-back-btn="true" data-back-btn-text="Home"> 
       <div data-role="header" data-position="fixed" data-tap-toggle="false"> 
        <h1><img data-icon="arrow-l"> <span id="timer">Timer not started</span></h1> 
       </div> 
      <!--Here comes some other code related to the quiz question--> 
      Question 3 - text 
      <a href="#" data-role="button" data-icon="star" onclick="showNextPage()">Next</a> 
      <a href="#" data-role="button" data-icon="star" onclick="showAnswerPage()">Show answer</a> 
</div> 

<div id="q3Answer" data-role="page" data-add-back-btn="true" data-back-btn-text="Home"> 
       <div data-role="header" data-position="fixed" data-tap-toggle="false"> 
        <h1><img data-icon="arrow-l"> <span id="timer">Timer not started</span></h1> 
       </div> 
       Question 3 answer 
      <!--Here comes some other code related to the quiz question--> 
      <a href="#" data-role="button" data-icon="star" onclick="showNextPage()">Next</a> 
</div> 

<script type="text/javascript"> 
var timer = null; 
var actualValue = 0; 
var questionNo = 3; 

function showNextPage(){ 
    var currentPage = $.mobile.activePage[0].id; 

    var part = currentPage.substr(1); 
    var index = part.indexOf('Answer'); 
    if (index > -1) { 
     part = part.substr(0,index); 
    } 
    var number = parseInt(part); 

    if (number + 1 <= questionNo) { 
     var nextPageId = "#q"+ (number + 1); 

     $.mobile.changePage($(nextPageId)); 
    } else { 
     //ended questionnaire 
     alert("ended questionnaire"); 
    } 
} 

function showAnswerPage(){ 

    var currentPage = $.mobile.activePage[0].id; 

    var part = currentPage.substr(1); 
    var number = parseInt(part); 
    var nextPageId = "#q"+ number + "Answer"; 

    var index = currentPage.indexOf('Answer'); 

    stopTimer(); 

    $.mobile.changePage($(nextPageId)); 
} 

$("[id^=q]").on('pagebeforeshow', function(){ 
    var currentPage = $.mobile.activePage[0].id; 

    var index = currentPage.indexOf('Answer'); 

    if (index > -1) { 
     stopTimer(); 
    } else { 
     startTimer(); 
    } 
}); 

function startTimer(){ 
    var currentPage = $.mobile.activePage[0].id; 
    if (timer == null) { 
     var $timer = $("#"+currentPage +" span#timer"); 
     timer = setInterval(function(){ showClock() }, 1000); 
    } 
} 

function stopTimer(){ 

    if (timer !== null) { 
     clearInterval(timer); 
     timer = null; 
    } 
} 

function showPage1(){ 
    $.mobile.changePage($("#q1")); 
    return false; 
} 

function showClock(){ 
    console.log(actualValue); 
    actualValue = actualValue + 1; 
    var currentPage = $.mobile.activePage[0].id; 

    var $timer = $("#"+currentPage +" span#timer"); 
    $timer.html(actualValue +' s elapsed'); 
    return false; 
} 
</script> 

</body> 
</html> 
+0

방금 ​​그 사건에 대해 읽었습니다. 그렇지만 필자의 예제에서 코드의 부분을 정확히 어디에 삽입해야할지 모른다. 전환이 일어날 때 페이지가 활성화 될 때 무언가를합니다. 각각의 질문에 대해 setInterval 코드를 반복 할 필요는 없습니다. –

+0

위의 메서드의 본문에서 시간 코드를 이동해야한다고 생각합니다. 그리고 이후에 이전 타이머를 파괴해야합니다. 나는 이것을위한 환경이 없지만 내일 밤에 설치하고 예제를 제공 할 것이다. –

+0

알겠습니다. 고마워요. 나는 원래의 질문에 대해서도 편집을했다. –

관련 문제