Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / Расширение OnAvailable для JQuery / 2 сообщений из 2, страница 1 из 1
12.07.2007, 20:26
    #34657885
Viktor Bartel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Расширение OnAvailable для JQuery
Добрый день всем,


Я в последнее время усиленно использую JQuery, супер вещь, да вот тока мне для работы с AJAX-подгружаемыми страницами жуть как не хватало обработчика событий OnAvailable(как у YUI) для различных элементов динамически включаемых в DOM. Так вот я такое расширение написал, только вот не совсем уверен что оптимально выполнил задачу. Уважаемые эксперты Javascript не могли бы вы высказать ваше мнение по поводу ниже представленного кода. Особенно я не уверен в функции setInterval.
Код расширения :
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
jQuery.fn.onAvailable = function(elementId,fn) {
	jqListener = {
		processId : null,
		toDisable : false,
		elementId	: null
	};
	if(!window.jqListenersCollection) {
		jqListenersCollection = new Array();
		setInterval(function(){startProcessKiller()}, 10 );
	}
	
	if(getEl(elementId)) {
		callFunction(fn);
	}
	else {
		jqListener.elementId = elementId;
		jqListener.processId = setInterval(function(){
			checkElement(elementId,fn);
		},  20 );
		jqListenersCollection[jqListenersCollection.length] = jqListener;
	}
	
	function getEl(id) {
		return document.getElementById(id);
	};
	function callFunction(fn) {
		if (!fn || !fn.call) {
      return false;
    }
		else {
			fn.call();
		}
		return true;
	};
	function startProcessKiller() {
		for(var i= 0 ;i<jqListenersCollection.length;i++) {
			var tmpEl = jqListenersCollection[i];
			if(tmpEl.toDisable == true) {
				clearInterval(tmpEl.processId);
				jqListenersCollection.splice(i, 1 );
			}
		}
		return false;
	}
	function checkElement(elementId,fn) {
		if(getEl(elementId)) {
			var index = searchListenerByElemId(elementId,jqListenersCollection);
			var listener = jqListenersCollection[index];
			if(listener == undefined) {
				throw new Exception("Listener could not be undefined");
			}
			else {
				listener.toDisable = true;
				jqListenersCollection[index] = listener;
			}
			callFunction(fn);
		}
		return false;
	};
	function searchListenerByElemId(elementId,collection) {
		for(var i= 0 ;i<collection.length;i++) {
			var tmpEl = collection[i];
			if(tmpEl.elementId == elementId)
				return i;
		}
		return null;
	}
	function removeFromCollection(jqListener,collection) {
		for(var i= 0 ;i<collection.length;i++) {
			var tmpEl = collection[i];
			if(tmpEl.processId == jqListener.processId)
				collection.splice(i, 1 );
		}
		return false;
	}
};
Пример использования:
Код: plaintext
1.
$().onAvailable('Splitter',function(){alert('Hello world')});
Заранее вас благодарю.

--
С уважением
Виктор Бартель
...
Рейтинг: 0 / 0
14.07.2007, 02:04
    #34658851
Viktor Bartel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Расширение OnAvailable для JQuery
Ну видимо притензий нет у господ экспертов. С пивом потянет :) .
...
Рейтинг: 0 / 0
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / Расширение OnAvailable для JQuery / 2 сообщений из 2, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]