Загружать сообщения в div с помощью slideUp/slideDown с помощью jQuery

Я пытаюсь загрузить контент со страниц WordPress в div в пользовательском шаблоне, используя ссылки.

У меня есть один скрытый div, и он должен отображаться с помощью slideDown, когда в него загружается контент.

У меня есть несколько ссылок на разные страницы, которые я хочу загрузить в этот div с помощью onClick или чего-то подобного.

Пример:

Допустим, у меня есть следующие ссылки:
- Ссылка 1 (дом)
- Ссылка 2 (о нас)
- Ссылка 3 (контакт)

Если посетитель нажимает на эти ссылки, должно произойти что-то вроде этого:

Щелкните ссылку 2 --> загрузите в div --> div отображается с помощью слайдера или аналогичного.

Щелкните ссылку 3 --> предыдущее загруженное содержимое исчезает, а содержимое ссылки 2 появляется

Щелкните ссылку 2 (еще раз) --> действие, аналогичное щелчку по ссылке 2...

Щелкните ссылку 1 --> очищает div и скрывает его с помощью функции slideUp или аналогичной.

Если ссылка 2 или 3 активна, и пользователь снова щелкает ту же ссылку --> аналогичное действие, как при нажатии на ссылку 1.

Я нашел несколько фрагментов кода, которые помогут мне на этом пути, но я еще не совсем там.
Вот что у меня есть на данный момент:

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.js" type="text/javascript"></script>
<script type="text/javascript">
$(function() {
      $('#navigationMenu a').click(function() { // When a menu item is selected
            $('#maincontent').load($(this).attr('href')); // Load its linked page into the div
            return false; // And prevent it following the link
      });
});

function toggleSlider() {
    if ($("#maincontent").is(":visible")) {
        $("#sec-content").animate(
            {
                opacity: "0"
            },
            600,
            function(){
                $("#maincontent").slideUp();
            }
        );
    }
    else {
        $("#maincontent").slideDown(600, function(){
            $("#sec-content").animate(
                {
                    opacity: "1"
                },
                600
            );
        });
    }   
}

</script>

Я нашел этот код в связанных сообщениях здесь, на SO, и это заставляет меня загружать содержимое в div с функциями slideUp/slide/down.
НО он закрывает div, щелкнув ссылку 3 (в примере), поэтому Мне придется щелкнуть ссылку еще раз, чтобы загрузить ее еще раз.
И домашняя ссылка, ссылка 1, еще не делает то, что я хочу.

Надеюсь, что кто-то, у кого есть немного больше знаний об этом, может помочь мне здесь.
Это вообще возможно сделать?

Спасибо!

---- Отредактированный код 08.02.13 ----

<script type="text/javascript">

$(function() {
      $('#navigationMenu a').click(function() { // When a menu item is selected
            $('#maincontent').load($(this).attr('href')); // Load its linked page into the div
            return false; // And prevent it following the link
      });
});

var lastData;
$(function () {
    $("a").click(function(event) {
        loadData($(this).attr("href"));
        event.preventDefault();
    });
});

function loadData(data) {
    if(lastData == data) {
        $("#maincontent").slideUp();
    } else {
        $("#maincontent").html(data);
        $("#maincontent").slideDown();
    }
    lastData = data;
}

</script>

Результат можно увидеть на странице http://tobba.org/no.


person Thorbj    schedule 06.02.2013    source источник


Ответы (1)


Вы можете попробовать использовать функцию, которая говорит: при нажатии на ссылку посмотрите, была ли это последняя ссылка. Если да, то slideUp(). Если нет, то получите данные, чтобы войти туда, а затем, как только данные будут доступны, заполните поле и слайд вниз.

Этот пример может помочь вам на полпути, вам все равно придется использовать $.get или $.load для получения нужных данных. ПРИМЕЧАНИЕ. lastData объявляется вне области действия функции, чтобы не потерять свое значение при завершении функции: http://jsfiddle.net/turiyag/9na6K/

