2012-05-08 18 views
0

私は現在、http://picselbocs.com/projects/goalcandy(ユーザー:[email protected]、パスワード:demo)に設定されている対話型Webアプリケーションで作業しています。アイテムを左の列から右のワークスペースにドラッグしてサイズ変更/編集することができます。onblur発砲回数が多すぎるか全くない

今日、私はオブジェクトのテキスト編集機能に取り組んできましたが、ソースを見つけることができない非常に奇妙な動作に出くわしました。新しく作成したオブジェクト内のテキストフィールドを最初にクリックして(そのテキストを編集するために)、テキストボックスの外側をクリックすると、警告メッセージが表示されます(テスト目的でのみ使用します)。問題は、同じテキストフィールド内をもう一度クリックしてその外をクリックすると、アラートがますますトリガされることです。 要するに、「ぼかし」イベントのイベントハンドラは、新しいテキスト編集を試みるたびにますます頻繁に発生します。何故ですか?私は何が欠けていますか? FirebugやChromeのデバッグモジュールで経験したことはありません。少なくとも、この場合私を助けてくれるより微妙な機能ではなく、問題の原因を見つけることができません。しかし、

タイトルに記載されている別の奇妙な問題は、オブジェクトにテキストと画像の両方がある場合、オブジェクトのイメージをクリックすると警告がトリガーされないということです。それ以外の場合は、 "オブジェクト画像のほかに何か他のものをクリックしない限り、全く発射しません。それがどうして起こるのか?

ここで "ぼかし" イベントハンドラを体現(jqueryのを使用して)コードは次のとおりです。

var jqSelector = "#mesh div.mesh-obj span"; 
     $(document) 
      .on("mouseover mouseenter", jqSelector, function(event) { 
       event.stopPropagation(); 
       $(this).css({'background-color':'#FF9', 'cursor':'text'}); 
      }) 
      .on("mouseout mouseleave", jqSelector, function(event) { 
       event.stopPropagation(); 
       $(this).css({'background-color':'transparent', 'cursor':'inherit'}); 
      }) 
      .on("mousedown", jqSelector, function(event) { 
       event.stopPropagation(); // prevent activating the parent object's "mousedown/click" event handlers 
      }) 
      .on("click", jqSelector, function(event) { 
       event.stopPropagation(); // prevent activating the parent object's "mousedown/click" event handlers 

       //alert('click'); 

       // Cache jQuery objects 
       var jqSpan = $(this), 
        jqPre = jqSpan.parent(), 
        jqTextarea = jqPre.parent().find('textarea').first(); 

       // "Replace" the <pre> element with the <textarea> 
       jqPre.css('visibility','hidden'); 
       jqTextarea 
        .show() 
        .text(jqSpan.text()) 
        .val(jqSpan.text()) 
        .css('background-color','#ff9') 
        .on('click mousedown dblclick', function(event){ event.stopPropagation(); }) 
        .on('blur', function(event){ 
         event.stopPropagation(); 
         // Hide the <textarea> element and make the <pre> visible again 
         jqSpan.text(jqTextarea.val()); 
         jqTextarea.hide(); 
         jqPre.css('visibility','visible'); 
         alert('blur'); 
         //jqTextarea.off('blur'); 
        }) 
        .focus(); 
      }); 

助けてください!ありがとう。

答えて

2

テキスト領域をクリックするたびにblurイベントを追加し直しています。それは古いものを上書きしません、それは新しいものを追加します。

+0

「にじみ」が発生し、そのトリック(jqTextarea.offが( 'マウスダウンDBLCLICKをクリックしたとき、私は1つは、再びイベントハンドラを削除しましたぼかし '))。なぜそれが前にうまくいかなかったのかわからない、私はそれを試した。とにかく、イメージをクリックするとブラーハンドラがトリガしない理由がありますか? –

+0

イメージをクリックすると、それをドラッグするカスタムクリックがトリガされます。問題がある場合は新しい質問を開きます。 –

+0

私は、今のところ:http://stackoverflow.com/questions/10496477/blur-event-handler-is-blocked-by-jquery-preventdefault-method。もしあなたが助けることができれば、私は大いに感謝します! –

1

あなたはこのような再追加イベントハンドラにあります

    jqTextarea 
        .show() 
        .text(jqSpan.text()) 
        .val(jqSpan.text()) 
        .css('background-color','#ff9') 
        .off('click mousedown dblclick') 
        .on('click mousedown dblclick', function(event){ event.stopPropagation(); }) 
        .off('blur') // remove event listener 
        .on('blur', function(event){ 
         event.stopPropagation(); 
         jqSpan.text(jqTextarea.val()); 
         jqTextarea.hide(); 
         jqPre.css('visibility','visible'); 
         alert('blur'); 
        }) 
        .focus(); 
+0

ありがとう、デニス!ぼかしイベントが発生すると、実際にはハンドラを削除します。これは、alert()コールの直後を意味しますが、アイデアはほぼ同じです。また、オブジェクトイメージをクリックしたときにブラーハンドラが起動しない理由もありますか? –

関連する問題