【问题标题】:Trying to set dynamic JS variables in a function globally尝试在全局函数中设置动态 JS 变量
【发布时间】:2017-03-24 10:05:35
【问题描述】:

我正在尝试使用函数内的动态变量设置本地存储值,该函数将被循环通过。基本上我只是想这样做(有效但不是动态的):

 localStorage.lvlZeroValue = localStorage.lvlZeroMaxValue;

使用这个:

counterMarkers[numberID] = maxMarkers[numberID];

但它不会影响全局级别的“localStorage.lvlZeroValue”

$('#spellCountTackMax').click(function() {

    var counterMarkers = [
        localStorage.lvlZeroValue,
        localStorage.lvlOneValue,
        localStorage.lvlTwoValue,
        localStorage.lvlThreeValue,
        localStorage.lvlFourValue,
        localStorage.lvlFiveValue,
        localStorage.lvlSixValue,
        localStorage.lvlSevenValue,
        localStorage.lvlEightValue,
        localStorage.lvlNineValue
    ];

    var maxMarkers = [
        localStorage.lvlZeroMaxValue,
        localStorage.lvlOneMaxValue,
        localStorage.lvlTwoMaxValue,
        localStorage.lvlThreeMaxValue,
        localStorage.lvlFourMaxValue,
        localStorage.lvlFiveMaxValue,
        localStorage.lvlSixMaxValue,
        localStorage.lvlSevenMaxValue,
        localStorage.lvlEightMaxValue,
        localStorage.lvlNineMaxValue
    ];

        jQuery.fn.onTackSet = function(numberID){

            return this.each(function(){

                if(maxMarkers[numberID] == "" || maxMarkers[numberID] == null || maxMarkers[numberID] == 0 ) {

                    alert("not else ran");
                    $(this).attr('value', "0");
                    $('#spin' + numberID).attr('value', "0");
                    counterMarkers[numberID] = "0";
                    maxMarkers[numberID] = "0";



                } else {
                    alert("else ran");
                    $(this).attr('value', maxMarkers[numberID]);
                    $(this).attr('max', maxMarkers[numberID]);
                    // localStorage.lvlZeroValue = localStorage.lvlZeroMaxValue;
                    alert(counterMarkers[numberID]);
                    alert(maxMarkers[numberID]);

                    // this works but isn't dynamic
                    localStorage.lvlZeroValue = localStorage.lvlZeroMaxValue;

                    // my attempt at making it dynamic doesn't seem to work globally
                    counterMarkers[numberID] = maxMarkers[numberID];

                }
            });
        };

        $("#spin0").onTackSet(0);

所以我很确定我的问题是范围,但我似乎无法正确处理。请帮忙。谢谢!

【问题讨论】:

  • 这可能会有所帮助:stackoverflow.com/questions/2010892/…
  • 你有什么工作,但记住你只是改变了数组的值——你根本不会影响localStorage。您需要将数组的值序列化回您的localStorage。更好的是 - 在你的 LS 中存储两个值,每个值都是一个带有你现在拥有的键的对象。
  • 感谢您的回复。非常感谢。你是什​​么意思'在你的 LS 中存储两个值,每个值都是你现在拥有的键的对象'。我不确定如何使用动态变量名称在此函数中更新 LS 值。序列化是指使用 .serializeArray() 吗?
  • 想我已经明白了。像 localStorage.setItem(countLocation, maxMarkers[numberID]);以便在函数运行时设置本地存储。似乎在工作

标签: javascript jquery variables scope global


【解决方案1】:

您是否需要按照您拥有它们的方式保留存储值的密钥?如果您可以将它们从 lvlZeroValue 更改为 lvl0Value,您可以使用以下方法:

    jQuery.fn.onTackSet = function(numberID){

            return this.each(function(){

                if(localStorage['lvl'+numberID+'MaxValue'] == "" || localStorage['lvl'+numberID+'MaxValue'] == null || localStorage['lvl'+numberID+'MaxValue'] == 0 ) {

                    alert("not else ran");
                    $(this).attr('value', "0");
                    $('#spin' + numberID).attr('value', "0");
                    localStorage['lvl'+numberID+'Value'] = "0";
                    localStorage['lvl'+numberID+'MaxValue'] = "0";



                } else {
                    alert("else ran");
                    $(this).attr('value', localStorage['lvl'+numberID+'MaxValue']);
                    $(this).attr('max', localStorage['lvl'+numberID+'MaxValue']);

                    localStorage['lvl'+numberID+'Value'] = localStorage['lvl'+numberID+'MaxValue'];

                }
            });
        };

如果您需要保留现有的密钥,您仍然可以通过构建不同的数组来调整上述方法以满足您的需求:

var markers = [
        'lvlZeroValue',
        'lvlOneValue',
        'lvlTwoValue',
        'lvlThreeValue',
        'lvlFourValue',
        'lvlFiveValue',
        'lvlSixValue',
        'lvlSevenValue',
        'lvlEightValue',
        'lvlNineValue'
    ];
var maxMarkers = [
        'lvlZeroMaxValue',
        'lvlOneMaxValue',
        'lvlTwoMaxValue',
        'lvlThreeMaxValue',
        'lvlFourMaxValue',
        'lvlFiveMaxValue',
        'lvlSixMaxValue',
        'lvlSevenMaxValue',
        'lvlEightMaxValue',
        'lvlNineMaxValue'
    ];

并像这样使用它们:

localStorage[markers[numberID]] = localStorage[maxMarkers[numberID]];

Here is a fiddle 看看它是如何工作的。

【讨论】:

  • 换个键就好了。我还没有让你的方法在我的代码中工作......但是已经很晚了,我可能会犯粗心的错误。打算早上再打一次。非常感谢您的帮助。
  • 是的!现在一切正常 :) 我不知道您可以将这样的方括号与 vars 一起使用。我对您的解决方案投了赞成票,但它说我不算数,因为我对这个网站太陌生了:/
【解决方案2】:

我想我解决了这个问题:

jQuery.fn.onTackSet = function(countLocation, numberID){

            return this.each(function(){

                if(maxMarkers[numberID] == "" || maxMarkers[numberID] == null || maxMarkers[numberID] == 0 ) {

                    // alert("not else ran");
                    $(this).attr('value', "0");

                    $('#spin' + numberID).attr('value', "0");
                    counterMarkers[numberID] = "0";
                    maxMarkers[numberID] = "0";



                } else {
                    // alert("else ran");
                    $(this).attr('value', maxMarkers[numberID]);
                    $(this).attr('max', maxMarkers[numberID]);
                    // localStorage.lvlZeroValue = localStorage.lvlZeroMaxValue;
                    alert(countLocation);
                    alert(maxMarkers[numberID]);

                    // this works but isn't dynamic
                    // localStorage.lvlZeroValue = localStorage.lvlZeroMaxValue;
                    localStorage.setItem(countLocation, maxMarkers[numberID]);
                    // my attempt at making it dynamic doesn't seem to work globally
                    // counterMarkers[numberID] = maxMarkers[numberID];

                }
            });
        };

        $("#spin0").onTackSet("lvlZeroValue", 0);

...但是您的答案更清晰。非常感谢您的意见。我会按照你的方式尝试。实际上我仍然需要更新 if null, if "" 部分...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-20
    • 1970-01-01
    相关资源
    最近更新 更多