如果警报被注释掉,此JavaScript代码将无法正确执行。

如果警报被注释掉,此JavaScript代码将无法正确执行。,javascript,iphone-standalone-web-app,Javascript,Iphone Standalone Web App,我正在尝试为web应用程序编写一个简单的JavaScript页面计时器。计时器将记录用户进入页面时按下按钮的时间,并在用户离开页面时再次记录按下按钮的时间。2次的差值将给出用户在页面上花费的时间。如果它们在页面上停留超过2秒,则秒数将记录到手持设备上的本地数据库中 我遇到的问题是,如果starttime函数中的警报被注释掉,以下代码将无法工作 $(document).ready(function() { $('div.m1-root').click(function () {

我正在尝试为web应用程序编写一个简单的JavaScript页面计时器。计时器将记录用户进入页面时按下按钮的时间,并在用户离开页面时再次记录按下按钮的时间。2次的差值将给出用户在页面上花费的时间。如果它们在页面上停留超过2秒,则秒数将记录到手持设备上的本地数据库中

我遇到的问题是,如果starttime函数中的警报被注释掉,以下代码将无法工作

$(document).ready(function() {
    $('div.m1-root').click(function () {
      //simulate the pagetransition events in mobile framework
        pagename= $(this).attr('id'); 
        starttime();
    //alert("You are leaving\n" + pagename + "\n you were here for \n" + time.toFixed(0) + " seconds"); // This alert will fire but only record the proper time if the next alert is fired
    });
}); 

function starttime()
{
//create a starting timestamp, number of milliseconds since midnight Jan 1, 1970
start = new Date().getTime();
//alert(+ start); // if this alert is commented out the time is not started
    pagetime();
}

function pagetime(pagename){
time = (new Date().getTime() - start) / 1000;
//alert("you have been on " + pagename + " for \n" + time.toFixed(0) + " seconds");
//before we transition, log previous page and time
//if time is greater than 3 seconds we log it (I changed it to -1 so that I would see any figure while testing)
if (time >-1)
{
//DataBase update
db.transaction(function(tx) {tx.executeSql('INSERT INTO CBNapp_Usage VALUES (time)',function(tx,result) {},function(tx,Error) {});});   
//alert("You spent " + time.toFixed(0) + " seconds on " + pagename);
}
}
我在SO和网络上看过,也遇到过类似的情况,但我似乎无法让这些想法在这里发挥作用。我知道这可能是一个计时问题,并尝试了setTimeout或return true来延迟事情,但它不起作用

有人能看一下代码,并建议我如何才能让它正常工作吗

这是我第一次从头开始。请提供具体的例子,以便我可以遵循。该数据库也没有记录,但我会在以后的工作。如果您对如何改进这一点有任何其他具体建议,我将非常欢迎

谢谢你花时间帮忙


Ted

看起来您的所有代码都在按钮单击处理程序中。只有当您收到警报时,它才会显示为有效,因为警报会造成延迟的外观

您需要将starttime置于click处理程序之外,它不应该调用pagetime

$(document).ready(function () {
    starttime(); // this will run as soon as the page loads
    $('div.m1-root').click(function () {
        pagetime();
        // leave the page
    });
});

function starttime() {
    start = new Date().getTime(); // start is global
}

function pagetime() {
    var time = (new Date().getTime() - start) / 1000;
    // do something with time, like logging it to your db
}
在代码中:

  pagename= $(this).attr('id');
当代码执行时,上面的代码将创建一个名为pagename的全局变量。如果您打算这样做,您应该在适当的范围内(即全局范围)进行声明。但是,通常认为最好将其存储为对象属性或闭包,并避免不必要的全局变量

此外,它的使用效率更高:

  pagename = this.id;
该行:

  starttime(); 
调用starttime函数

function starttime() {
  //create a starting timestamp...
  start = new Date().getTime();
同样,确保在适当的范围内声明变量,或使用其他策略共享值。另外,您可以将start保留为日期对象,即不调用getTime

这通常表明alter创建的暂停正在解决您的问题,因此它与时间有关

  pagetime();
现在它调用pagetime

$(document).ready(function () {
    starttime(); // this will run as soon as the page loads
    $('div.m1-root').click(function () {
        pagetime();
        // leave the page
    });
});

function starttime() {
    start = new Date().getTime(); // start is global
}

function pagetime() {
    var time = (new Date().getTime() - start) / 1000;
    // do something with time, like logging it to your db
}
又是一个隐含的全局

在这里,您在设置开始后立即调用pagetime,很可能时钟没有移动。在某些浏览器中,计时器分辨率约为15毫秒,因此,除非CPU非常忙,或者您不太可能在15毫秒的边界上执行其他操作,否则新日期的值将与“开始”的值完全相同

您也可以通过以下方式完成作业:

  time = (new Date()) - start;

但是时间几乎肯定是零,bhamlin有办法解决这个问题。

我对你的样品有点困惑。您在两次单击按钮时都运行相同的代码。。。因此,您只需覆盖开始值,然后立即记录结束时间,因此最多只有几毫秒。谢谢您的回复。当他们输入我试图保存为变量的时间时,开始。我再次得到了他们离开页面的时间,并计算了差异,以获得用户在页面上的时间。当警报未被注释时,它工作良好。我该怎么做呢?谢谢!这就解决了警报问题!我不得不对你的代码做一些修改,以完全符合我的目的,但你却把我搞砸了!非常感谢。我已经执行了你的大部分清理工作。我不能让最后一个工作,我显然有更多的学习要做。我理解局部变量和全局变量之间的区别,但我似乎对如何使局部变量从一个函数用于另一个函数有一个思维障碍。我会继续尝试:-
  time = (new Date()) - start;