Аппроксимация mootools’ .slide (‘out’) для элемента перед созданием экземпляра Fx.Slide

#ajax #mootools

#ajax #mootools

Вопрос:

Было бы просто добавить var myFx = new Fx.Slide(element); в window.addEvent('domready'...) , но поскольку я загружаю «подстраницы» с помощью AJAX, объекты mootools этих элементов внутри этих страниц должны быть созданы после полной загрузки. Если бы я попытался использовать domready, элемент не был бы найден, просто потому, что он еще не существует.

Я работал над этим с setTimeout(function() { ... }, 500); , но это оставляет задержку в 500 мс между загрузкой страницы и созданием эффекта элемента.

т. е.

 <div id="foo">TextTextText</div>
<script type="text/javascript">
    setTimeout(function() {
        var myFx = new Fx.Slide('foo').slideOut();
    }, 500);
</script>
  

При загрузке страницы проходит 500 мс, прежде чем элемент переходит в состояние по умолчанию … э-э … «вставлен». (вставлен?)

Однако для эффектов .hide() и .show() существует обходной путь, поскольку я могу просто написать в html <div id="foo" style="display: none;">

Я пытался аппроксимировать состояние элемента «slided in» с помощью <div id="foo" style="height: 0px; overflow: hidden;"> , но тогда элемент остается скрытым навсегда, и slide () ни черта с ним не делает.

Я чувствую, как будто я упускаю что-то простое.

Ответ №1:

Вы пробовали поместить создание экземпляра Fx.Slide в метод onComplete вашего вызова XHR?

Пример :

 var myRequest = new Request({
    method: 'get', 
    url: 'requestHandler.php',
    onComplete : function() {
        var myFx = new Fx.Slide(element);
        // etc ...
    }
});
  

Комментарии:

1. Возможно, но поскольку запрос. Вызов JSON — это общий вызов, который загружает страницы, я не могу излишне нагружать его каждым отдельным экземпляром Fx.Slide.

Ответ №2:

В итоге я решил (по крайней мере, к своему удовлетворению) проблему быстрым обходным путем.

 <div id="foo" style="display: none;">TextTextText</div>
<a href="#" id="toggler">Click me!</a>
<script type="text/javascript">
    setTimeout(function() {
        var myFx = new Fx.Slide('foo').slideOut();
        $('toggler').addEvent('click', function() {
            if ($('foo').getStyle('display') == 'none') $('foo').setStyle('display', 'block');
            myFx.slideIn();
        });
    }, 500);
</script>
  

Элемент скрыт в исходном состоянии, а эффект slideOut () запускается после задержки, но пользователь не заметит, поскольку элемент скрыт. При вызове отображение элемента устанавливается на блокировку (если еще не установлено), и slideIn() вызывается.

Ответ №3:

Установить начальное состояние:

 var myFx = new Fx.Slide('foo').hide();
  

Затем позже, когда вы захотите, чтобы он появился:

 myFx.show().slideIn();