Перейти к содержимому
Русский язык для Invision Community 5

Кнопка Загрузка виснет

В некоторых браузерах довольно странно ведёт себя блок "Загрузка" (кнопка подгрузки ajax) - бывает зависает, и долгое время не исчезает. Довольно напрягает. Конечно можно полностью от неё избавиться (шаблон includeVars), но она довольно полезная. Хотелось что бы эта кнопка не зависала, исчезала сразу.

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

И как мы должны воспроизвести проблему?

Нужен четкий алгоритм.

  • Автор

И как мы должны воспроизвести проблему?

Нужен четкий алгоритм.

Да, понимаю, слишком не чётко описал проблему.

Вот скриншот представляю:

post-31497-0-64556900-1510038380_thumb.jpg

 

В старых браузерах этой проблемы нет, а вот в новых появляется. Грешу на старый скрипт, который идёт от хука последних сообщений в темах. Вот он:

 

var _recentTopics = window.IPBoard;

_recentTopics.prototype.recentTopics = {
ajaxHandler: '',
updateInterval: '',

init: function()
{
	document.observe( 'dom:loaded', function()
	{
		$( 'hook_recentTopics' ).select( '.toggle' )[0].observe( 'click', ipb.recentTopics.toggleVisibility );	

           ipb.recentTopics.ajaxHandler = new Ajax.PassivePeriodicalUpdater( 'recentTopics', ipb.vars['base_url'] + "app=forums&module=ajax&section=recentTopics&secure_key=" + ipb.vars['secure_hash'],
           {
               method: 'get',
               frequency: ipb.recentTopics.updateInterval,
               decay: 2,
               evalJSON: 'force'
           });

		if( ipb.Cookie.get('toggleRecentTopics') == 1 )
		{	
			$( 'recentTopics' ).hide();
			$( 'hook_recentTopics' ).addClassName( 'collapsed' );
			ipb.recentTopics.ajaxHandler.stop();
		}

		ipb.recentTopics.initPreview();
	});
},

toggleVisibility: function( e )
{
	if( ipb.board.animating ){ return false; }

	Debug.write( 'collapsing' );

	var click = Event.element(e);
	var remove = $A();
	var wrapper = $( click ).up( 'div#recentTopicsWrapper' ).down( 'div#recentTopics' );
	Debug.write( wrapper );
	var catname = $( click ).up( 'h3' );

	ipb.board.animating = true;

	// Get cookie
	var cookie = ipb.Cookie.get( 'toggleRecentTopics' );
	if( cookie == null ){
		cookie = $A();
	} 

	Effect.toggle( wrapper, 'blind', {duration: 0.4, afterFinish: function(){ ipb.board.animating = false; } } );

	if( catname.hasClassName( 'collapsed' ) )
	{
		catname.removeClassName( 'collapsed' );
		ipb.Cookie.set('toggleRecentTopics', "0", 1);

		ipb.recentTopics.ajaxHandler.start();
	}
	else
	{
		new Effect.Morph( $(catname), {style: 'collapsed', duration: 0.4, afterFinish: function(){
			$( catname ).addClassName('collapsed');
			ipb.board.animating = false;
		} });
		ipb.Cookie.set('toggleRecentTopics', "1", 1);

		ipb.recentTopics.ajaxHandler.stop();
	}


	Event.stop( e );
},

initPreview: function()
{
	Debug.write( "Init preview called" );
	// Fix up topic preview
	$$('.__topic').each( function(i){
		Debug.write( "Watching " + $(i).id );
		$(i).observe('mouseover', function(e){
			ipb.global.topicPreviewShowIcon(e);
		});
		$(i).observe('mouseout', function(e){
			ipb.global.topicPreviewHideIcon(e);
		});

		ipb.global.topicPreviewSetUp(i);
	});
}
};

//------------------------------
// @author: adrianscott
// http://www.fluther.com/disc/9117/ajaxperiodicalupdater-only-update-if-the-content-has-changed/#quip58902
//------------------------------
Ajax.PassivePeriodicalUpdater = Class.create(Ajax.Base, 
{
initialize: function($super, container, url, options) 
{
	$super(options);
	this.onComplete = this.options.onComplete;

	this.frequency = this.options.frequency;
	this.decay = this.options.decay;

	this.updater = { };
	this.container = $(container);
	this.url = url;
	this.runnedOnce = 0;
	this.lastTidTimestamp = '';

	this.start();
},

start: function() 
{
	this.options.onComplete = this.updateComplete.bind(this);
	this.onTimerEvent();
},

stop: function() 
{
	this.updater.options.onComplete = undefined;
	clearTimeout(this.timer);
	(this.onComplete || Prototype.emptyFunction).apply(this, arguments);
},

updateComplete: function(t) 
{
	if (t.responseJSON['last_tid_timestamp'] == this.lastTidTimestamp ) 
	{
		this.decay = this.decay * this.options.decay;
	} 
	else 
	{
		this.decay = this.options.decay;
		this.container.update( t.responseJSON['html'] );
		this.lastTidTimestamp = t.responseJSON['last_tid_timestamp']; 

		if ( this.runnedOnce == 1 )
		{
			Effect.Pulsate( this.container, { pulses: 3, duration: 1.5 } );
		}

		this.runnedOnce = 1;
	}

	ipb.recentTopics.initPreview();

	this.timer = this.onTimerEvent.bind(this).delay(this.decay * this.frequency);
},

onTimerEvent: function() {
	this.updater = new Ajax.Request(this.url, this.options);
}
});

