"Декомпилировать" функцию на MooTools
Имеется вот такая вот функция:
/**
* Render messages send via JSON
*
* @param object messages JavaScript object containing the messages to render
* @return void
*/
Joomla.renderMessages = function(messages) {
Joomla.removeMessages();
var container = document.id('system-message-container');
var dl = new Element('dl', {
id: 'system-message',
role: 'alert'
});
Object.each(messages, function (item, type) {
var dt = new Element('dt', {
'class': type,
html: type
});
dt.inject(dl);
var dd = new Element('dd', {
'class': type
});
dd.addClass('message');
var list = new Element('ul');
Array.each(item, function (item, index, object) {
var li = new Element('li', {
html: item
});
li.inject(list);
}, this);
list.inject(dd);
dd.inject(dl);
}, this);
dl.inject(container);
};
/**
* Remove messages
*
* @return void
*/
Joomla.removeMessages = function() {
var children = $$('#system-message-container > *');
children.destroy();
}
messages выглядит примерно так :
{errors: ['Error 1 ', 'Error 2'], notices: ['Notice 1', 'Notice 2']}
Это взято как можно заметить из джумлы. Я много работаю с этой cms'кой, и тенденция разработчиков к вживлению мутулзов даже на простую контентную страницу, не имеющую никакой динамичности меня обеспокоила. И я предложил немного отделить мух от котлет. Короче, предыстория эта нафиг не нужна никому :) Вот что нужно сделать: Нужно переписать эти две функции так чтобы они не зависили от MooTools, тоесть работали без него, но при этом не должна пострадать совместимость с браузерами. Пока что у меня получилось это:
JJoomla.renderMessages = function(messages) {
Joomla.removeMessages();
var container = document.getElementById('system-message-container');
var dl = document.createElement('dl');
dl.id = 'system-message';
dl.role = 'alert';
Object.each(messages, function (item, type) {
var dt = document.createElement('dt');
dt.className = type;
dt.innerHTML = type;
dl.appendChild(dt);
var dd = documentElement('dd');
dd.className = type + ' message';
var list = document.createElement('ul');
Array.each(item, function (item, index, object) {
var li = document.createElement('li');
li.innerHTML = item;
list.appendChild(li);
}, this);
dd.appendChild(list);
dl.appendChild(dd);
}, this);
container.appendChild(dl);
};
Как грамотно заменить итерацию по свойствам объекта и элементам массива я не знаю. Я так же не уверен что все делаю правильно. Вот готовая тестовая площадка Просьба помочь, думаю тут несложно. |
JJoomla.renderMessages = function(messages) {
Joomla.removeMessages();
var container = document.getElementById('system-message-container');
var dl = document.createElement('dl');
dl.id = 'system-message';
dl.role = 'alert';
var type, item, dt, dd, list, li;
for ( type in messages ) {
if ( Object.prototype.hasOwnProperty.call ( messages, type ) ) {
item = messages[ type ];
dt = document.createElement('dt');
dt.className = type;
dt.innerHTML = type;
dl.appendChild( dt );
dd = document.createElement('dd');
dd.className = type + ' message';
list = document.createElement('ul');
for ( var i = 0, len = item.length; i < len; i++ ) {
li = document.createElement('li');
li.innerHTML = item[ i ];
list.appendChild( li );
}
dd.appendChild( list );
dl.appendChild( dd );
}
}
dt = dd = list = li = null;
container.appendChild(dl);
};
|
Спасибо, кажется все работает.
А вторую функцию так достаточно переписать?
Joomla.removeMessages = function() {
var container = document.getElementById('system-message-container');
container.innerHTML = '';
}
|
Лучше так
Joomla.removeMessages = function() {
var = document.getElementById('system-message-container'), child;
while ( (child = container.firstChild) ) container.removeChildren( child );
}
|
Цитата:
Просто один человек увидел этот код, и собсно "в качестве оптмизимации" предложил innerHTML = ''. А я и не знаю в чем выражается различие этих методов. |
| Часовой пояс GMT +3, время: 00:36. |