1

上部に「すべて開く/すべて閉じる」というQ&Aリストがあり、クリックすると画像の開くボタンと閉じるボタンが個別に切り替わります。それはうまくいきます。

次に、個々のQ&Aに従ってください。それぞれに、独自のオープンイメージとクローズイメージがあります。

ページが読み込まれたらすぐに[すべて開く/すべて閉じる]をクリックしてから、個々のQ&Aの画像を開く/閉じるをクリックすると、すべて正常に機能します。ただし、ページの読み込み後に、「すべて開く/すべて閉じる」をバイパスして、個々のQ&Aの開く/閉じる画像をクリックすると、不適切な開いた画像または閉じる画像が表示されます。

ページコードは次のとおりです。

<div class="answersee"><span>Open All</span><img src="assets/open.gif" border="0" alt="" /></div>
<div class="answerhide"><span>Close All</span><img src="assets/close.gif" border="0" alt="" /></div>

<div class="qa">
    <div><img src="open.gif" border="0" alt="" /><span class="question">Question.</span></div>
    <div class="answer"><p>Answer.</p></div>
</div>

スクリプトは次のとおりです(これもJqueryを使用します)。

$(function () {
    $(".qa").click(function () {
        $(this).find("div").next().slideToggle("fast");
        if ($(this).find("div:eq(0)").find("img").attr("src") == "open.gif") {
            $(this).find("div:eq(0)").find("img").attr("src", "close.gif");
        }
        else {
            $(this).find("div:eq(0)").find("img").attr("src", "open.gif");
        }
    });
    $(".answersee").click(function () {
        $(".answer").show("fast");
        $(".qa > div > img").attr("src", "close.gif");
        $(".answerhide").show();
        $(".answersee").hide();
    })
    $(".answerhide").click(function () {
        $(".answer").hide("fast");
        $(".qa > div > img").attr("src", "open.gif");
        $(".answersee").show();
        $(".answerhide").hide();
    })
});

CSSの問題ではないと思います。または、そのコードをここに含めます。何らかの方法でスクリプトを初期化する必要がありますか?または、上記のスクリプトを間違えましたか?

4

4 に答える 4

1

これが私がそれを行う方法です。

ワーキングデモ →

編集:

シンプルな開閉リンクを持つようにコードを更新します。

私のアプローチを説明するコメント付きのコード:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>

<style>
    body
    {
        font-family: "Verdana";
        font-size: 12px;

    }
    .question
    {
        background-color: #ccc;
        cursor: pointer;
        padding: 5px;
        margin-bottom: 10px;
        border-bottom: 1px solid #000;
    }

    .answer {
        padding: 5px;
    }


</style>

<script>



    $(document).ready(
        function()
        {
            //Hide all the answers on page load.
            $('.answer').hide();

            //For all questions, add 'open'/'close' text.
            //You can replace it with an image if you like. 
            //This way, you don't need to specify img tag in your HTML for each question.
            $('.question')
                .append(' <span>[ open ]</span>');


            //Now there are two ways to toggle the visibility of answer.
            //Either click on the question OR click on Open All / Close All link.
            //To use the same code for both instances, we will create
            //a function which will take the 'question' div and toggle the answer for it.
            //Advantage of this approach is that the code to toggle the answer is in
            //one place.

            //By default, this function will try to toggle the status of the answer
            //i.e. if it's visible, hide it otherwise show it.
            //This function will take a second argument called 'showAnswer'.
            //If this argument is passed, it overrides the toggle behavior.
            //If 'showAnswer' is true, answer is shown.
            //If it's false, answer is hidden.
            //This second parameter will be used by the 'openAll', 'closeAll' links.
            var toggleAnswer = function toggleAnswer(question, showAnswer)
            {
                //The way I have structured the HTML, answer DIV is right after 
                //question DIV.
                var $answer = $(question).next('div');

                //Animation callback, after the animation is done, we want to 
                //switch the 'text' to display what could the user do with the question.
                //Once again, you can change this code to show open/close image.
                var updateText = function()
                                 {
                                    var text = $answer.is(':visible') ? ' [close] ' : ' [open] ';
                                    $(question).find('span').html(text);
                                 }

                var method = null;

                if(arguments.length > 1)
                {
                    //If the function was called with two arguments, use the second
                    //argument to decide whether to show or hide.
                    method = showAnswer === true ? 'show' : 'hide';
                }
                else
                {
                    //Second argument was not passed, simply toggle the answer.
                    method = $answer.is(':visible') ? 'hide' : 'show';
                }

                $answer[method]('fast', updateText);
            };

            //On each question click, toggle the answer. 
            //If you have noticed, I didn't enclose both Q&A inside one DIV.
            //The way you have done if user clicks on the answer, answer will collapse.
            //This may not be desirable as user may want to copy the answer
            //and he won't be able to.
            $('.question').click(function(){ toggleAnswer(this);});

            //We will reuse the same toggleAnswer method in openAll, closeAll 
            //handling. This way, if you want to change behavior of how the question/answers
            //are toggled, you can do it in one place.
            $('#openClose').click(
                function() 
                { 
                    var showAnswer = $(this).html().toLowerCase().indexOf('open') != -1 ? true : false;
                    $('.question').each(function() { toggleAnswer(this, showAnswer); });
                    $(this).html(showAnswer ? 'Close All' : 'Open All'); 
                    return false;
                } 
            );

        }
     );
</script>
<html>
<head>
<title>simple document</title>
</head>
<body>

<a id='openClose' href='#'>Open All</a>

<br /><br />

<div class='question'>Question 1</div>
<div class='answer'>Answer 1</div>

<div class='question'>Question 2</div>
<div class='answer'>Answer 2</div>

<div class='question'>Question 3</div>
<div class='answer'>Answer 3</div>

</body>
</html>
于 2009-07-31T04:56:35.593 に答える
0

どの画像が表示されているかを確認するまでにアニメーションが終了しないため、コールバックを使用する必要があります。

 $(".qa").click(function() {
    $(this).find("div").next().slideToggle("fast", toggleImage);
 }

 function toggleImage(){
    var $img = $(this).find("img");
    $img.attr('src') == "open.gif" ? $img.attr('src', "close.gif") : $img.attr('src', "open.gif");

 }

注意:これを行うにはもっと良い方法がありますが、最初に作業を開始してから、さらにリファクタリングするかどうかを確認できます。

于 2009-07-31T00:16:41.393 に答える
0

Redsquare と Solution Yogi:

ありがとう。後でもう一度返信し、問題をより明確に確認できるように動作するデモも投稿します。申し訳ありませんが、私は前にそれを行う必要がありました.

リズ

于 2009-07-31T15:03:11.480 に答える
0

これを提供するために時間を割いていただきありがとうございます。私は今日これを後で試して報告します。私のバージョンでは、すべて開く/すべて閉じる機能を切り替えます。マウスを動かす必要がないため、見た目がすっきりして使いやすくなっています。

于 2009-07-31T14:58:41.270 に答える