Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 12.03.2012, 17:17
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

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


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

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

Просьба помочь, думаю тут несложно.
Ответить с цитированием
  #2 (permalink)  
Старый 12.03.2012, 20:14
Профессор
Отправить личное сообщение для nikita.mmf Посмотреть профиль Найти все сообщения от nikita.mmf
 
Регистрация: 01.02.2010
Сообщений: 364

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);
};
Ответить с цитированием
  #3 (permalink)  
Старый 13.03.2012, 08:18
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Спасибо, кажется все работает.
А вторую функцию так достаточно переписать?
Joomla.removeMessages = function() {
    var container = document.getElementById('system-message-container');
    container.innerHTML = '';
}
Ответить с цитированием
  #4 (permalink)  
Старый 13.03.2012, 10:54
Профессор
Отправить личное сообщение для nikita.mmf Посмотреть профиль Найти все сообщения от nikita.mmf
 
Регистрация: 01.02.2010
Сообщений: 364

Лучше так
Joomla.removeMessages = function() {
    var = document.getElementById('system-message-container'), child;
    while ( (child = container.firstChild)  ) container.removeChildren( child );
}
Ответить с цитированием
  #5 (permalink)  
Старый 01.05.2012, 15:24
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Сообщение от nikita.mmf Посмотреть сообщение
Лучше так
Joomla.removeMessages = function() {
    var = document.getElementById('system-message-container'), child;
    while ( (child = container.firstChild)  ) container.removeChildren( child );
}
А чем это лучше чем innerHTML = '' ?
Просто один человек увидел этот код, и собсно "в качестве оптмизимации" предложил innerHTML = ''. А я и не знаю в чем выражается различие этих методов.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Выполнить функцию заранее неизвестную Neokortex jQuery 2 13.02.2012 12:41
Актуальнось Mootools? dron79 Библиотеки/Тулкиты/Фреймворки 4 26.08.2010 13:38
Как получить указатель на элемент вызвавший функцию pelayo Общие вопросы Javascript 9 29.06.2010 23:32
mootools + flash x-yuri Библиотеки/Тулкиты/Фреймворки 0 13.08.2009 07:53
MOOTOOLS - Обсуждение функционала фреймворка mootools на русском iZet Библиотеки/Тулкиты/Фреймворки 0 12.11.2008 08:24