2013-10-31 15 views
9

避け要素ブラーハンドラウィンドウブラーが呼び出さ(ブラウザーがフォーカスを失った)

私がクリックしたときには、サブ要素を受け取る要素を持っています。そのサブ要素にはぼかしハンドラが与えられます。

ブラウザがフォーカスを失ったとき(ウィンドウのぶれ)、ハンドラが呼び出されないようにします。

function clicked() { 
    // generate a child element 
    ... 
    field = $(this).children(":first"); 
    $(window).blur(function() { 
     field.unbind("blur"); 
    }); 
    $(window).focus(function() { 
     field.focus(); 
     field.blur(function() { 
      save(this); 
     }); 
    }); 
    field.blur(function() { 
     save(this); 
    }); 
} 

これは動作しません:私はこれが私の現在の努力され、いくつかの鋲をしようとしてきた、その目標に向けて

。発生しているように見えるのは、ブラウザがフォーカスを失ったときに、フィールドが最初にフォーカスを失っていることです。

+1

http://jsfiddle.net/3sdDr/ – adeneo

答えて

13

ニース質問!

これは可能であり、かなり簡単です。

field.blur(function() { 
    if(document.activeElement !== this) { 
     // this is a blur that isn't a window blur 
    } 
}); 

JSFiddle

それともバニラJSで:

field.addEventListener('blur', function() { 
    if(document.activeElement !== this) { 
     // this is a blur that isn't a window blur 
    } 
}); 

編集:ブラウザとあなたの答えのお得な情報がフォーカスを失ったものの、Firefoxはunusal行動(バグ?)を持っていることを知って返します集中する。入力を集中してからウィンドウの焦点をずらすと、要素のぼかしがトリガされます(これは質問の内容です)。入力以外のものに戻ると、ブラーイベントは秒のの時刻に発生します。

+1

ああ、私はactiveElementについて知りませんでした。喜んでそれは簡単です。 私はactiveElementが現在フォーカスされている要素なのでぼかしが発生し、フィールドがまだフォーカスされているので、フォーカスを他の場所に転送していないためです。したがって、ブラーハンドラの呼び出しを避けることができます。 ありがとう! –

+0

正解、@Michael。 –

0

これを行うには少し汚い方法は、対策を講じる前にsetTimeout()を使用することです。

var windowFocus; 

$(window).focus(function() { 
    windowFocus = true; 
}); 

$(window).blur(function() { 
    windowFocus = false; 
}); 

function clicked() { 
    // generate a child element 
    ... 

    field = $(this).children(":first"); 

    field.blur(function() { 
     setTimeout(function() { 
      if (windowFocus) { 
       save(this); 
      } 
     }, 50); 
    }); 
} 
関連する問題