Перейти к контенту

Предварительный просмотр тем


Рекомендуемые сообщения

Мод немного с юмором (посвященным idTails ;) ), но функционал свой выполняет, и притом хорошо :D

 

post-75890-1262721694_thumb.png

 

Скачать

 

Можно сделать:

 

- всплывающее окно при удержании курсора над названием темы,

- всплывающее окно по клику,

- еще что нибудь...

 

В общем, придумайте сами, а пока вот такая версия - с отдельной иконкой. При наведении - появляется окошко с превью. В превью - текст первого сообщения, подчищенный от всех тегов и обрезанный до настраиваемой длины. Размеры окошка тоже настраиваемые.

Ссылка на комментарий
Поделиться на других сайтах

Опередили с хуком:D

 

Немного критики:

1) Использование showError() неправильно при ajax запросе

 

2) каждый вызов new ipb.Popup(...) создает новый объект обертку для контента (даже если id одинаково все равно будет создан новый объект со всеми обработчиками) - это со временем приводит к тормозам в браузере (в IE7 вообще печально т.к. там изначально все тормозит). Т.е. лучший вариант использовать всего 1 ipb.Popup (для контента всех тем) и просто перезагружать в него контент (понятно, что контент будет загружаться каждый раз, но это не критично, или можно сохранять результат запроса и просто подставлять в ipb.Popup).

 

3) А зачем настройка отключения? логичнее отключать сам хук.

 

4) Почему не сделать обработку BB-кодов? (их можно или самому парсить или брать из кэша).

Ссылка на комментарий
Поделиться на других сайтах

Есть работающий пример? // Tails, ставь скорее :D
Ссылка на комментарий
Поделиться на других сайтах

Опередили с хуком:D

 

Немного критики:

1) Использование showError() неправильно при ajax запросе

 

2) каждый вызов new ipb.Popup(...) создает новый объект обертку для контента (даже если id одинаково все равно будет создан новый объект со всеми обработчиками) - это со временем приводит к тормозам в браузере (в IE7 вообще печально т.к. там изначально все тормозит). Т.е. лучший вариант использовать всего 1 ipb.Popup (для контента всех тем) и просто перезагружать в него контент (понятно, что контент будет загружаться каждый раз, но это не критично, или можно сохранять результат запроса и просто подставлять в ipb.Popup).

 

3) А зачем настройка отключения? логичнее отключать сам хук.

 

4) Почему не сделать обработку BB-кодов? (их можно или самому парсить или брать из кэша).

 

1. Тут все очень просто: showError работает иначе в ajax-модулях, проверте сами - там используется java script:alert.

 

2. Изначально было три варианта:

 

а) один popup и перезагрузка контента каждый раз по mouseover,

б) по 1 закешированному popup на каждую тему,

в) новый popup на каждый mouseover.

 

В ходе сравнений оказалось, что второй вариант лучше. Основные тезисы, повлиявшие на это решение:

- в Firefox onmouseover иногда срабатывает по 2-3 раза подряд в процессе наведения,

- у меня не очень мощный сервер и каждый запрос (будучи под дебаггером) он обрабатывает по 400-700 мс, так что, просто поводив секунд 5 мышкой вокруг одной иконки, а запросто забиваю очеред ajax-запросов минуты на 2-3 вперед, что не есть хорошо,

- у меня не очень мощный ПК, и Firefox, будучи под Firebug'ом, куда быстрее разбирается с дюжиной popup'ов, нежели с очередью из 100 ajax-запросов,

- у объекта ipb.popup нет деструктора,

- IPS везде применяет тот же прием, для каждого элемента создавая отдельный объект и сохраняя его id для последующих вызовов.

 

3) Это очень удобная настройка, она присутствует во всех моих хуках.

 

4) Потому что:

 

а) сообщения нужно обрезать, а, следовательно, нужно контролировать, чтобы разметка не испортилась в ходе обрезания (если резать после парсинга кодов), либо чтобы не разрывались парные коды (если резать до парсинга кодов),

б) в маленьком окне недопустимы flash, media, img теги, т.к. они просто туда не влезут,

 

Между тем, кто-то, наверное, будет и не против картинок и html в превью.... Вынесу это в опции хука.

 

Работающий пример есть тут.

Ссылка на комментарий
Поделиться на других сайтах

навожу я значит в firefox 3.5.6 на сердечко, там хинт с вертикальным скролбаром

пытаюсь попасть в хинт, чтобы пролистать - он закрывается

вывод - закрывать хинт по событию onclick на что-нибудь, а не mouseout

Ссылка на комментарий
Поделиться на других сайтах

Если закрывать по click, то и открывать по click, иное нелогично. Хотя, есть еще вариант с overflow: hidden, чтобы не было соблазна в эту область полезть курсором :D
Ссылка на комментарий
Поделиться на других сайтах

