Скрыть и показать элемент div с прототипом и скриптом

Я пытаюсь использовать prototype и scriptaculous, чтобы скрыть и отобразить элемент div, но функция (ниже) для использования свойства прототипа setStyle не работает, и я не уверен, в чем проблема.

<script type = "text/javascript" language = "javascript">
    function bodyOnload() {
            $('content1').setStyle({ display: 'none' });
            $('content2').setStyle({ display: 'none' });
    }
</script>    



<script type = "text/javascript" language = "javascript">

    var currentId = null;

    Effect.Accordion = function (contentId) {
        var slideDown = 0.5;
        var slideUp = 0.5;

        contentId = $(contentId);

        if (currentId != contentId) {
            if (currentId == null) {
                new Effect.SlideDown(contentId, {duration: slideDown});
                } else {
                new Effect.SlideUp(currentId, {duration: slideUp});
                new Effect.SlideDown(contentId, {duration: slideDown});
            }
            currentId = contentId; 
        } else {
            new Effect.SlideUp(currentId, {duration: slideUp});
            currentId = null;
        }
    };
    </script>

Предыдущая функция вызывается как таковая:

<div id = "accordion">
    <div id = "part1">
        <div id = "nav1" onclick = "new Effect.Accordion('content1');">
            Post a comment 1
        </div>
        <div id = "content1">
            <form id = "form" name = "form" action = "post.php" method = "post">
            <textarea name = "commentbody" cols = "20" rows = "10"></textarea>
            <button type = "submit">Post Comment</button>
            <input type = "hidden" name = "blogID" value = "1" />
            <input type = "hidden" name = "userID" value = "3" />
            <input type = "hidden" name = "parentID" value = "7" />
            <div class = "spacer"></div></form>
        </div>
    </div>
        <div id = "part2">
        <div id = "nav2" onclick = "new Effect.Accordion('content2');">
            Post a comment 2
        </div>
        <div id = "content2">
            <form id = "form" name = "form" action = "post.php" method = "post">
            <textarea name = "commentbody" cols = "20" rows = "10"></textarea>
            <button type = "submit">Post Comment</button>
            <input type = "hidden" name = "blogID" value = "1" />
            <input type = "hidden" name = "userID" value = "3" />
            <input type = "hidden" name = "parentID" value = "7" />
            <div class = "spacer"></div></form>
        </div>
    </div>
</div>

Вот что происходит с кодом.

  • И в ie, и в firefox он ничего не делает, но когда вы щелкаете ссылку, которая вызывает метод effect.accordion, метод работает должным образом. Проблема заключается в функции прототипа, которая не скрывает элементы. Любая помощь будет принята с благодарностью.
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
0
36 715
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Если вы хотите изначально скрыть элементы, недостаточно написать функцию bodyOnload. Эту функцию следует вызывать при загрузке страницы, используя что-то вроде этого:

window.onload = bodyOnload;

И, конечно, советую попробовать jQuery :)

Ответ принят как подходящий

maxnk уже затронул основную проблему.

Но Prototype рекомендует использовать событие dom:loaded вместо window.onload:

document.observe("dom:loaded", bodyOnload);

Кроме того, вы можете попробовать Prototype Element#toggle или Element#hide вместо Element#setStyle (если предупреждение на каждой странице не относится к вашему CSS).

function bodyOnload() {
    $('content1').hide();
    $('content2').hide();
}

Ой, я просто не знал, как правильно это сделать в прототипе :( Теперь я знаю, спасибо!

maxnk 14.12.2008 11:46

Большой! теперь он работает. Вы знаете, что это пример из книги, из которой я пытался извлечь уроки. Автор проигнорировал эту очень важную часть, так как он ошибочно сказал, что лучший способ ссылаться на библиотеку эффектов в scriptaculous выглядит так:

<script type = "text/javascript" src = "javascripts/prototype.js"></script>
<script type = "text/javascript" src = "javascripts/scriptaculous.js?load=effects"></script>

вместо как:

<script type = "text/javascript" src = "javascripts/prototype.js"></script>
<script type = "text/javascript" src = "javascripts/effects.js"></script>

У книги есть отличные отзывы на Amazon, но я не думаю, что кто-то из рецензентов пытался использовать книгу. Все они делают рецензии на объем, а не на содержание книги. Ни один из примеров, которые я пытался использовать в книге, не сработал. Я должен был понять это сам. Думаю, вы могли бы сказать, что мне нужно прочитать другие части книги, чтобы понять определенный пример, но для такой большой книги можно ли это сделать? Если мне нужно знать что-то, о чем упоминал ранее автор, не следует ли мне об этом напоминать, по крайней мере, с точки зрения книги настолько большой, что фактически является своего рода справочником? Если вам интересно: Аякс: полное руководство, Энтони Т. Холденер III

Обновлять: Автор использовал старую версию библиотек Scriptaculous и Prototype, поэтому возникло недоразумение. Если вы получите эту книгу, помните об этом. На самом деле я теперь глубоко уважаю эту книгу, хотя бы за ее сдвиговый объем.

Спасибо за эти приложения SlideUp и SlideDown.

Важное замечание: он не работает под ie7 и ie8, если вы не установите ширину для div, который хотите показать или скрыть.

Винсент

Другие вопросы по теме