Solved

javascript timer over multiple pages

Posted on 2011-03-09
6
609 Views
Last Modified: 2012-08-14
I was shown the code below by another expert, and it's worked wonderfully for the parts where i needed to just send the time spent on one page to the database.

However, there are a few pages where it would be easiest that it keeps the time over a number of pages.  I have a learning section for this module/quiz where there are different pages of information they can review before taking the test questions.  I want to know how long they spend looking at those pages, they can move freely between the 5 pages until they click the finished link in the navigation.

Is there a way to accomplish what i'm looking to do? Thanks for any help.
<script>
var currentTime = new Date();
var startTime = currentTime.getTime();

function getElapsedTime()
{
	var endTime = new Date();
	var elapsedTime = (endTime.getTime() - startTime);
	form1.elapsedTime.value = elapsedTime;
}
</script>



<form id=form1 target=_blank>
<input type=hidden name=elapsedTime>
<input type=submit onclick="getElapsedTime()">
</form>

Open in new window

0
Comment
Question by:newmie22
  • 3
  • 3
6 Comments
 
LVL 16

Expert Comment

by:sjklein42
ID: 35090015
How are you saving the partial answers from each page within the set of five until the user finally clicks the finished link?  Cookies?

Related question - How do you gather up the answers from all five pages into one form?

We need to (essentially) save the startTime variable along with the other partial answers.

Need to see more of your code.



0
 

Author Comment

by:newmie22
ID: 35090058
the 5 pages that i want to gather time info for are just teaching pages, they is no user interaction besides reading, but for the purposes of comparison for the study, i want to see how long it takes the user to absorb the information.

Essentially there 4 pages with information like the code below and the navigation has a finished button/page where they'll leave the learning section and proceed to the 'test'
<?php
session_start();
?>

<!DOCTYPE html>
<html lang="en">
	<head>
		<meta charset="utf-8">
        <meta name="viewport" content="width=device-width; height=device-height; initial-scale=1;">
        
        <title>Digital Natives Testing Module</title>
        
        <link rel="stylesheet" type="text/css" href="styles.css" />
               
        <!--[if IE]>
        
        <style type="text/css">
        .clear {
          zoom: 1;
          display: block;
        }
        </style>

        
        <![endif]-->
        
    </head>
    
    <body>

    	<section id="page"> <!-- Defining the #page section with the section tag -->
    
            <div class="header"> <!-- Defining the header section of the page with the appropriate tag -->

                <h1>Test A</h1>
                <p>&nbsp;</p>
                <nav> <!-- The nav link semantically marks your main site navigation -->
              		<ul>
                        <li><a href="testA-overheat.html">OVERHEAT</a></li>
                        <li><a href="testA-jammed.html">JAMMED</a></li>
                        <li><a href="testA-continue.html">CONTINUE</a></li>
                        <li><a href="testA-stop.html">STOP</a></li>
                        <li><a href="testA-finished.html">FINISHED</a></li>
                    </ul>
                </nav>
            
            </div>
            
            <section id="articles"> <!-- A new section with the articles -->

				<!-- Article 1 start -->

                <div class="line"></div>  <!-- Dividing line -->
                
                <div class="article" id="article1"> <!-- The new article tag. The id is supplied so it can be scrolled into view. -->
                    <h2>jammed</h2>
                    
                    <div class="line"></div>
                    
                    <div class="articleBody clear">
                    
                    <div class="figure"> <!-- The figure tag marks data (usually an image) that is part of the article -->
	                    	<img src="img/a_jammed.png" alt="jammed" />
                    </div>
                    
                      <p>If the machine gets a part stuck in the belt, this may damage the machine. When the machine displays a triangle, this indicates that it is jammed and the belt needs to be cleared.</p>
</div>
                </div>
                
				<!-- Article 1 end -->


            </section>

        <footer> <!-- Marking the footer section -->

          <div class="line"></div>
        
        </footer>
            
		</section> <!-- Closing the #page section -->
        
    </body>
</html>

Open in new window

0
 
LVL 16

Accepted Solution

