Javascript-форум (https://javascript.ru/forum/)
-   Ваши сайты и скрипты (https://javascript.ru/forum/project/)
-   -   Идея сайта... Стоит двигацца дальше?! (https://javascript.ru/forum/project/3686-ideya-sajjta-stoit-dvigacca-dalshe.html)

Riim 23.07.2009 17:06

21 страница, еще немного и можно в типографию нести :) .

Kolyaj 23.07.2009 17:07

Цитата:

Сообщение от Riim
21 страница

У кого 21, а у кого 6 :)

B~Vladi 23.07.2009 17:22

Цитата:

Сообщение от Riim
21 страница, еще немного и можно в типографию нести

:D
И наблюдать, как ты растёшь:blink:

B~Vladi 03.08.2009 17:11

Так, народ, какой функционал должен быть на странице новостей?! Сайт->Новости.

1. Чем вы обычно пользуетесь на простых сайтах в странице "новости" и пользуетесь ли вообще?
2. Можно текст новостей прятать, а при клике по заголовку показывать...
3. Стоит ли разбивать на страницы?! Добавляцо будет далеко не каждый день:)
4. Стоит ли делать выборку по дате?

Ну в таком духе кароч.

x-yuri 03.08.2009 17:27

1) лично я - ничем
2) можно, а можно и без этого. Это более актуально, если новостей будет много на странице. Альтернативный вариант, сделать список названий новостей (типа содержание), но это нестандартно, да и не нужно имхо все это
3) стоит, не важно как часто будут появляться. Или ты не будешь показывать старые новости? Тогда можно не делать
4) это как? Показывать новости только за последние N дней? Если так, то тебе виднее. Если думаешь, что пользователя старые новости интересовать не будут, тогда делай

B~Vladi 03.08.2009 17:43

Не хочется заваливать страницу всеми новостями и оставить возможность просмотреть всю историю изменений...

Цитата:

Сообщение от x-yuri
лично я - ничем

Я тоже... вот и думаю зачем она вообще?! Хотя нада...
Цитата:

Сообщение от x-yuri
можно, а можно и без этого.

Думаю да... лишнее уже...
Цитата:

Сообщение от x-yuri
стоит, не важно как часто будут появляться

Тогда, кроме самих страниц что ещё нужно?! Кол-во показов?
Цитата:

Сообщение от x-yuri
Показывать новости только за последние N дней?

Вроде как да... понятное дело что никто заморачиваться не будет...

B~Vladi 03.08.2009 17:48

И ещё... в настройках сайта думаю сделать такие параметры:

1. Оптимизировать прорисовку (для слабых машин и браузеров)
2. Сохранить активное окно
3. Отключить скрипты
Тут нада ещё добавить чего нибудь...

И две кнопки:
1. Применить (применяется только для текущей сессии)
2. Сохранить (действует для всех сессий)

B~Vladi 06.10.2009 13:24

