다음 blur
과 같이 HTML 입력 상자에 함수를 연결한다고 가정 하십시오.
<input id="myInput" onblur="function() { ... }"></input>
blur
함수 내에서 이벤트를 발생시킨 요소 (클릭 한 요소) 의 ID를 얻는 방법이 있습니까? 어떻게?
예를 들어 다음과 같은 범위가 있다고 가정하십시오.
<span id="mySpan">Hello World</span>
입력 요소에 포커스가있는 직후 범위를 클릭하면 입력 요소의 포커스가 사라집니다. 함수 mySpan
는 클릭 된 것을 어떻게 알 수 있습니까?
추신 : 입력 요소의 onblur 이벤트 전에 span의 onclick 이벤트가 발생하면 특정 요소가 클릭되었음을 나타내는 일부 상태 값을 설정할 수 있기 때문에 문제가 해결됩니다.
PPS :이 문제의 배경은 blur
입력 요소 의 이벤트로 인해 제안이 즉시 사라지지 않고 AJAX 자동 완성 컨트롤을 외부에서 (클릭 가능한 요소에서) 트리거하여 제안을 표시하려고한다는 것 입니다. 따라서 blur
하나의 특정 요소를 클릭했는지 기능 을 확인 하고, 그렇다면 블러 이벤트를 무시하십시오.
답변
흠 … Firefox에서는 explicitOriginalTarget
클릭 한 요소를 끌어 오는 데 사용할 수 있습니다 . toElement
IE에서도 똑같이 할 것으로 예상 했지만 작동하지 않는 것 같습니다 …하지만 문서에서 새로 초점을 맞춘 요소를 가져올 수 있습니다.
function showBlur(ev)
{
var target = ev.explicitOriginalTarget||document.activeElement;
document.getElementById("focused").value =
target ? target.id||target.tagName||target : '';
}
...
<button id="btn1" onblur="showBlur(event)">Button 1</button>
<button id="btn2" onblur="showBlur(event)">Button 2</button>
<button id="btn3" onblur="showBlur(event)">Button 3</button>
<input id="focused" type="text" disabled="disabled" />
주의해야 할 점은 : 이 기술은 않습니다 하지 초점을위한 작업으로 인한 변경됩니다 탭 이동 키보드를 사용하여 필드를 통해, 그리고 크롬이나 사파리에서 전혀 일을하지 않습니다. 사용하는 데 큰 문제 activeElement
(IE를 제외하고는)가 지속적으로 될 때까지 갱신되지 않는다는 후blur
이벤트가 처리되고, 처리 기간 동안 전혀 유효한 값을 갖지 않을 수! 이것은 Michiel이 다음을 사용하여 끝내는 기술 의 변형으로 완화 될 수 있습니다 .
function showBlur(ev)
{
// Use timeout to delay examination of activeElement until after blur/focus
// events have been processed.
setTimeout(function()
{
var target = document.activeElement;
document.getElementById("focused").value =
target ? target.id||target.tagName||target : '';
}, 1);
}
이것은 대부분의 최신 브라우저 (Chrome, IE 및 Firefox에서 테스트 됨)에서 작동하며 Chrome은 클릭 한 버튼 (탭 대 탭) 에 초점을 맞추지 않는다는 경고가 있습니다.
답변
2015 답변 : UI Events 에 따르면 이벤트 의 relatedTarget
속성을 사용할 수 있습니다 .
EventTarget
이벤트 유형에 따라 포커스 이벤트와 관련된 보조를 식별하는 데 사용됩니다 .
대한 blur
이벤트
relatedTarget
: 이벤트 대상 수신 초점.
예:
function blurListener(event) {
event.target.className = 'blurred';
if(event.relatedTarget)
event.relatedTarget.className = 'focused';
}
[].forEach.call(document.querySelectorAll('input'), function(el) {
el.addEventListener('blur', blurListener, false);
});
.blurred { background: orange }
.focused { background: lime }
<p>Blurred elements will become orange.</p>
<p>Focused elements should become lime.</p>
<input /><input /><input />
참고 Firefox는 relatedTarget
버전 48 ( 버그 962251 , MDN ) 까지 지원하지 않습니다 .
답변
나는 결국 onblur 이벤트 시간 초과로 해결했습니다 (StackOverflow가 아닌 친구의 조언 덕분에).
<input id="myInput" onblur="setTimeout(function() {alert(clickSrc);},200);"></input>
<span onclick="clickSrc='mySpan';" id="mySpan">Hello World</span>
FF와 IE에서 모두 작동합니다.
답변
흐림 대신 문서의 mousedown 이벤트를 사용할 수 있습니다.
$(document).mousedown(function(){
if ($(event.target).attr("id") == "mySpan") {
// some process
}
});
답변
유형 FocusEvent
인스턴스에는 relatedTarget
FF의 버전 47까지 속성이 있습니다. 특히이 속성은 이미 작동하는 48 개에서 null을 리턴합니다.
답변
또한 특정 요소를 클릭하고 작동하는 솔루션이있는 경우 자동 완성 기능이 흐려짐을 무시하도록 노력하고 있지만 explicitOriginalTarget으로 인해 Firefox에서만
Autocompleter.Base.prototype.onBlur = Autocompleter.Base.prototype.onBlur.wrap(
function(origfunc, ev) {
if ($(this.options.ignoreBlurEventElement)) {
var newTargetElement = (ev.explicitOriginalTarget.nodeType == 3 ? ev.explicitOriginalTarget.parentNode : ev.explicitOriginalTarget);
if (!newTargetElement.descendantOf($(this.options.ignoreBlurEventElement))) {
return origfunc(ev);
}
}
}
);
이 코드는 Autocompleter의 기본 onBlur 메소드를 래핑하고 ignoreBlurEventElement 매개 변수가 설정되어 있는지 확인합니다. 설정된 경우 클릭 한 요소가 ignoreBlurEventElement인지 여부를 확인합니다. 이 경우 Autocompleter는 onBlur를 계산하지 않고 onBlur를 호출합니다. explicitOriginalTarget 속성이 Mozilla 전용이기 때문에 Firefox에서만 작동한다는 점이 유일한 문제입니다. 이제 explicitOriginalTarget을 사용하는 것과 다른 방법을 찾으려고합니다. 언급 한 솔루션을 사용하려면 클릭 동작을 요소에 수동으로 추가해야합니다. explicitOriginalTarget 문제를 해결할 수 없다면 해결책을 따를 것입니다.
답변
확인중인 내용과 시간을 되돌릴 수 있습니까? 마지막으로 흐려진 부분을 기억하는 경우입니다.
<input id="myInput" onblur="lastBlurred=this;"></input>
그런 다음 span의 onClick에서 두 객체로 function ()을 호출하십시오.
<span id="mySpan" onClick="function(lastBlurred, this);">Hello World</span>
그러면 함수가 Ajax.AutoCompleter 컨트롤을 트리거할지 여부를 결정할 수 있습니다. 이 함수에는 클릭 한 오브젝트 와 흐릿한 오브젝트가 있습니다. onBlur가 이미 발생 했으므로 제안이 사라지지 않습니다.