Есть работающий пример? // Tails, ставь скорее :D

))

Ставить мне нет желания, но в коде вы можете найти забавные вещи ;)

Ссылка на комментарий
Поделиться на других сайтах

А что если в глобальную шапку форума поместить javascript, который по onload будет парсить страницу на предмет ссылок с className = "topic_title" и добавлять к ним, аналогично как у ников пользователей, маленькую иконку, по клику на которую будет появляться окошко предпросмотра?

 

Очевидные плюсы:

 

а) будет работать везде, где есть ссылка на топик (результаты поиска, всевозможные списки),

 

б) будет вызываться аккуртано,

 

в) не будет мозолить глаза тем, у кого нет javascript.

 

Как вам такая идея?

Ссылка на комментарий
Поделиться на других сайтах

1) Странно у меня [3.0.5] показывает вот что:

$this->registry->getClass('output')->showError('ТЕСТ', '11111');

post-75457-1262780237_thumb.png

(на отсутствие иконок внимания не обращать - это последствия попытки редактирования макросов в режиме разработки)

 

+ все стандартные модули используют $this->returnString('error');.. хотя нет, showError нашел в одном месте... странно.

 

2) Можно не делать запрос если уже есть выполняющийся (т.е. всегда будет всего 1 запрос)

 

Откройте IE7 - там все печально.

+ у меня FF 3.5 после нескольких часов работы начинает жутко тормозить

 

IPS везде применяет тот же прием, для каждого элемента создавая отдельный объект и сохраняя его id для последующих вызовов.

 

Не применяет (или не везде). Откройте несколько раз список ответивших, например, каждый раз - создание нового ipb.Popup.

 

у объекта ipb.popup нет деструктора,

Он особо не нужен, т.к. менять контент можно с помощью update().

 

Т.е. я бы сделал так:

1) создаем попап (1)

2) выполняем запрос (или заставляем popup его выполнить) (или берем из кэша)

3) кэшируем результат

4) меняем контент

5) выводим человеческие сообщения об ошибках (вместо error)

Ссылка на комментарий
Поделиться на других сайтах

1) Странно у меня [3.0.5] показывает вот что:

$this->registry->getClass('output')->showError('ТЕСТ', '11111');

post-75457-1262780237_thumb.png

(на отсутствие иконок внимания не обращать - это последствия попытки редактирования макросов в режиме разработки)

 

+ все стандартные модули используют $this->returnString('error');.. хотя нет, showError нашел в одном месте... странно.

 

Ничего странного. Для начала, в пределах IP.Board 3 существуют разные классы output - есть htmlOutput, есть xmlOutput. Если выполнить showError в объектном пространстве класса htmlOutput, естественно, получится ваш пикрелейтед.

 

Однако тот же вызов, выполненный в пространстве объекта xmlOutput (который является дефолтным в пределах любого ajax-класса):

$this->registry->output->showError('ТЕСТ')

выдаст простой текстовый код ошибки, который будет успешно интерпретирован классом ipb.popup:

post-75890-1262785816_thumb.png

 

Приведите скриншот именно моего мода, где в окошке вылезает оформление страницы.

 

 

2) Можно не делать запрос если уже есть выполняющийся (т.е. всегда будет всего 1 запрос)

 

Откройте IE7 - там все печально.

+ у меня FF 3.5 после нескольких часов работы начинает жутко тормозить

 

IPS везде применяет тот же прием, для каждого элемента создавая отдельный объект и сохраняя его id для последующих вызовов.

 

Не применяет (или не везде). Откройте несколько раз список ответивших, например, каждый раз - создание нового ipb.Popup.[/code]

 

....

 

Т.е. я бы сделал так:

1) создаем попап (1)

2) выполняем запрос (или заставляем popup его выполнить) (или берем из кэша)

3) кэшируем результат

4) меняем контент

5) выводим человеческие сообщения об ошибках (вместо error)

 

Когда я делал свой хук, я первым делом посмотрел, как этот вызов делают в IPS. У IPS есть ровно два подхода к реализации этой задачи.

 

