내가 만들고있는 사이트의 첫 페이지에서 여러 사람들 <div>
이 CSS :hover
유사 클래스를 사용 하여 마우스가 위에있을 때 테두리를 추가합니다. 의 하나 <div>
s는 포함되어 <form>
그 안에 입력 포커스가있는 경우 국경을 유지할 jQuery를 사용하는. IE6가 s :hover
이외 <a>
의 요소를 지원하지 않는 것을 제외하고는 완벽하게 작동합니다 . 따라서이 브라우저에서만 jQuery를 :hover
사용하여 $(#element).hover()
메소드를 사용하여 CSS를 모방 합니다 . 유일한 문제는 이제 jQuery가 양식 focus()
과 hover()
입력 포커스가 다음에 사용자가 아웃 마우스를 이동 경계는 사라진다.
나는 우리가 이런 행동을 막기 위해 어떤 조건을 사용할 수 있다고 생각했습니다. 예를 들어, 입력 중 하나에 포커스가 있으면 마우스 출력을 테스트 한 경우 테두리가 사라지는 것을 막을 수 있습니다. AFAIK, :focus
jQuery 에는 선택기가 없으므로이 방법을 잘 모르겠습니다. 어떤 아이디어?
답변
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 );
};
점을 유의
(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
});
그리고 그것은 요소의 상태에 접근하는 문제입니다.