当我关闭应用程序时,特定值不会存储在phonegap中的localstorage中...其他请...为什么?

时间:2014-04-26 15:32:42

标签: javascript jquery cordova phonegap-plugins cordova-3

我整整一周都试着让这个工作起来,但它还是不行!我非常肯定这不是什么大不了的事!我是phonegap和jquery的新手,我认为我没有正确实现脚本。

所以我在我的应用程序中有他的功能,我有5个生命,每次我按下按钮他们减少,他们在6秒后重新生成,如果应用程序关闭!! (进一步我将改变时间,我将删除按钮,我将设置每次玩家失去一个lvl时移除生命,并且如果生命== 0则不启动lvl因此这不是问题现在)

这个脚本会缩短我按下移除生命按钮和当前时间的时间,如果它大于或等于6秒,它会增加代表该间隙的生命。

我还有一个网络示例,除了一个奇怪的事实,即生命和日期值不会在localstorage中更新,而且只有当我在页面上随机点击某个地方时才会在div中更新。 (这个脚本帮助我有人做,但他也不知道如何修复bug) https://student.sps-prosek.cz/~eisead11it/web/IS/Administrace/index.html

我的phonegap应用程序中需要这个脚本。 在实现它之后,我看到了另一个大问题:如果我关闭应用程序并重新打开它,它就不起作用。

我今天也在移动版上做了一些步骤,试图找到错误... 我从设备中提取了每一步新鲜的localstorage db:

1)我清理了本地存储,然后我进入了应用程序,我杀死了一些生命并重新生成了它们。 2)我离开了应用程序,所有5个生命活跃,我关闭它 3)1秒后我重新打开它,我看到来自localstorage的数据是空的 4)当我按下删除实时按钮时,生命减少但没有数据存储在本地存储中!没有生命在重生 5)如果我等待5 * 15秒(所有生命的时间都已重新生成,此时,应用程序和本地存储中的当前生命状态为0)或者如果我最小化应用程序并最大化并且我按下再次按下按钮,日期存储在localstorage中,当前生命设置为4,生命开始正常重建,直到它们达到5。

如果我重新输入应用程序并按下按钮,我不知道为什么没有存储日期。这可能是个问题。

否则在第一次运行应用程序时一切正常。

我在我的galaxy s2,galaxys2 mini,eclipse模拟器和ripple emlator上进行了测试,并且对所有这些效果仍然相同。

奇怪的是,lvl和life值在localsorage中100%完美存储,当我重新进入应用程序时,它们仍然存在,除了重新输入应用程序后的日期值丢失。

我真的不知道为什么会这样?我的错误是因为日期没有正确保存,或者当我再次启动应用程序时它被删除。

这是魔术片:

只是一个小日期验证员......

Date.prototype.isValid = function(first_argument) {
    if ( Object.prototype.toString.call(this) !== "[object Date]" )
        return false;
    return !isNaN(this.getTime());
}

从localStorage

中检索变量的主要var声明
var timeout = null;
var maxlife = 5;
if (undefined === localStorage.life) {
    localStorage.life = maxlife;
}
if (undefined === localStorage.date||localStorage.date!="") {
    localStorage.date = "";
    var date = null;
}else{
    var date = new Date(Number(localStorage.date));
    if(!date.isValid()){
        date = null;
    }
}
var timeoutTime = 5 * 60000;
var life = Number(localStorage.life);

失去生命,如果还不存在则设定日期。设置超时并减去生命(并将其写入localstorage)。

function loseLife() {
    if (null === date) {
        date = new Date();
        localStorage.date = date.getTime();
        timeout = setTimeout(function(){addLife()}, timeoutTime);
    }
    life--;
    localStorage.life = life;
    lives.innerHTML = life;
    console.log(life);
}

添加生命,设置日期新日期或完全重置日期。如果需要,设置超时,并添加生命(并将其写入localstorage)。

function addLife() {
    life++;
    localStorage.life = life;
    if (life < maxlife) {
        date = new Date();
    localStorage.date = date.getTime();
        timeout = setTimeout(function(){addLife()}, timeoutTime);
    } else {
        date = null;
    localStorage.date = "";
    }
    lives.innerHTML = life;
}

在这里,您可能需要更改模糊的钩子(窗口不可见)和焦点(窗口再次可见)。模糊只是清除超时,所以它不会弄乱我们。

window.addEventListener('blur', function () {
    clearTimeout(timeout);
});

这个函数检查它可以减去从现在的差异和我们失去生命的日期中获得生命所需的时间。

function tillNow(){
    if (life < maxlife&&date!=null) {
        var d = new Date();
        var diff = d - date;
        while (diff - timeoutTime > 0) {
            diff = diff - timeoutTime;
            if (life < maxlife) {
                life++;
                console.log("add");
            }else{
                date = null;
                localStorage.date = "";
                break;
            }
        }
        lives.innerHTML = life;
        localStorage.life = life;
        if (life < maxlife) {
            date = new Date((new Date()).getTime()-diff);
            localStorage.date = date.getTime();
            timeout = setTimeout(function(){addLife()}, timeoutTime-diff);
        }
    }
}

焦点只需调用untilNow()

window.addEventListener('focus', function () {
    tillNow();
});

Onload与焦点相同,但最初用div填充div ...

window.onload=function(){
    var lives = document.getElementById("lives");
    lives.innerHTML = life;
    tillNow();
}

好吧,这是我的回购:https://bitbucket.org/alecstheone/whatsnap

并且js存储在/platforms/android/assets/www/js/index.js中(不在第一个www文件夹中)

如果有人可以看看是否可能是我实现的梦想,请在整整一天内整整一天修复它而不需要重新开始,并且因为在电话空白方面有一些支持。

1 个答案:

答案 0 :(得分:0)

经过一周的痛苦,我终于修好了它。 有一个错误:在第二个如果在主var声明中它应该是这样的:

if (undefined === localStorage.date||localStorage.date=="")

我还删除了模糊和焦点事件,并使用了phonegap中的onDeviceReady事件进行第一次声明和untilNow()调用!