by:
sjklein42 earned 500 total points
ID: 35090349
I think I have the answer.  It is a little hard to explain, but not really that complicated.

Here's my suggestion.  As the user goes from page to page, we pass the cumulative elapsed time as part of the URL (CGI argument).  So the links are dynamically patched to look like this:

testA-overheat.html?st=14407

The trick is, that the CGI argument is actually client-side only (browser) and can be tacked onto a plain old HTML page's URL without bothering the server.  Each of the four pages has javascript that looks to see if there is a "st" switch, and, if so, starts with that as the elapsed time instead of zero.

Then, when the "FINISH" link is taken, there is a CGI parameter ("st") that communicates the total elapsed time for the whole set of pages to the Finish CGI script, which logs it and goes onto the next part of the test.

To try this out, save multiple copies of this code as "testA-overheat.html", "testA-jammed.html", and so on for your four pages.  The Finish page is going to be different since that is when you want to record the total elapsed time.

Starting with any one of the pages, click the links to go from page to page and watch the URL in the address field.  It should show the cumulative elapsed time.

<script>
var currentTime = new Date();
var startTime;

var loc = window.location+"";
var xx = loc.split("?");
if (xx[1] != null) { startTime = currentTime.getTime() - xx[1].substr(3,10); }
else               { startTime = currentTime.getTime();                      }

function chainToPage()
{
    var endTime = new Date();
    var elapsedTime = (endTime.getTime() - startTime);
    form1.st.value = elapsedTime;
    form1.submit();
}
</script>



<form id=form1 action="testA-overheat.html"><input type=hidden name=st></form><a href=# onclick="chainToPage()">OVERHEAT</a>
<form id=form1 action="testA-jammed.html"><input type=hidden name=st></form><a href=# onclick="chainToPage()">JAMMED</a>
<form id=form1 action="testA-continue.html"><input type=hidden name=st></form><a href=# onclick="chainToPage()">CONTINUE</a>
<form id=form1 action="testA-stop.html"><input type=hidden name=st></form><a href=# onclick="chainToPage()">STOP</a>
<form id=form1 action="testA-finished.html"><input type=hidden name=st></form><a href=# onclick="chainToPage()">FINISHED</a>

Open in new window

0
How your wiki can always stay up-to-date

Quip doubles as a “living” wiki and a project management tool that evolves with your organization. As you finish projects in Quip, the work remains, easily accessible to all team members, new and old.
- Increase transparency
- Onboard new hires faster
- Access from mobile/offline

 

Author Comment

by:newmie22
ID: 35090450
ok, i think i get what you're saying.  I see you have the code in the form tags.  The links i have in my code are <nav> tags with ul lists, would i need to change them to be form tags to get the timer results i'm looking to achieve?
0
 
LVL 16

Expert Comment

by:sjklein42
ID: 35090472
Yes, they need to be form tags to get the hidden attribute added to the URL.  The form itself is totally invisible and the a-href tag activates it, so the user is still clicking on a normal-looking link.

I think you can make it look the same on the page.

0
 

Author Closing Comment

by:newmie22
ID: 35090542
Great, thanks for the help!
0

Featured Post

How to run any project with ease

Manage projects of all sizes how you want. Great for personal to-do lists, project milestones, team priorities and launch plans.
- Combine task lists, docs, spreadsheets, and chat in one
- View and edit from mobile/offline
- Cut down on emails

Join & Write a Comment

Author Note: Since this E-E article was originally written, years ago, formal testing has come into common use in the world of PHP.  PHPUnit (http://en.wikipedia.org/wiki/PHPUnit) and similar technologies have enjoyed wide adoption, making it possib…
Things That Drive Us Nuts Have you noticed the use of the reCaptcha feature at EE and other web sites?  It wants you to read and retype something that looks like this.Insanity!  It's not EE's fault - that's just the way reCaptcha works.  But it is …
The viewer will learn how to dynamically set the form action using jQuery.
The viewer will learn how to count occurrences of each item in an array.

706 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

21 Experts available now in Live!

Get 1:1 Help Now