Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 25.05.2010, 21:38
Аватар для dmitlantis
Интересующийся
Отправить личное сообщение для dmitlantis Посмотреть профиль Найти все сообщения от dmitlantis
 
Регистрация: 21.03.2009
Сообщений: 10

"Сценарий замедляет работу IE"
Всем доброго времени суток!

На сайте установлена Joomla 1.5 с компонентом Scatalog + модуль mod_scatalog_categories, который представляет собой раскрывающееся древо категорий каталога, встраивающее в страницу и использующее фреймворк MooTools.js и скрипт rdTree.js

Столкнулся с такой проблемой:
В IE (в остальных нормально) при переходе на любую другую страницу (или даже обновлении оной, неважно), перед каждой сменой страницы вылетает сообщение с кнопками "Да" - "Нет":
"Сценарий на данной странице замедляет работу IE. При продолжении выполнения сценария, компьютер не сможет реагировать, Прервать сценарий?."

Протыкав rdTree.js, обнаружил что ошибка возникает при выполненении метода this_cycle.tableWrapper(link); в rdTree.makeLinkForLiText (строка 79).

Сам с Mootools дел не имел, но работал с jQuery, есть догадка что причина в зацикливании обработки ветвей древа, но без имения понятия структуры MooTools, боюсь что с этим не разобраться.

Прошу помощи, любые догадки и идеи по устранению проблемы. Заренее спасибо.

rdTree.js:
/*
Script: RIA DHTML Tree 0.8.1
	Class for make simple DHTML Tree.
	[url]http://linux.ria.ua/rdTree/[/url]

Date:
	05 August 2008
	
Browser Compatibility:	
	Safari 2+, Internet Explorer 6+, Firefox 2+ (and browsers based on gecko), Opera 9+.

License:
	LGPL

Author:
	Oleg Cherniy <oleg.cherniy(at)gmail(dot)com>
	
*/

