2011-11-01 4 views
7

ここに私の画像とコンテンツに「バックボード」があります:http://syndex.me 基本的に画像をクリックすると、クリックされたコンテンツの上に情報パネルが表示されます。 .live()によって処理されたときに、親に伝播する子クリックイベントを停止することはできますか?

  • は、タグ、リンクをクリックすることができ、現在開いている情報パネル、または社会的なアイコン内をフェードアウトするために、サイトの背景に

    • クリック:

      私は二つのことをやりたいです親パネルの機能を起動せずに情報パネルを表示すると、再びフェードアウトします。

    私は(.liveによって処理されるようにクリックイベントを必要とするよう親クリック取って代わられている子クリックのためのstopPropagationを使用することはできません

    (see documentation)これはポストが動的にロードされているという事実にあります。

    $( "#Background")をクリックする(function(){//インフォメーションボードをフェードアウトする) これはポストラッパー全体でカバーされているため、

    これまでのところ、私は少なくとも1つの情報ボードを開いていることができます(つまり、1つの画像をクリックすることができます)。これは、私が子供たちのイベントを引き継ぐ親のジレンマにさらに深く関わっているからです。

    $('.theContent:not(.clicked)').live("click", function() { 
          $(this).children('.postInfo').fadeIn(400); 
          $(".clicked").each(function() { 
            $(this).find('.postInfo').fadeOut(400); 
            $(this).removeClass('clicked'); 
          }); 
         $(this).addClass("clicked"); 
    }); 
        $('.clicked').live("click", function() { 
          $(".clicked").each(function() { 
           $(this).find('.postInfo').fadeOut(400); 
           $(this).removeClass('clicked'); 
          }); 
    }); 
    

    )(.live、れる.del再:。、その後、別の、それはので、この部分が良く、すべてのですすでに開いて閉じて、現在の1を開きます。 egate()と.stopPropogation():

    彼らは、文書の先頭に伝播した後.live()メソッドは、イベントを処理するので、ライブイベントの伝播を停止することはできません。同様に、.delegate()によって処理されるイベントは、委譲された要素に伝播します。 DOMツリー内のその下位の要素にバインドされたイベントハンドラは、委譲されたイベントハンドラが呼び出された時点で既に実行されています。したがって、これらのハンドラは、event.stopPropagation()を呼び出すかfalseを返すことによって、委任されたハンドラがトリガされないようにすることができます。

  • +0

    を、私はそれが動作するかどうかはわからないが、あなたはfalseを返す '試してみました;'あなた '生きる()'イベントハンドラに? – Andre

    +0

    いいえ、ちょうど今やりましたが、違いはありません。それは真剣に禅だっただろう! – RGBK

    +0

    '普通の' JavaScriptでは、それはあなたがするはずのものです:それはイベントを停止する方法がないようです。おそらく、グローバル変数を設定し、それをアニメーションハンドラでチェックすることを考えましたか? – Andre

    答えて

    6

    どのように単にイベントが実際に特定の要素に行われたかどうかをチェックについて:ポストが動的にロードされたときに

    function activate(el) { 
        el.find('.postInfo').fadeIn(400); 
        el.addClass('clicked'); 
    } 
    function deactivate(el) { 
        el.find('.postInfo').fadeOut(400); 
        el.removeClass('clicked'); 
    } 
    $('.theContent:not(.clicked)').live('click', function(e) { 
        deactivate($('.clicked')); 
        activate($(this)); 
    }); 
    
    $('.clicked').live("click", function(e) { 
        if (! $(e.target).is('a')) { 
         // this should not trigger if a click occured on one of the links 
         deactivate($(this)); 
        } 
    }); 
    
    $('#ape').click(function(e) { 
        if ($(e.target).is('#ape')) { 
         deactivate($('.clicked')); 
        } 
    }); 
    
    +0

    あなたは 'el.addClass( 'clicked');を追加するのを忘れてしまったと思うのですが、これはOKです。クリックされました。私はあなたがこれをActivate関数に入れたと仮定しました。もしそうなら、それはそれを取り消します:http://syndex.me。 Ack。 – RGBK

    +0

    @RGBKはい、私はその行を忘れてしまい、非アクティブ化/アクティブ化の呼び出しを元に戻す必要がありました。コードを更新しました。試してみてください。 – deviousdodo

    +0

    これで問題は解決しました。それはまだ親を無効にしません。私は疑問に思っています、それはおそらくターゲットis'nt正確なためですか?私はそれをより良く理解するために現時点でターゲットを研究していますが、役に立つ機能のようです。 – RGBK

    0

    はあなたがについてbindingクリックイベントを考えたことはありますか?この方法で、stopPropagation()を使用できます。

    http://jsfiddle.net/rkw79/CzEj5/

    +0

    私はバインドが将来の要素を現在のものだけ扱っていないと思った?私はそれを試してみるでしょう。 – RGBK

    +0

    私はバインドは、別のスクリプトから来て、新しく読み込まれたコンテンツを認識しないと思うように。 – RGBK

    +0

    @RGBK、ああ。あなたがコントロールしていないスクリプトからコンテンツがロードされている場合は、この方法を使用することはできません。あなたはHTMLを支配していますか?常に動的コンテンツの周りにdivを折り返してそこのクリックを捕らえることができます。 – rkw

    0

    あなたは親要素にイベントをバインドする場合、それはそれの子供への伝播イベントを停止することはありません。

    イベントをすべての子にバインドし、ストップ伝播呼び出しを行うか、または親にclickイベントを誰が鳴らしたかをテストする2つのソリューションがあります。私はprsonalyより洗練された2番目のソリューションを見つける。

    あなたはここでそれについての詳細な何かを読むことができます: http://redfishmemories.blogspot.it/2014/08/jquery-prevent-event-propagation-and.html

    関連する問題