Создание тега HTML из объекта Javascript
Каков наилучший способ изменить этот объект
{
src: 'img.jpg',
title: 'foo'
}
в допустимую строку HTML-тега, подобную этой
<img src="img.jpg" title="foo" />
Решение 1
С jQuery это легко; но сложный:
$('<img/>').attr(obj).wrap('<div/>').parent().html();
Любые лучшие идеи?
Ответы
Ответ 1
Почему бы и нет:
$('<img/>', obj).get(0).outerHTML;
Fiddle
Вам не нужно обертывать его в div с помощью нескольких функций и получать html, просто используйте get(0)
, чтобы получить элемент DOM и outerHTML
, чтобы получить представление элемента html.
Если вы используете действительно старые браузеры, вы можете положиться на outerHTML
Ниже приведен пример JSPerf, чтобы сравнить разницу производительности между подходами.
Ответ 2
Возможно, немного более кратким, чем PSL?
$('<img />',object)[0].outerHTML;
Ответ 3
Простой с jquery
$("<div>").append($('<img />',object)).html();
Ответ 4
Если вы делаете только один элемент, это решение является излишним, но я думал, что буду публиковать его в любом случае, поскольку я не знаю, что ваш проект.
Рассматривали ли вы механизм шаблонов JavaScript? В последнее время я играю с Swig, так как он довольно легкий, но есть много вариантов. В принципе, вы создаете шаблон, передаете объект JavaScript, и скомпилированный шаблон выполняется, возвращая строку HTML.
Пример из документации Swig
Шаблон
<h1>{{ pagename|title }}</h1>
<ul>
{% for author in authors %}
<li{% if loop.first%} class="first"{% endif %}>
{{ author }}
</li>
{% else %}
<li>There are no authors.</li>
{% endfor %}
</ul>
JavaScript для создания шаблона
var template = require('swig');
var tmpl = template.compileFile('/path/to/template.html');
tmpl.render({ // The return value of this function is your output HTML
pagename: 'awesome people',
authors: ['Paul', 'Jim', 'Jane']
});
Выход
<h1>Awesome People</h1>
<ul>
<li class="first">Paul</li>
<li>Jim</li>
<li>Jane</li>
</ul>
Ответ 5
Создание элементов html, основанных на объектах, содержащих значения атрибутных атрибутов, такие как
{
src: 'img.jpg',
title: 'foo'
}
почти полностью попадает в парадигму cook.js.
Команда, которую вы выдали с поваром, будет:
img ({
src: 'img.jpg',
title: 'foo'
})
Если данные атрибута хранятся как указано в вашем примере,
в переменной obj
, тогда:
img(obj)
Подробнее об этом см. cook.relfor.co.
Ответ 6
Вот как вы делаете это как строку:
var img = '<img ',
obj = { src : 'img.jpg', title: 'foo' };
for (var prop in obj) {
if (obj.hasOwnProperty(prop)) {
img += prop + '=' + '"' + obj[prop] + '" ';
}
}
img += '/>';
http://jsfiddle.net/5dx6e/
EDIT: Обратите внимание, что код отвечает на точный вопрос. Конечно, небезопасно создавать HTML таким образом. Но это не то, что задал вопрос. Если безопасность была связана с OP, очевидно, что он/она будет использовать document.createElement('img')
вместо строки.
РЕДАКТИРОВАНИЕ 2: Для полноты, здесь гораздо более безопасный способ создания HTML из объекта:
var img = document.createElement('img'),
obj = { src : 'img.jpg', title: 'foo' };
for (var prop in obj) {
if (obj.hasOwnProperty(prop)) {
img.setAttribute(prop, obj[prop]);
}
}
http://jsfiddle.net/8yn6Y/