[javascript] jQuery를 사용하여 입력에 초점이 있는지 테스트

내가 만들고있는 사이트의 첫 페이지에서 여러 사람들 <div>이 CSS :hover유사 클래스를 사용 하여 마우스가 위에있을 때 테두리를 추가합니다. 의 하나 <div>s는 포함되어 <form>그 안에 입력 포커스가있는 경우 국경을 유지할 jQuery를 사용하는. IE6가 s :hover이외 <a>의 요소를 지원하지 않는 것을 제외하고는 완벽하게 작동합니다 . 따라서이 브라우저에서만 jQuery를 :hover사용하여 $(#element).hover()메소드를 사용하여 CSS를 모방 합니다 . 유일한 문제는 이제 jQuery가 양식 focus() hover() 입력 포커스가 다음에 사용자가 아웃 마우스를 이동 경계는 사라진다.

나는 우리가 이런 행동을 막기 위해 어떤 조건을 사용할 수 있다고 생각했습니다. 예를 들어, 입력 중 하나에 포커스가 있으면 마우스 출력을 테스트 한 경우 테두리가 사라지는 것을 막을 수 있습니다. AFAIK, :focusjQuery 에는 선택기가 없으므로이 방법을 잘 모르겠습니다. 어떤 아이디어?



답변

jQuery 1.6 이상

jQuery는 :focus선택기를 추가하여 더 이상 직접 선택할 필요가 없습니다. 그냥 사용$("..").is(":focus")

jQuery 1.5 이하

편집 : 시간 이 지남에 따라 초점을 테스트하는 더 좋은 방법을 찾았습니다 .Ben Alman의 요점다음과 같습니다.

jQuery.expr[':'].focus = function( elem ) {
  return elem === document.activeElement && ( elem.type || elem.href );
};

Mathias Bynens 에서 인용 : 여기

점을 유의 (elem.type || elem.href)테스트가 몸과 같은 잘못된 반응에서 필터에 추가되었습니다. 이런 식으로 양식 컨트롤과 하이퍼 링크를 제외한 모든 요소를 ​​필터링해야합니다.

새로운 선택기를 정의하고 있습니다. 플러그인 / 작성을 참조하십시오 . 그럼 당신은 할 수 있습니다 :

if ($("...").is(":focus")) {
  ...
}

또는:

$("input:focus").doStuff();

모든 jQuery

어떤 요소에 초점이 있는지 파악하고 싶다면

$(document.activeElement)

버전이 1.6 이하인지 확실하지 않은 경우 :focus선택기가없는 경우 선택기를 추가 할 수 있습니다 .

(function ( $ ) {
    var filters = $.expr[":"];
    if ( !filters.focus ) {
        filters.focus = function( elem ) {
           return elem === document.activeElement && ( elem.type || elem.href );
        };
    }
})( jQuery );


답변

CSS :

.focus {
    border-color:red;
}

jQuery :

  $(document).ready(function() {

    $('input').blur(function() {
        $('input').removeClass("focus");
      })
      .focus(function() {
        $(this).addClass("focus")
      });
  });


답변

현재 받아 들여지는 것보다 더 강력한 답변이 있습니다.

jQuery.expr[':'].focus = function(elem) {
  return elem === document.activeElement && (elem.type || elem.href);
};

다음 (elem.type || elem.href)과 같은 오 탐지를 필터링하기 위해 테스트가 추가되었습니다.body . 이런 식으로 양식 컨트롤과 하이퍼 링크를 제외한 모든 요소를 ​​필터링해야합니다.

(에서 촬영 이 요점 에 의해 벤 독일어 .)


답변

2015 년 4 월 업데이트

이 질문은 오래 전부터 있었으며 몇 가지 새로운 규칙이 적용되었으므로 .live 적용되었으므로 방법이 감가 상각되었다고 .

그 자리에서 .on 방법이 도입되었습니다.

그들의 문서 는 그것이 어떻게 작동하는지 설명하는데 매우 유용합니다;

.on () 메소드는 이벤트 핸들러를 jQuery 객체에서 현재 선택된 요소 세트에 연결합니다. jQuery 1.7부터 .on () 메소드는 이벤트 핸들러를 첨부하는 데 필요한 모든 기능을 제공합니다. 이전 jQuery 이벤트 메소드에서 변환하는 데 도움이 필요하면 .bind (), .delegate () 및 .live ()를 참조하십시오.

따라서 ‘입력 중심’이벤트를 대상으로하기 위해이를 스크립트에서 사용할 수 있습니다. 다음과 같은 것 :

$('input').on("focus", function(){
   //do some stuff
});

이것은 매우 강력하며 TAB 키도 사용할 수 있습니다.


답변

나는 당신이 무엇을하고 있는지 확실하지 않지만 입력 요소 (또는 div?)의 상태를 변수로 저장하여 얻을 수있는 것처럼 들립니다.

$('div').each(function(){

    var childInputHasFocus = false;

    $(this).hover(function(){
        if (childInputHasFocus) {
            // do something
        } else { }
    }, function() {
        if (childInputHasFocus) {
            // do something
        } else { }
    });

    $('input', this)
        .focus(function(){
            childInputHasFocus = true;
        })
        .blur(function(){
            childInputHasFocus = false;
        });
});


답변

클래스를 사용하여 요소의 상태를 표시하는 대안은 내부 데이터 저장소 기능 입니다.

추신 : 부울과 data()함수를 사용하여 원하는 것을 저장할 수 있습니다. 그것은 단지 문자열에 관한 것이 아닙니다 🙂

$("...").mouseover(function ()
{
    // store state on element
}).mouseout(function ()
{
    // remove stored state on element
});

그리고 그것은 요소의 상태에 접근하는 문제입니다.


답변

누군가 관심이 있다면 지금 초점을 잡는 훨씬 더 좋은 방법이 있습니다. $(foo).focus(...)

http://api.jquery.com/focus/