var rdTree = new Class({
					   
	//Implements: Options,

	options: {
		img: {
			path: 'img/rdTree/firebug/',
			itemName: '',
			plusName: 'plus.gif', 
			minusName: 'minus.gif'
		},
		classes: {
			selected: 'selected',
			opened: 'opened',
			first: 'first',
			last: 'last',
			center: 'center',
			centerNode: 'centerNode',
			lastNode: 'lastNode'
		},
		openSelectedNode: true
	},

	initialize: function(id, options){
		this.id = id;
		this.setOptions(options);
		this.makeLinkForLiText();
		this.makeSelected();
		this.make();
	},

	openParentForSelectedLink: function(link){
		var li = link.getParent('li');
		var ul = li.getParent();
		if (ul != $(this.id)) {
			var liParent = ul.getParent();
			ul.addClass(this.options.classes.opened);
			if (li.getParent().getLast() == li) {
				li.getElement('ul').setStyle('background', 'none'); 
			}
			this.openParentForSelectedLink(liParent.getElement('a'));
		}
	},
	
	makeLinkForLiText: function() {
		var menus = $(this.id).getElements('li');
		var this_cycle = this;
		var link;
		
		menus.each(function(li, i){
			
			if (li.firstChild.nodeType!=1) {
				var text = li.firstChild.nodeValue;
				link = new Element('a');
				link.set('text',text);
				link.replaces(li.firstChild);
			} else {
				link = li.getElement('a');
			}
			this_cycle.tableWrapper(link);
		});
	},
	
	tableWrapper: function(link) {
		var table = new Element('table');
		table.inject(link, 'before');
		var tbody = new Element('tbody');
		tbody.inject(table);
		var table_row = new Element('tr');
		table_row.inject(tbody);
		var icon_container = new Element('td', {'class': 'icon'} );
		icon_container.inject(table_row);
		var link_container = new Element('td');
		link_container.inject(table_row); 
		link.inject(link_container);
	}, 
	
	getSelected: function() { return $(this.id).getElement('a.'+this.options.classes.selected) },

	makeSelected: function() {
		var selectedLink = this.getSelected();
		if ($chk(selectedLink)) {
			this.openParentForSelectedLink(selectedLink);
		}
	},

	changeSelected: function(link) {
		var selectedLink = this.getSelected();
		if ($chk(selectedLink)) {
			selectedLink.removeProperty('class');
		}
		link.setProperty('class', this.options.classes.selected);
		if (this.options.openSelectedNode) {
			var ul = link.getParent('li').getElement('ul');
			if(ul) {
			  this.expandNode(ul,ul.getParent().getElement('img'));			
			}
		}
		

	},

	make: function(){
		var menus = $(this.id).getElements('li');
		var options = this.options;
		var this_cycle = this;
			var link = li.getElement('a');
			var img = new Element('img');
			var ul = li.getElement('ul');

			if (li.getParent().getLast() == li)  {
				li.setProperty('class', options.classes.last);
			} else {
				li.setProperty('class', options.classes.center);
			}
			
			if ($chk(ul)) {
				this_cycle.applyNode(li,link,ul);
			} else {
				this_cycle.applyItem(li,link);
			}
			
			// Change link setup
			link.addEvent('click', function(){
				this_cycle.changeSelected(link);
			});
			 
	},
	
	
	applyNode: function(li,link,ul){
		var img = new Element('img');
		var td = link.getParent().getParent().firstChild;
		var imgSrc;
		var options = this.options;
		var this_event = this;
		
		if (ul.getStyle('display') == 'block') {
			imgSrc = this.options.img.minusName;
		} else {
			imgSrc = this.options.img.plusName;
		}
		img.inject(td).setProperties({'src': this.options.img.path + imgSrc});
		
		img.setStyle('cursor', 'pointer');
		
		if (li.getParent().getLast() == li) {
			ul.setStyle('background', 'none');
		}
		img.addEvent('click', function(event){
			//event.preventDefault();
			event.cancelBubble = true;
			this_event.toggleNode(ul,img);
		});
		
		if (li.getParent().getLast() == li) {
			li.setProperty('class', this.options.classes.lastNode);
		} else {
			li.setProperty('class', this.options.classes.centerNode);
		}
	},
	
	applyItem: function(li,link){
		if (this.options.img.itemName != '') {
			var img = new Element('img');
			var td = link.getParent().getParent().firstChild;
			img.inject(td).setProperties({'src': this.options.img.path + this.options.img.itemName});
		}
	},
	
	/* ----------------------------------------- */
	// Service methods
	toggleNode: function(ul,img) {
		if (ul.hasClass(this.options.classes.opened)) {
			this.collapseNode(ul,img);
		} else {
			this.expandNode(ul,img);
		}
	},
	
	expandNode: function(ul,img) {
		ul.setProperty('class', this.options.classes.opened);
		img.setProperties({'src': this.options.img.path + this.options.img.minusName});
	},
	
	collapseNode: function(ul,img) {
		ul.removeProperty('class');
		img.setProperties({'src': this.options.img.path + this.options.img.plusName});;
	},
	
	expandAll: function(id) {
		var root;
		if (id != null) {
			root = $(id).getParent('li');
		} else {
			root = $(this.id);
		}
		var uls = root.getElements('ul');
		var this_cycle = this;
		
		uls.each(function(ul, i){
			if (!(ul.hasClass(this_cycle.options.classes.opened))) {
				this_cycle.expandNode(ul,ul.getParent().getElement('img'));
			}			
		});
	},
	
	collapseAll: function(id) {
		var root;
		if (id != null) {
			root = $(id).getParent('li');
		} else {
			root = $(this.id);
		}
		var uls = root.getElements('ul');
		var this_cycle = this;
		
		uls.each(function(ul, i){
			if (ul.hasClass(this_cycle.options.classes.opened)) {
				this_cycle.collapseNode(ul,ul.getParent().getElement('img'));
			}			
		});
	},
	
	checkSelectedVisible: function(ul) {
		if (ul != $(this.id)) {
			if (!(ul.hasClass(this.options.classes.opened))) {
				this.expandNode(ul,ul.getParent().getElement('img'));
				this.checkSelectedVisible(ul.getParent('ul'));
			}
		}
	},
	
	select: function(id) {
		this.changeSelected($(id));
		this.checkSelectedVisible($(id).getParent('ul'));
	}
	
});
rdTree.implement(new Options);
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как найти работу? goshala Работа 28 09.01.2017 22:59
сценарий замедляет работу IE Shaci jQuery 16 17.03.2010 19:15
Как узнать, завершила ли свою работу рекурсивная функция Ajax Общие вопросы Javascript 4 13.05.2009 14:50