【问题标题】:Using a variable for an object property name in an array?使用变量作为数组中的对象属性名称?
【发布时间】:2013-11-23 11:09:55
【问题描述】:

使用这个简洁的小插件http://ricostacruz.com/jquery.transit,非常类似于 jQuery 的内置支持:

$('.some-element').css({propname1: 'value1', propname2: 'value2'});

它是这样工作的:

$('.some-element').transition({ x: '40px', y: '40px' });

我可以像这样对属性值使用变量(这可行):

var xVal = '40px',
    yVal = '40px';
$('.some-element').transition({ x: xVal, y: yVal });

但我需要能够通过这样的变量指定转换的“类型”(这不起作用):

<div class="some-element" data-ca-type1="x" data-ca-type2="y"></div>

var xVal = '40px',
    yVal = '40px',
    target = $('.some-element'),
    type1 = target.data('caType1'),
    type2 = target.data('caType2');
target.transition({ type1: xVal, type2: yVal });

【问题讨论】:

  • 注意:var x-val 是一个语法错误,变量名中不能有 -
  • class=".some-element" 应该是 class="some-element" 所以你可以用 . 选择它
  • 什么“不起作用”?有什么问题?发生了什么,没有发生?您在控制台中看到任何错误吗? caType1 是什么?这是一个变量,还是你的意思是target.data('caType1')
  • 没有错误,只是不执行操作,就像如果名称/值不正确,.css 可能不会在控制台中引发错误

标签: jquery arrays properties


【解决方案1】:

您可以在数组和对象上使用[] 来设置动态属性值。

transitionData = {};
transitionData[type1] = xVal;
transitionData[type2] = yVal;
target.transition(transitionData);

我更喜欢内联这些东西,这可以通过实例化一个匿名函数来完成:

target.transition(new function () {
    this[type1] = xVal;
    this[type2] = yVal;
}());

虽然通常我可能只是将转换数据直接保存在 [data-*] 属性中作为 JSON,利用 jQuery 的 .data() 自动解析:

HTML:
<div data-ca='{"x":"40px","y":"40px"}'></div>
JS:
$('[data-ca]').each(function () {
    $(this).transition($(this).data('ca'));
});

【讨论】:

  • 这是迄今为止最简单的方法,谢谢!哦,伙计,我知道我应该早点问...会为我节省大量时间 =)
【解决方案2】:

您需要先创建一个空对象(或具有非动态键的对象),然后使用方括号表示法设置动态键的值。像这样的:

var xVal = '40px',
    yVal = '40px',
    target = $('.some-element'),
    type1 = target.data(caType1),
    type2 = target.data(caType2);
var options = {}
options[type1] = xVal;
options[type2] = yVal;
target.transition(options);

使用对象文字语法创建对象时,键始终被视为字符串值。 {x: 0} 等价于{"x": 0}{'x': 0},所以即使你有一个变量x,JavaScript 引擎也不知道它应该使用x 的值而不是字符串"x"钥匙。

【讨论】:

  • 是的,同样的事情,一旦我在 target.data('caType1'); 周围添加 '' 就没有错误了但仍然没有应用动画
【解决方案3】:

在对象文字中,属性名称始终是文字。您需要使用数组语法来创建具有计算属性名称的属性:

var x_val = '40px',
    y_val = '40px',
    target = $('.some-element'),
    type1 = target.data('caType1'),
    type2 = target.data('caType2'),
    options = {};
options[type1] = x_val;
options[type2] = y_val;
target.transition(options);

【讨论】:

  • 和 anthony 一样,只是需要在 data props 周围加上引号,谢谢
  • @user1157601 不公平,我发布答案后你改变了问题。
  • 抱歉,Barmar,没有更改问题,只是修正了一些错别字...您的答案与 Anthonys 相同,我尝试将您的答案 +1 认为有用,但我没有所需的代表还
  • 当我写答案时,caType1caType2 周围没有引号,所以我怎么知道那些是拼写错误?而type1type2 的值来自哪里对于问题和答案来说并不重要。您接受的答案甚至不包括这些行。
猜你喜欢
  • 2013-06-19
  • 2011-11-29
  • 2010-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-18
相关资源
最近更新 更多