4

私はjQueryが初めてです(これは私の2回目の試みです)。Google と StackOverflow を介して回答を探しましたが、かなりの数を試しましたが、問題の最後の部分をまだ把握していません。どんな助けや指導も大歓迎です。

私がやりたいのは、クリックすると画像がフェードアウトし、テキストリストで画像の名前を消す画像(リンゴ、カボチャ、ろうそくなど)の束です。次に、これらの画像の特定のセットをクリックすると、取引を含む div が表示されます。

例:リンゴ、ナシ、カボチャの画像をクリックすると (順不同)、取引が表示されます。 別の例:キャンドル、リンゴ、カボチャ、鍵の画像をクリックすると (任意の順序で) 取引が表示されます。別の例: 取引が表示するすべての画像アイテム (任意の順序で) をクリックします。

最初の部分が機能しています (画像をクリックすると、フェードアウトし、その名前がリストから消えます)。

助けが必要なのは、特定の画像の組み合わせがクリックされたかどうかを確認し、クリックされた場合は取引 div を表示することです。

これには index を使用できると考えていましたが、機能させることができませんでした。多分もっと良い方法がありますか?ご指導ありがとうございます。

これまでのテストコードは次のとおりです(JSFIDDLE):

HTML

    <div class="pic1">
    <img width="50" height="50" src="http://us.123rf.com/400wm/400/400/chudtsankov/chudtsankov1208/chudtsankov120800002/14670247-cartoon-red-apple.jpg" />
    </div>
    </div>
    <div class="pic2">
    <img width="50" height="50" src="http://www.in.gov/visitindiana/blog/wp-content/uploads/2009/09/pumpkin.gif" />
    </div>
    <div class="pic3">
    <img width="50" height="50" src="http://upload.wikimedia.org/wikipedia/commons/f/fc/Candle_icon.png" />
    </div>
    <div class="pic4">
    <img width="50" height="50" src="http://tasty-dishes.com/data_images/encyclopedia/pear/pear-06.jpg" />
    </div>
    <div class="pic5">
    <img width="50" height="50" src="http://free.clipartof.com/57-Free-Cartoon-Gray-Field-Mouse-Clipart-Illustration.jpg" />
    </div>
    <div class="pic6">
    <img width="50" height="50" src="http://images.wisegeek.com/brass-key.jpg" />
    </div>
    <div id="items">
    <p class="apple">Apple</p>
    <p class="pumpkin">Pumpkin</p>
    <p class="candle">Candle</p>
    <p class="pear">Pear</p>
    <p class="mouse">Mouse</p>
    <p class="key">Key</p>
    </div>
    <div class="someText">Reveal Deal #1 after finding apple, candle and mouse</div>
    <div class="deal1">This is deal box #1! You must have found apple, candle and mouse! WIN</div>
    <div class="someText">Reveal Deal #2 after finding key, pumpkin, pear and mouse!</div>
    <div class="deal2">This is deal box #2! You must have found key, pumpkin, pear and mouse!</div>
    <div class="someText">Reveal Deal #3 after finding ALL objects!</div>
    <div class="deal3">This is deal box #3! You must have ALL the items!</div>
    <div id="output"></div>`

CSS

.intro, .someText {
        color:#333;
        font-size:16px;
        font-weight: bold;
    }
    .deal1, .deal2, .deal3 {
        font-size: 18px;
        color: red;
    }

ジャバスクリプト:jQuery

$(document).ready(function () {

    $('.deal1, .deal2, .deal3').hide();

    $('.pic1').click(function () {
        $(this).data('clicked');
        $('#items p.apple').wrap('<strike>');
        $(".pic1").fadeOut("slow");
    });

    $('.pic2').click(function () {
        $(this).data('clicked');
        $("#items p.pumpkin").wrap("<strike>");
        $(".pic2").fadeOut("slow");
    });

    $('.pic3').click(function () {
        $(this).data('clicked');
        $("#items p.candle").wrap("<strike>");
        $(".pic3").fadeOut("slow");
    });

    $('.pic4').click(function () {
        $(this).data('clicked');
        $("#items p.pear").wrap("<strike>");
        $(".pic4").fadeOut("slow");
    });

    $('.pic5').click(function () {
        $(this).data('clicked');
        $("#items p.mouse").wrap("<strike>");
        $(".pic5").fadeOut("slow");
    });

    $('.pic6').click(function () {
        $(this).data('clicked');
        $("#items p.key").wrap("<strike>");
        $(".pic6").fadeOut("slow");
});

$(document).on('click', '*', function (e) {
        e.stopPropagation();
        var tag = this.tagName;
        var index = $(tag).index(this); // doesn't work, as it gives the total no. elements

        $('#output').html(index);
    });

});
4

2 に答える 2

3

まず、div(および他のすべてのdiv)を実装する場合、たとえば、divに対応するデータ値をpアイテムに与えることができます

<div class="pic" data="pumpkin">

それ以外の

<div class="pic2"> 

jqueryでほぼワンライナーを書くことができます

$('.pic').click(function () {
    $("#items p."+$(this).attr("data")).wrap("<strike>");
    $(this).fadeOut("slow");
});

あなたのセットを定義することができます: set1 = ["apple","pumpkin"] そして、クリックするたびに、クリックした段落を次のようにチェックできます

$(document).ready(function () {
var set1 = ["apple", "candle", "mouse"]


$('.deal1, .deal2, .deal3').hide();

$('.pic').click(function () {

    $("#items p." + $(this).attr("data")).wrap("<strike>").addClass("strike");
    $(this).fadeOut("slow");
    //test for set1
    set1Completed = true;
    for (i = 0; i < set1.length; i++) {
        if ($("p.strike." + set1[i]).length==0) {
            set1Completed = false;
            break;
        }
    }
    if (set1Completed) {
        $('div.deal1').fadeIn(); // or fadeIn whatever u want
    }
});
于 2013-10-22T20:57:24.287 に答える
1

カスタム イベントを作成します。

$('.HiddenItem').css({display:'none'}).on('somethingElseClicked',function(){
    $(this).show();
});

次に、別のクリックでトリガーします。

$('.ItemToTrigger').on('click',function(e){
    $('.HiddenItem').trigger('somethingElseClicked');
});

これは明らかに超一般化されていますが、必要なイベントをトリガーするために必要なフレームワークを提供します。

編集

それでは、必要なクリック数と必要な合計の各値を保存する必要があります。私は常に、グローバルではなくオブジェクトベースの変数を使用することを好みます。

var click = {
    deal1:[0,2],
    deal2:[0,3],
    deal3:[0,5]
}

これにより、取引ごとに配列が作成されます。1 つ目は発生したクリック数で、2 つ目は必要な合計から 1 を引いたものです。次に、「発生したクリック数」の値を増やし、ダブルクリックを許可しないようにします。 、後述のJSによる。まず、クリック可能なすべてのアイテムと、それらが関連付けられている取引アイテムにジェネリック クラスを追加し、その方法で検証することをお勧めします。HTML:

<div class="picItem d1" data-fruit="apple">
<div class="picItem d2" data-fruit="pumpkin">
<div class="picItem d1" data-fruit="candle">
<div class="picItem d2" data-fruit="pear">
<div class="picItem d1 d2" data-fruit="mouse">
<div class="picItem d2" data-fruit="key">

そして、私が説明したJS:

$('.picItem').on('click',function(){
    var $this = $(this),
        $fruit = $this.data('fruit');

    $this.fadeOut('slow');

    if($this.hasClass('d1') && !$this.hasClass('clicked1')){
        if(click.deal1[0] < click.deal1[1]){
            click.deal1[0]++;
            $this.addClass('clicked1');
        } else {
            $('.deal1').trigger('showDeal');
        }
    }

    if($this.hasClass('d2') && !$this.hasClass('clicked2')){
        if(click.deal2[0] < click.deal2[1]){
            click.deal2[0]++;
            $this.addClass('clicked2');
        } else {
            $('.deal2').trigger('showDeal');
        }
    }

    if(!$this.hasClass('clicked3')){
        if(click.deal3[0] < click.deal3[1]){
            click.deal3[0]++;
            $this.addClass('clicked3');
        } else {
            $('.deal3').trigger('showDeal');
        }
    }

    $('.'+$fruit).wrap("<strike>");
});

最後ifはクリックされたすべての要素のためのものであるため、クラスを追加してチェックする必要はありません。最後のピースは、関連付けられたデータ属性を取得し、それを打ちます。

これで、イベントをトリガーするだけです:

$('.deal1,.deal2,.deal3').on('showDeal',function(){
    $(this).show();
});

このイベントは、適切なクリック数に達した場合にのみトリガーされます。これは、要求どおりに機能していることを示すために更新された jsFiddleです。

1 つの取引のみを許可する場合は、トリガーされた後にイベントをオフにします。

var $allDeals = $('.deal1,.deal2,.deal3');

$allDeals.on('showDeal',function(){
    $(this).show();

    if($(this).hasClass('deal3')){
        // this is to prevent deal 1 and deal 2 showing, since the criteria for them is also met
        $allDeals.not('.deal3').hide();
    }

    // this turns off all other deals
    $allDeals.off('showDeal');
    $('.picItem').off('click');
});

あなたがそれを必要とするかどうかはわかりませんが、念のため含めておきます。これは、そのケースが機能していることを示すために更新された jsFiddleです。

于 2013-10-22T20:25:19.400 に答える