尝试在全局函数中设置动态 JS 变量

Trying to set dynamic JS variables in a function globally

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

 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);

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

您是否需要按照现有的方式保留存储值的密钥?如果您可以将它们从 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 看看它是如何工作的。

我想我是这样做的:

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 "" 部分...