14 апреля 2006 года, в 14:03
JavaScript: создание DOM фрагментов
Если приходилось когда-нибудь писать JavaScript и приходилось в JavaScript’е писать что-то вроде:
var p = document.createElement( "p" );
p.appendChild( document.createTextNode( "Настоящий рыба фиш." ) );
var div = document.createElement( "div" );
div.setAttribute( 'id', 'new' );
div.appendChild( p );
то это может быть вам полезно.
Проблема: когда создаёшь более, чем один элемент, вложенные друг в друга, код становится очень сложным.
Предлагаю простой инструмент решения задачи — функцию create()
(исходник ниже). Например, создаём параграф текста:
var el = create( "p", { }, "Farewell, Love!" );
Или div с параграфом и ссылкой внутри него:
var div = create( "div", { id: "new", style: "background:#fff" },
create( "p", { align: 'center' },
"вступление : ",
create( 'a', { href: "http://ua.fishki.net/picso/kotdavinchi.jpg" },
"картинка" ),
" : конец" )
);
Или вот, делаем таблицу:
var holder = document.getElementById( "holder2" );
var table;
var td;
holder.appendChild(
table =
create( "table", {id: 'ugly', cols:3},
create( "tbody", {},
create( "tr", {},
create( "td", { width: '10%' },
"hello" ),
td =
create( "td", { style: 'background: #fcc' },
"there" ),
create( "td", { Class: 'special2' }, "everywhere" )
)
)
)
);
Обратите внимание:
- IE требует
tbody
элемент, иначе отказывается показывать таблицу. - Аттрибут
class
с чем-то конфликтует, поэтому приходится писать его какClass
. Кажется, на результат это влияния не оказывает. -
table =
иtr =
в примере позволяют сохранить созданные вложенные объекты для дальнейшей работы с ними. - Этот код работает и в IE, и в Mozilla, и в Opera.
Сама функция
// Ivan Kurmanov, http://ahinea.com/
//
// No warrany of any kind. The code is free, use any opensource license you like.
// 2006-04-14 13:53
function create( name, attributes ) {
var el = document.createElement( name );
if ( typeof attributes == 'object' ) {
for ( var i in attributes ) {
el.setAttribute( i, attributes[i] );
if ( i.toLowerCase() == 'class' ) {
el.className = attributes[i]; // for IE compatibility
} else if ( i.toLowerCase() == 'style' ) {
el.style.cssText = attributes[i]; // for IE compatibility
}
}
}
for ( var i = 2; i<arguments.length; i++ ) {
var val = arguments[i];
if ( typeof val == 'string' ) { val = document.createTextNode( val ) };
el.appendChild( val );
}
return el;
}
Оп. :-)