function loadData(data) {
    if(lastData == data) {
        $("#dataview").slideUp();
    } else {
        $("#dataview").html(data);
        $("#dataview").slideDown();
    }
    lastData = data;
}
person turiyag    schedule 06.02.2013
comment
Geat, это приблизило меня на несколько шагов к тому, что я хочу. Спасибо! Я добавил этот фрагмент кода для загрузки содержимого в div, а не просто ссылку: $(function() { $('#menu a').click(function() { // When a menu item is selected $('#dataview').load($(this).attr('href')); // Load its linked page into the div return false; // And prevent it following the link }); }); Но теперь ссылка появляется непосредственно перед загрузкой содержимого в div, как мне сделать так, чтобы ссылка не отображалась в div, только содержимое связанной страницы? - person Thorbj; 07.02.2013
comment
Этот код не должен иметь никаких проблем. Можете ли вы опубликовать свой отредактированный код? - person turiyag; 07.02.2013
comment
Еще раз спасибо, что нашли время, чтобы помочь с этим. Я обновил исходный пост с отредактированным кодом, а также ссылкой, где его можно посмотреть в действии. Также мне интересно, как я могу получить домашнюю ссылку, чтобы закрыть div первым щелчком мыши. Теперь мне нужно дважды нажать на дом, чтобы закрыть его. - person Thorbj; 08.02.2013
comment
Посмотрите на функцию get jQuery. Это позволит вам получить нужные данные и использовать их, а не просто передавать URL-адрес. Во-вторых, вам нужно стереть исходный код (до оператора var lastdata), так как он больше не применяется. В-третьих, ваш селектор #navigationMenu a в этом случае лучше, чем просто a, и я бы использовал его, чтобы ссылки реагировали на события кликов. - person turiyag; 08.02.2013
comment
В-четвертых, чтобы получить желаемый эффект от кнопки «Домой», вам нужно назначить другую функцию щелчка для кнопки «Домой» и убедиться, что вы не назначаете функцию первого щелчка кнопке «Домой». См. этот пример: jsfiddle.net/turiyag/ZYmuN - person turiyag; 08.02.2013
comment
Спасибо! Я добавил функцию .get в первый сегмент следующим образом: var lastData; $(function () { $('#navigationMenu a').click(function(event) { .get(loadData($(this).attr('href'))); event.preventDefault(); }); }); и добавил return false; прямо над lastData = data;, чтобы предотвратить переход по ссылке. Но он все равно переходит по ссылке. Что я сделал не так на этот раз? Извините, что пока этого не понимаю. Я учу. - person Thorbj; 11.02.2013
comment
вы ищете event.preventDefault(), это более надежно. - person turiyag; 11.02.2013
comment
Я тоже пробовал это, но он все еще следует по ссылке. У меня должно быть что-то не так в моем коде. Теперь мой код выглядит так: var lastData; $(function () { $('#navigationMenu a.home').click(function(event) { $('#maincontent').slideUp(); lastData = null; event.preventDefault(); }); $('#navigationMenu a:not(.home)').click(function(event) { .get(loadData($(this).attr('href'))); event.preventDefault(); }); }); - person Thorbj; 11.02.2013
comment
Попробуйте вызвать его как первую строку функции. Можете ли вы опубликовать свой код в JSFiddle? Я думаю, что ваш код перепутался с вызовом функции get. - person turiyag; 11.02.2013
comment
Я вижу, да, твоя проблема в том, что ты звонишь. См. здесь ( home.edgemontgeek.com/dev/stackoverflow/14730695) для более наглядный пример. Обратите внимание, вам нужно посмотреть на источник. Если у вас есть Chrome, я настоятельно рекомендую просмотреть его с помощью инструментов разработчика и сделать точки останова в исходном коде. Если у вас нет Chrome, я рекомендую его установить. Это отлично подходит для веб-разработки. - person turiyag; 11.02.2013
comment
Огромное спасибо! Я видел там проблему с loadData! Теперь он работает так, как я хочу! - person Thorbj; 11.02.2013