"Декомпилировать" функцию на 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, время: 04:51. |