1) Можно увидеть, например, в ips.blogucp.js (line 57):

	deleteDialogue: function(e, elem)
{
	Event.stop(e);

	var id = elem.id.replace( 'blogDelete_', '' );

	if ( ipb.blogucp.popups[ 'del_' + id ] )
	{
		ipb.blogucp.popups[ 'del_' + id ].show(e);
	}
	else
	{
		ipb.blogucp.popups[ 'del_' + id ] = new ipb.Popup( 'd_e_l__' + id, {
																		type: 'balloon',
																		initial: ipb.templates['deleteDialogue'].evaluate( { 'id' : id } ),
																		stem: true,
																		hideAtStart: false,
																		defer: false,
																		attach: { target: $('blogLink_' + id ), position: 'auto', 'event': 'click' },
																		w: '400px'
																	});
...

Для каждого объекта создается отдельный popup, ссылка на который помещается в массив объектов. В случае, если ссылка на объект уже есть, выполняется простой show().

 

Этот ментод мне понравиося больше всего и именно его я использовал в хуке.

 

2) Всплывающее окошко возле ника в ips.js (line 1084):

	userPopup: function( e, elem )
{
	Event.stop(e);

	var sourceid = elem.identify();
	var user = $( elem ).className.match('__id([0-9]+)');
	var fid  = $( elem ).className.match('__fid([0-9]+)');

	if( user == null || Object.isUndefined( user[1] ) ){ Debug.error("Error showing popup"); return; }
	var popid = 'popup_' + user[1] + '_user';
	var _url  = ipb.vars['base_url'] + '&app=members&module=ajax&secure_key=' + ipb.vars['secure_hash'] + '&section=card&mid=' + user[1];

	Debug.write( fid );

	if ( fid != null && !Object.isUndefined( fid[1] ) && fid[1] )
	{
		_url += '&f=' + fid[1];
	}
	Debug.write( _url );
	ipb.namePops[ user ]	 = new ipb.Popup( popid, {
		 												type: 'balloon',
		 												ajaxURL: _url,
		 												stem: true,
														hideAtStart: false,
		 												attach: { target: elem, position: 'auto' },
		 												w: '400px'
													});
},

 

Тут так же записываются идентификаторы popup'ов в массив, однако проверка на существование окна не применяется, старый объект остается скрытым при повторном клике на кнопку, вместо этого выполняется повторный запрос, генерируется новое окно и старый указатель перезаписывается указателем на новый объект.

 

Как видим, первый метод рациональнее второго. Вы предлагаете третий метод - 1 popup на весь хук, который будет перемещаться от объекта к объекту. Предллжение хорошее и в чем-то рациональное.

 

Посмотрите на объект popup (ipb.js, lines 2397-end). Чтобы реализовать вашу идею, нужно будет использовать вызов hide(), затем position(), затем выполнять ajax request() за новым контентом, обработать ответ, затем выполнить show(). При этом нужно организовать массив для кеширования результатов ajax-запросов. Не скажу, что это сложная задача - вовсе нет, тут работы на 1,5 - 2 часа. Однако, будет ли вся эта конструкция так уж сильно экономнее, чем хранение в памяти в самом тяжелом случае 30 popup-объектов, которые кушать не просят - вопрос. И вообще, стоит ли так усложнять механизм ради одних только несчастных пользователей IE7? Тем более что придется по сути переписать заново часть из то, что уже есть в классе ips.popup (например, обработка ответов об ошибок в ajax-запросах).

 

у объекта ipb.popup нет деструктора,

Он особо не нужен, т.к. менять контент можно с помощью update().

Но разве не логичнее просто разрушать ненужные блоки и удалять их из DOM, чем тратить ресурсы на перемещение объектов?

Ссылка на комментарий
Поделиться на других сайтах

навожу я значит в firefox 3.5.6 на сердечко, там хинт с вертикальным скролбаром

пытаюсь попасть в хинт, чтобы пролистать - он закрывается

вывод - закрывать хинт по событию onclick на что-нибудь, а не mouseout

В 3.5.7(обновляйся:) аналогично, иногда не открывается, иногда на многократном onmouseover виснет :D В других даже проверять не стал.

 

Если закрывать по click, то и открывать по click, иное нелогично. Хотя, есть еще вариант с overflow: hidden, чтобы не было соблазна в эту область полезть курсором ;)

Есть ещё один вариант, в двух замечаниях, странно что о нём ещё никто не упомянул: закрывать не сразу, а через некоторое время. Тогда дрожание мыши или повторное событие не испортят пользователю праздник. Аналогично и с показом, если провести мышью по иконке (случайно), попап не нужно показывать. В качестве образца могу порекомендовать форум dklab, там сделан очень хороший попап с плюшками, который я для 2.3 портировал в своё время.

 

P.S. А в сторону IPS можно разве отправить очередной дизреспект: при открытии попапа вблизи верхней границы видимой области его хорошо бы показывать не "вверх", а "вниз" :)

Ссылка на комментарий
Поделиться на других сайтах

Наверное, проблема во многом в том, что я вообще не понимаю философию этой "фишки" - предпросмотр темы. Зачем она нужна? Как ею пользуются?

 

Все таки думаю перейти от "всплытия при наведении" к кликабельной иконке и открываемому/закрываемому окошку. А onmouseover и onmouseout я вообще по жизни ненавижу - не встречал в javascript более глючных вызовов :D

Изменено пользователем Ritsuka
Ссылка на комментарий
Поделиться на других сайтах