Написал свой Event для сайта.
Перепробовал кучу вариантов и остановился на идее библиотеки от Ильи Кантора, но с некоторыми отличиями.
Вот, собственно код:
var Event=(function(){
	var allList=new Array;
	var errors=new Array;
	var handler=function(evt){
		evt.errors=new Array;
		if(!evt.fix){
			evt.errors=new Array;
			if(!evt)evt=event;
			if(!evt.preventDefault)evt.preventDefault=function(){evt.returnValue=false;}
			if(!evt.stopPropagation)evt.stopPropagation=function(){evt.cancelBubble=true;}
			if(!evt.target)evt.target=(evt.srcElement.nodeType==1)?evt.srcElement:evt.srcElement.parentNode;
			if(!evt.relatedTarget&&evt.fromElement)evt.relatedTarget=(evt.fromElement==evt.target)?evt.toElement:evt.fromElement;
			if(evt.pageX==null&&evt.clientX!=null){
				var html=document.documentElement,body=document.body;
				evt.pageX=evt.clientX+(html&&html.scrollLeft||body&&body.scrollLeft||0)-(html.clientLeft||0);
				evt.pageY=evt.clientY+(html&&html.scrollTop||body&&body.scrollTop||0)-(html.clientTop||0);
			}
			if(!evt.which&&evt.button)evt.which=(evt.button&1?1:(evt.button&2?3:(evt.button&4?2:0)));
			evt.fix=true;
		}
		var ele=this.ele||this;
		for(var i=0;i<allList.length;i++){
			if(allList[i].ele==ele){
				for(var s=0;allList[i]&&allList[i].list[evt.type]&&s<allList[i].list[evt.type].length;s++){
					if(allList[i].list[evt.type][s]){
						var objCall=allList[i].list[evt.type][s];
						try{
							if((objCall.handler||objCall).call(this,evt)===false){
								evt.stopPropagation();
								evt.preventDefault();
							}
							if(evt.stopCall===true)break;
						}catch(e){
							errors.push(e);
							if(!objCall.onerror)break;
							if(objCall.onerror.call(evt,e)===false)break;
						}
					}
				}
				if(Event.debug&&errors.length)Event.debug(errors);
				delete errors;
				return;
			}
		}
	}
	return{
		Add:function(obj,type,call){
			var ele=obj.ele||obj;
			if(ele.setInterval&&(ele!=window&&!ele.frameElement))ele=window;
			for(var i=0;i<allList.length;i++){
				if(allList[i]&&allList[i].ele==ele){
					if(!allList[i].list[type]){
						allList[i].list[type]=[call];
						if(ele.addEventListener)ele.addEventListener(type,allList[i].handler,false);
						else if(ele.attachEvent)ele.attachEvent('on'+type,allList[i].handler);
						return;
					}
					for(var c=0;c<allList[i].list[type].length;c++)if(allList[i].list[type][c]==call)return;
					allList[i].list[type].push(call);
					return;
				}
			}
			var objListener={ele:ele,handler:function(evt){handler.call(obj,evt)}};
			objListener.list=new Object;
			objListener.list[type]=[call];
			allList.push(objListener);
			if(ele.addEventListener)ele.addEventListener(type,objListener.handler,false);
			else if(ele.attachEvent)ele.attachEvent('on'+type,objListener.handler);
		},
		Del:function(ele,type,call){
			for(var i=0;i<allList.length;i++){
				if(allList[i].ele==ele){
					if(type&&call){
						for(var s=0;s<allList[i].list[type].length;s++){
							var objCaller=allList[i].list[type][s];
							if(objCaller&&(objCaller.handler||objCaller)==(call.handler||call)){
								delete allList[i].list[type][s];
								return;
							}
						}
					}else if(type){
						ele['on'+type]=null;
						delete allList[i].list[type];
					}else{
						for(var type in allList[i].list){
							if(ele.removeEventListener)ele.removeEventListener(type,allList[i].handler,false);
							else if(ele.detachEvent)ele.detachEvent('on'+type,allList[i].handler);
						}
						delete allList[i];
					}
					return;
				}
			}
		},
		Init:function(ele,type){
			if(document.createEvent&&ele.dispatchEvent){
				var evt=document.createEvent('HTMLEvents');
				evt.initEvent(type,true,true);
				ele.dispatchEvent(evt);
			}else ele.fireEvent('on'+type,event);
		}
	}
})();


Схематическая структура массива allList:

[{
  ele: DOMelement,
  handler: listener,
  list: [fnc1,fnc3,fnc2,...]
},
...
]

Отличия от библиотеки Ильи:

* Все присоединённые обработчики хранятся в приватном массиве allList, не засоряя тем самым DOM-узлы.

* Добавлен метод Init для кроссбраузерной генерации события. Предпологается доработка.

* Возможность вызывать обработчик в контексте любого объекта.

Ну и так... по-мелочи:)

Вобщем, использовать так:
Event.Add(ele,type,fnc);

ele - DOM-узел, либо объект, имеющий свойство ele, которое возвращает DOM-элемент. Обработчик будет вызван в контексте этого объекта. Таким образом, можно передавать произвольные параметры в обработчик, что иногда бывает очень удобно, например:
Event.Add({ele:ele,data1:'value1',data2:'value2'},type,fnc);

type - тип события.
fnc - обработчик.

Удалять так
Event.Del(ele,type?,fnc?);

ele - DOM-узел, которому необходимо удалить обработчик.
type - тип события. Необязательно.
fnc - обработчик. Необязательно.

Если указан тип и обработчик - из указанного узла удалится только этот обработчик.
Если обработчик не указан - из элемента удалятся все обработчики указанного типа.
Если указан только элемент - удаляются все обработчики.

Так же реализованы "мини-фичи", упоминаемые в статье:

* Если в обработчике объекту event установить свойство stopCall - вызов опоследующих обработчиков прекратится.
* Возвращаемые оператором return значения попадут в свойство lastResult объекта event для следующего обработчика. Так же если будет передано false - это вызовет методы stopPropagation и preventDefault для события.
* Если в обработчике возникает ошибка, она будет занесена в массив errors объекта event.

От вас же я хотел бы услышать комменты по оптимизации, найденых ошибках, ну и предложения по расширению общего функционала.

x-yuri 06.10.2009 13:52

читабельность пострадала

B~Vladi 06.10.2009 13:55

Цитата:

Сообщение от x-yuri
читабельность пострадала

Эм... ну можно скопировать в свой IDE и применить форматирование, если оно есть:)


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