1

我通过连接字符串元素在 Javascript 中创建 HTML 标记。像这样的东西:

var makeButton = function (el) {
    'use strict';
    var config = el.attr("data-config"),
        dyn = $.parseJSON(config),
        hover = false,
        state = 'up',
        hrf = '',
        ...

  if (dyn.href) {
      hrf = 'href="' + dyn.href + '" ';
  }
  ...

  // when all variables have been set, concat  
  iconspan = dyn.icon ? '<span class="ui-icon ' + icn + icp + ics + '">&nbsp;</span>' : '';
  textspan = '<span class="ui-btn-text">' + txt + '</span>';
  innerspan = '<span class="ui-btn-inner">' + textspan + iconspan + '</span>';
  btn = '<a data-role="button" data-wrapperels="span" class="ui-btn ' + hvr + cls + '" ' + data_icp + data_thm + data_min + data_inl + '>' + innerspan + '</a>';
  return btn;
};

当一切都设置好后,我将字符串返回给调用函数,在那里它被插入到正在创建的其他字符串中。我想知道是否有可能存储有关我正在创建的内容的任何信息。由于我没有实例化为 jQuery (= $( btn )),因此我无法使用data().

问题:
所以如果我有一个普通的“字符串”,我有什么替代方案(如果有的话)来存储关于该字符串的信息?

4

2 回答 2

1

因此,如果我有一个普通的“字符串”,我有什么替代方法(如果有的话)来存储该字符串上的信息?

没有任何。原始值可以没有属性,因此您不能它们上存储任何内容。要么切换到对象,要么将信息存储在由字符串值标识的其他静态结构中(当然,您的函数需要返回独特的字符串,并且垃圾收集有些复杂)。

所以你可以只使用String包装你想要返回的字符串的对象。它们在原始操作(例如连接)中具有相同的行为,但您可以在它们上存储其他信息:

btn = new String(btn);
btn.data = …;
return btn;
于 2013-03-23T17:12:59.630 回答
0

我不完全确定您要实现什么(可能值得考虑像mustache.js下划线模板这样的模板语言,而不是连接字符串),但是如果您想在两个分散的数据位之间创建关系,那么关联数组应该可以完成这项工作。

// Use a JavaScript object as an Associative Array.
dataByButtonMarkupMap = {};

// Build your button markup as before.
btnMarkup = "..."

// Use the markup as a Key in the associative array, don't worry that it's massive, as long
// as it's a string (or can be coerced to one), it can be used as a key.
dataByButtonMarkupMap[btnMarkup] = "some data";

// You can now retrieve that data via the button markup
var myData = dataByButtonMarkupMap[btnMarkup];

可能值得考虑重构您的设计,以便您返回一个封装模板字符串和数据的对象,而不是传递字符串,例如:

function makeButton() { 
    // ...

    // Return an object instead of a string so you can encapsualte
    // additional data alongside the template string.
    return {
        template: btn,
        data: "some data"
    }
}

希望有帮助。

于 2013-03-23T16:47:09.667 回答