Ritsuka, буду краток: в очередной раз - БРАВО! *бурные авации,аплодисменты* скуден форум смайлами, что поделать :D

Если позволите - сердешку на что-нибудь более нетральное заменить, так сказать, для черствых юзеров отдельный вариант мода ;)

 

Как по мне, вариант кликабельности/закрытия окошка супротив "наведения" будет по практичней для пользования в промышленных масштабах :)

Ссылка на комментарий
Поделиться на других сайтах

Ничего странного. Для начала, в пределах IP.Board 3 существуют разные классы output - есть htmlOutput, есть xmlOutput. Если выполнить showError в объектном пространстве класса htmlOutput, естественно, получится ваш пикрелейтед.

 

Только вид этого класса определяет текущим шаблоном (скином) и по умолчанию это html (при ajax тоже) - т.е. используется htmlOutput (точнее класс всегда output, а для вывода используется уже htmlOutput).

 

Приведите скриншот именно моего мода, где в окошке вылезает оформление страницы.

 

Пожалуйста [3.0.5]:

post-75457-1262790142_thumb.png

 

Изменены строки 115 - 118 файла topic_preview.php:

		//if ( ! $this->topic['tid'] )
	//{
		$this->registry->output->showError( 'topics_no_tid', 10343 );
	//}

 

Посмотрите на объект popup (ipb.js, lines 2397-end). Чтобы реализовать вашу идею, нужно будет использовать вызов hide(), затем position(), затем выполнять...

 

Я не заставляю - делайте как считаете нужным.

 

Самый большой плюс - это возможность реализовать нормальный вывод ошибок (а не просто error или nopermission).

(хотя тут она и не нужна)

 

Код IPB совсем не показатель, некоторые места там даже не "индусы" писали (хотя и нормальные участки есть)...

 

Например, я вот что нашел (ipb.topic.js):

showVoters: function( e, qid, cid )
{
	Event.stop(e);

	if( !ipb.topic.poll[ qid ] || !ipb.topic.poll[ qid ][ cid ] ){ return; }

	/*if( ipb.topic.pollPopups[ qid+'_'+cid ] )
	{
		ipb.topic.pollPopups[ qid+'_'+cid ].show();
	}
	else
	{*/
		var content = ipb.templates['poll_voters'].evaluate( { title: ipb.topic.poll[ qid ][ cid ]['name'], content: ipb.topic.poll[ qid ][ cid ]['users'] } );

		ipb.topic.pollPopups[ qid+'_'+cid ] = new ipb.Popup( 'b_voters_' + qid + '_' + cid, {
														type: 'balloon',
														initial: content,
														stem: true,
														hideAtStart: false,
														attach: { target: $('l_voters_' + qid + '_' + cid ), position: 'auto', 'event': 'click' },
														w: '500px'
													});
	//}
}

 

Но разве не логичнее просто разрушать ненужные блоки и удалять их из DOM, чем тратить ресурсы на перемещение объектов?

 

Перемещение блока проще, чем его удалить и заново создать там где нужно.

 

В контексте данной задачи, возможно, выигрыш и небольшой будет, хотя без тестирования утверждать что-либо не буду.

Ссылка на комментарий
Поделиться на других сайтах

Ок, скриншот вижу, зачтем за ошибку и перепишу прострыми строками.

 

Так же перепишу с onmouseover на onclick в виде селектора "скрыть/показать" - удобнее будет.

 

Так же сделаю возможность выбора режима обработки текста превью "только текст/вырезание картинок и media/нетронутый оригинал", а так же сделаю возможность не обрезать текст сообщений.

 

Так же уберу подстановку "сердечка", и сделаю вместо него иконку, как стоит рядом с ником, и добавлять её буду ко всем ссылкам по специальному классу.

 

Вот сейчас сяду, а как закончу - обновлю архив и оппост.

Ссылка на комментарий
Поделиться на других сайтах

  • 3 недели спустя...

предлагаю сделать еще функцию показа последнего сообщения в теме

многим будет очень полезна

 

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

а если показывать последний то это уже постоянных "клиентов" и будет более востребована

Ссылка на комментарий
Поделиться на других сайтах

Присоединиться к обсуждению

Вы можете ответить сейчас, а зарегистрироваться позже. Если у вас уже есть аккаунт, войдите, чтобы ответить от своего имени.

Гость
Ответить в этой теме...

×   Вы вставили отформатированный текст.   Удалить форматирование

  Допустимо не более 75 смайлов.

×   Ваша ссылка была автоматически заменена на медиа-контент.   Отображать как ссылку

×   Ваши публикации восстановлены.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

Зарузка...
×
×
  • Создать...

Важная информация

Находясь на нашем сайте, вы соглашаетесь на использование файлов cookie, а также с нашим положением о конфиденциальности Политика конфиденциальности и пользовательским соглашением Условия использования.