Jump to content
View in the app

A better way to browse. Learn more.

Дизайн и модификация Invision Community

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

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

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

Featured Replies

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

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

  • Author

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

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

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

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

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. Там, чтобы не показывать "мигалку", используется специальный параметр.

  • Author

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

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

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

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

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

  • Author

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

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

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

+

после

                method: 'get',

добавьте

                hideLoader: true,

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

+

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

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

Edited by Haktar

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

 

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

Начинается с

            Ajax.Responders.register({

  • Author

Стесняюсь спросить, а Вы точно скопировали и заменили часть кода из 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 это предусмотрено.

  • Author

"Мигалка" может висеть из-за ошибок. В 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"

Create an account or sign in to comment

Recently Browsing 0

  • No registered users viewing this page.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.