ipb.recentTopics.init();

 

 

Можно как это исправить, а ещё лучше - отключить в этом скрипте эту мигалку?

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

  • Автор

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

Так я не хочу избавляться от "мигалки", мне бы этот скрипт починить что бы он нормально срабатывал в последних версиях браузеров :(

Так я не хочу избавляться от "мигалки", мне бы этот скрипт починить что бы он нормально срабатывал в последних версиях браузеров

Как так?! Если

а ещё лучше - отключить в этом скрипте эту мигалку?

  • Автор

Как так?! Если

Просто хочу её отключить именно в этом хуке а не по всему форуму. Как я понял её отключить можно в этом скрипте, но не могу найти где именно.

Ну возьмите код от 3.4

+

после

                method: 'get',

добавьте

                hideLoader: true,

  • Автор
Ну возьмите код от 3.4

+

после                 method: 'get',добавьте                 hideLoader: true,

На жаль не помогло. Значит дело не в скрипте...

Изменено пользователем Haktar

На жаль не помогло. Значит дело не в скрипте...

 

Стесняюсь спросить, а Вы точно скопировали и заменили часть кода из public/js/ipb.js?

Начинается с

            Ajax.Responders.register({

  • Автор

Стесняюсь спросить, а Вы точно скопировали и заменили часть кода из public/js/ipb.js?

Начинается с

Ээээ, не понял что нужно сделать.

 

Взять код из 3.4, из файла ipb.js, вот этот:

 

			Ajax.Responders.register({
		  onLoading: function( handler ) {
			if( !Object.isUndefined( handler['options']['hideLoader'] ) && handler['options']['hideLoader'] != false ){
				return;
			}

		    if( !$('ajax_loading') ){
				if( !ipb.templates['ajax_loading'] ){ return; }
				$('ipboard_body').insert( ipb.templates['ajax_loading'] );
			}

			var effect = new Effect.Appear( $('ajax_loading'), { duration: 0.2 } );
		  },

 

 

И заменить его на аналогичный в 3.1.4?

Взять код из 3.4, из файла ipb.js, вот этот:

Это только часть. Берите больше. Не стесняйтесь.

"Мигалка" может висеть из-за ошибок. В 3.4 это предусмотрено.

  • Автор

"Мигалка" может висеть из-за ошибок. В 3.4 это предусмотрено.

Заменил эту часть - и о чудо - мигалка не зависает. Спасибо за помощь.

 

Это только часть. Берите больше. Не стесняйтесь.

Можно заменить и большую часть? Проблем не будет совместимости?

А до какого текста заменять?

Вот начало

			Ajax.Responders.register({

Вот конец

			});

 

 

			Ajax.Responders.register({
		  onLoading: function( handler ) {
			if( !Object.isUndefined( handler['options']['hideLoader'] ) && handler['options']['hideLoader'] != false ){
				return;
			}

		    if( !$('ajax_loading') ){
				if( !ipb.templates['ajax_loading'] ){ return; }
				$('ipboard_body').insert( ipb.templates['ajax_loading'] );
			}

			var effect = new Effect.Appear( $('ajax_loading'), { duration: 0.2 } );
		  },
		  onComplete: function() {

			if( !$('ajax_loading') || !$('ajax_loading').visible() ){ return; }
		    var effect = new Effect.Fade( $('ajax_loading'), { duration: 0.2 } );

		    if ( ! Object.isUndefined( ipb.hoverCard ) ){
		    	ipb.hoverCardRegister.postAjaxInit();
			}
		  },
		  onSuccess: function() {
		    if ( ! Object.isUndefined( ipb.hoverCard ) ){
		    	ipb.hoverCardRegister.postAjaxInit();
			}
		  },
		  onFailure: function( t )
		  {
			 if( !$('ajax_loading') || !$('ajax_loading').visible() ){ return; }
			 var effect = new Effect.Fade( $('ajax_loading'), { duration: 0.2 } );

		  },
		  onException: function( t, exception )
		  {
			  if( !$('ajax_loading') || !$('ajax_loading').visible() ){ return; }
			  var effect = new Effect.Fade( $('ajax_loading'), { duration: 0.2 } );

			  Debug.error( exception );
		  }
		});

 

скрипт, который идёт от хука последних сообщений в темах.

А что за скрипт такой?

А что за скрипт такой?

Обычный javascript для работы хука "(SOS31) Recent Topics"

Создайте аккаунт или войдите в него для комментирования

Аккаунт

Навигация

Поиск

Поиск

Настроить push-уведомления браузера

Chrome (Android)
  1. Нажмите на иконку замка рядом с адресной строкой.
  2. Нажмите Права доступа -> Уведомления.
  3. Измените свои настройки.
Chrome (компьютер)
  1. Нажмите на иконку замка в адресной строке.
  2. Выберите Настройки сайта.
  3. Найдите Уведомления и измените свои настройки.