2010-11-21 1 views
0

クリックしてdivコンテンツを非表示にする必要がある単純なアプリケーションを作成しようとしています。スパンやリストをクリックするたびにdivがクリックを観察しないという点を除いては問題ありません。この部門内のすべてのクリックを監視するにはどうすればよいですか?プロトタイプのオブザーバーを使用してdiv内のすべてのクリックを登録する方法

<div data-hour="16" data-minute="0" data-duration="1" class="even"> 
      <span class="title" >block:</span> <span>4:00PM</span> 
      <div> 
       <ul> 
        <li>item 1</li> 
        <li>item 2</li> 
       </ul> 
      </div> 
     </div> 


$$('#contents > div').each(function(item) { 
     item.observe('click', respondToClick); 
    }); 

答えて

3

あなたはスパンまたはリスト上のハンドラを経由してクリックをキャッチし、抑制している場合を除き、上記のコードが動作する必要があり、それがここにありません:http://jsbin.com/etuka3observeコードがinvokeを経由して、しかし、短縮することができます。 http://jsbin.com/etuka3/2)。

ほとんどのDOMイベントは、チェーンのどこかのイベントハンドラによってバブリングがキャンセルされない限り、要素から親要素へ「バブル」して親要素などにバブルアップします。例えば、上記のthis versionに、私はliの上clickをフックし、divに達したイベントを防ぐ:

$$('#contents > div li').invoke('observe', 'click', function(event) { 
    event.stopPropagation(); // Prevents the event from bubbling up to the ancestors 
}); 

... liをクリック意味し、divは、クリックが表示されません。しかし、あなたはちょうどあなたがthis exampleで見ることができるように、バブリング防ぐていない子要素にイベントをフック、目的にそれをしなければならない:今

$$('#contents > div li').invoke('observe', 'click', function(event) { 
    display("list item clicked"); 
}); 

を私はliをクリックしたときに、私たちがいることがわかりますliのハンドラがトリガされた後、(バブリングを止めなかったので)divのハンドラがトリガされます。

+0

あなたは間違いなしです。問題はvar element = event.element()でした。クリックされた要素に応じて異なる要素を返します。私は要素を補うことと調整することに失敗しました。 – maleki

+0

@maleki:ああ!はい、イベントハンドラで、Prototypeは 'this'がイベントをフックした要素を参照し、' element.element() '(または引数なしの' element.findElement() ')が実際の要素を返しますクリックされたもので、同じものか子孫である可能性があります。 –

関連する問題