2013-03-23 2 views
1

Я создаю HTML-разметку в Javascript путем объединения элементов строки. Что-то вроде этого:Возможно ли хранить информацию о неконкретизированных объектах в jQuery/Javascript?

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().

Вопрос:
Так что, если у меня есть равнина «строка», какие альтернативы у меня есть (если таковые имеются) для хранения информации на этой строке?

+0

WTH является «* не-экземпляр объекта *»? – Bergi

+0

:-) ах хорошо ... строка. – frequent

ответ

1

Итак, если у меня есть простая «строка», какие у меня есть альтернативы (если есть) для хранения информации о этой строке?

Отсутствует. примитивные значения могут не иметь свойств, поэтому вы ничего не можете хранить на им. Либо вы переключаетесь на объекты, либо сохраняете информацию в какой-либо другой статической структуре, где она идентифицируется строковым значением (конечно, ваша функция должна будет возвращать отличительные строки, а сборка мусора несколько сложна).

Итак, вы можете просто использовать объекты String, обертывающие строки, которые вы хотите вернуть. Они будут иметь такое же поведение в примитивных операций (например, конкатенация), но вы можете хранить дополнительную информацию о них:

btn = new String(btn); 
btn.data = …; 
return btn; 
+0

приятно. Это было более или менее то, что я искал, но не знал, как спросить. – frequent

0

Я не совсем уверен, чего вы пытаетесь достичь (возможно, стоит рассмотреть язык шаблонов, например, mustache.js или underscore templates вместо конкатенации строк), но если вы хотите создать связь между двумя дискретными битами данных , то Associative Array должен выполнить эту работу.

// 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" 
    } 
} 

Надежда, что помогает.

+0

Спасибо. И единственная идея, с которой я столкнулся до сих пор. Что касается шаблонов языков: я пытаюсь найти более быстрый способ создания определенных элементов, если это возможно, в чистом Javascript, поэтому я действительно не хочу добавлять какие-либо сторонние вещи, если это возможно. – frequent

+0

В JavaScript нет «ассоциативных массивов». Пожалуйста, не используйте этот термин. (refs: [1] (http://www.hunlock.com/blogs/Mastering_Javascript_Arrays#quickIDX9), [2] (http://andrewdupont.net/2006/05/18/javascript-associative-arrays-considered- вредно /)) – Bergi

+0

Обе эти статьи демонстрируют, что JavaScript поддерживает ассоциативные массивы (структура данных, где дни сопоставляются с уникальным ключом), авторы просто призывают людей не использовать для них объект Array. – JonnyReeves

Смежные вопросы