Javascript-форум (https://javascript.ru/forum/)
-   Библиотеки/Тулкиты/Фреймворки (https://javascript.ru/forum/library-toolkit-framework/)
-   -   "Декомпилировать" функцию на MooTools (https://javascript.ru/forum/library-toolkit-framework/26549-dekompilirovat-funkciyu-na-mootools.html)

danik.js 12.03.2012 17:17

"Декомпилировать" функцию на 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);
};


Как грамотно заменить итерацию по свойствам объекта и элементам массива я не знаю. Я так же не уверен что все делаю правильно.

Вот готовая тестовая площадка

Просьба помочь, думаю тут несложно.

nikita.mmf 12.03.2012 20:14

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);
};

danik.js 13.03.2012 08:18

Спасибо, кажется все работает.
А вторую функцию так достаточно переписать?
Joomla.removeMessages = function() {
    var container = document.getElementById('system-message-container');
    container.innerHTML = '';
}

nikita.mmf 13.03.2012 10:54

Лучше так
Joomla.removeMessages = function() {
    var = document.getElementById('system-message-container'), child;
    while ( (child = container.firstChild)  ) container.removeChildren( child );
}

danik.js 01.05.2012 15:24

Цитата:

Сообщение от nikita.mmf (Сообщение 162821)
Лучше так
Joomla.removeMessages = function() {
    var = document.getElementById('system-message-container'), child;
    while ( (child = container.firstChild)  ) container.removeChildren( child );
}

А чем это лучше чем innerHTML = '' ?
Просто один человек увидел этот код, и собсно "в качестве оптмизимации" предложил innerHTML = ''. А я и не знаю в чем выражается различие этих методов.


Часовой пояс GMT +3, время: 12:44.