Javascript 在动态函数中覆盖jQuery全局Objevt变量

Javascript 在动态函数中覆盖jQuery全局Objevt变量,javascript,jquery,html,Javascript,Jquery,Html,在全局对象中,有一些设置应该根据某些用户输入进行更改。例如,如果为div 1选择“否”,则div one不仅会被隐藏,变量的值也会更新为0 问题在于隐藏div的函数是动态的,它使用数据来帮助找到要隐藏的正确div。我无法覆盖正确的全局变量 我已经尝试过一些方法,比如添加标记以帮助确定特定变量的目标,但效果并不理想 HTML jQuery var settings = { enableDivOne: 1, // overwrite this when div 1 option is ch

在全局对象中,有一些设置应该根据某些用户输入进行更改。例如,如果为div 1选择“否”,则div one不仅会被隐藏,变量的值也会更新为0

问题在于隐藏div的函数是动态的,它使用数据来帮助找到要隐藏的正确div。我无法覆盖正确的全局变量

我已经尝试过一些方法,比如添加标记以帮助确定特定变量的目标,但效果并不理想

HTML

jQuery

var settings = {

    enableDivOne: 1, // overwrite this when div 1 option is changed
    enableDivTwo: 1 // overwrite this when div 2 option is changed

};

$('.toggle').change(function () {
    var target = $(this).data("target"),
        element = $(this),
        name = element.val(),
        is_checked = element.prop('checked'),
        setting = $(this).data("setting");

    if  (name == 'yes') {
        $(target).slideDown(300);
        console.log(settings.enableDivOne);
        console.log(settings.enableDivTwo);
    } else {
        $(target).slideUp(300);
        console.log(settings.enableDivOne);
        console.log(settings.enableDivTwo);
    }
});
总而言之,我试图找出一种动态的方法来改变某些变量


我相信你要找的是这样的东西

    var settings = {

    enableDivOne: 1,
    enableDivTwo: 1

};

$('input:radio.toggle').change(function(e) {
    var target = $('#div-' + $(this).data("target")),
        value = $(this).val();
    settings[$(this).prop('name')] = value;

    target.slideToggle(300);
    console.log("div one :" + settings.enableDivOne);
    console.log("div two :" + settings.enableDivTwo);
});
我把你的目标分数从

data-target=".div-one"

作为个人喜好;感觉更有语义

您可以在此处进行测试:

我想你差不多已经知道答案了,但我会告诉你一些可能有用的东西

对象属性实际上只是字符串。当它们是有效的JavaScript标识符时,可以使用点表示法访问它们,当它们变得更复杂时,可以使用括号表示法访问它们。这意味着您可以使用标记中的任何常量值作为参考点。在您的示例中,两个不同的常量是对单选按钮进行分组的
name
属性

对标记没有任何更改,请考虑此示例。您可以通过找出一个对您有效的命名模式来构建这个模型,这可能取决于您计划如何在代码的其他部分中使用这些值

var boolMap={
“是”:是的,
“否”:错误
};
变量设置={};
$('.toggle').change(函数(){
var target=$(this).data('target'),
name=$(this.attr('name'),
value=$(this.val();
if(boolMap[value]){
美元(目标)。向下滑动(300);
}否则{
美元(目标).slideUp(300);
}
设置[名称]=(布尔映射[值]?1:0);
控制台日志(设置);
});
div{
宽度:300px;
高度:300px;
背景:黑色;
颜色:白色;
利润率:10px;
}
第1部分

对 不 第2组

对 不 一个 两个
您知道可以使用括号语法引用属性吗?例如,你可以做
设置[name]=0
。是的,我同意-它确实让人感觉更干净、更具语义,这是一个很好的提示。奇怪的是,如果设置对象中有另一个设置,例如divSettings,这会发生什么变化?请参见:您只需在对象树上向下移动一个级别,将
settings[$(this).prop('name')]
更改为
settings.divSettings[$(this).prop('name')]
是否可以使.divSettings部分成为动态的-可能是在HTML中的某个地方等?确保可以使用DOM的任何属性,如id eg
settings[target.prop('id')][$(this.prop('name'))
这可能更好地解释了我的意思-如果需要,我想通过从html中提取更精确的内容来定位settings.divSettings。
    var settings = {

    enableDivOne: 1,
    enableDivTwo: 1

};

$('input:radio.toggle').change(function(e) {
    var target = $('#div-' + $(this).data("target")),
        value = $(this).val();
    settings[$(this).prop('name')] = value;

    target.slideToggle(300);
    console.log("div one :" + settings.enableDivOne);
    console.log("div two :" + settings.enableDivTwo);
});
data-target=".div-one"
data-target="one"