从HTML标记的数据属性传递对象时的jQuery extend()

时间:2013-12-17 15:05:36

标签: javascript jquery

我通过HTML标记的data-options属性将选项传递给对象。 HTML标记如下所示:

<div class="js-target" data-options="{'openText':'Simon SaysOpen','closeText':'Simon Says Close','loadingText':'Simon Says Wait'};"></div>

使用jQuery的extend()方法将data-options属性中的对象添加到默认对象中。我不确定为什么返回的Object将每个字母视为键值对。

Image of console

这是一个小提琴和我的JavaScript:http://jsfiddle.net/2eQG3/

var element = $('.js-target');

(function(ele) {

  var defaults = {
    'isOpen' : false,
    'isItCool' : true,
    'openText' : 'Open',
    'closeText' : 'Close'   
  };

  var opts = ele.data().options;

  console.log(opts);
  console.log(defaults);

  var settings = $.extend({}, defaults, opts);
  console.log(settings);

})(element);

我希望设置对象看起来像这样:

{
  'isOpen' : false,
  'isItCool' : true,
  'openText' : 'Simon Says Open',
  'closeText' : 'Simon Says CLose',
  'loadingText' : 'Simon Says Wait'
}

2 个答案:

答案 0 :(得分:2)

多数民众赞成因为opts是一个字符串,你必须将它解析为json并将单引号替换为双引号

使用JSON.parse()将其解析为对象,使用.replace()替换单引号,以便将其解析为JSON对象

 var settings = $.extend({}, defaults, JSON.parse(opts.replace(/'/g,'"').replace(';','')));

DEMO

答案 1 :(得分:1)

您所要做的就是切换引号并删除;

<div class="js-target" data-options='{"openText":"Simon SaysOpen","closeText":"Simon Says Close","loadingText":"Simon Says Wait"}'></div>

fiddle