2013-03-22 2 views
3

내 div의 CSS 스타일을 블록에서 없음으로 변경하면 발생하는 순수 자바 스크립트 이벤트 (jQuery 없음)가 있습니다. 나는 "onBlur"를 통해 그것을 잡을 수는 있지만 인상 할 수없는 것처럼 보인다.CSS 스타일의 자바 스크립트 이벤트가 블록에서 없음으로 변경

알려 주시기 바랍니다.

+1

의'소자 – Ryan

+0

그 차이 어려운 방법 yeah..learned 포커스를 잃을 때위한 onblur'. 내 경우에 사용할 수있는 다른 표준 이벤트가 있습니까? – curioussam

+0

자바 스크립트로'div'를 바꿨습니까? – Ryan

답변

5

가시성 변경에 대해 트리거 된 DOM 이벤트가 없습니다.

할 수있는 최선의 방법은 항상 동일한 기능을 사용하여 매번 스타일을 변경하는 대신 블록의 가시성을 조정하는 것입니다.

올드 패턴 :

function doSomething() { 
    alert("I'm doing something!"); 
    myBlock.style.display = "block"; 
} 

function doSomethingElse() { 
    alert("I'm doing something else now!"); 
    myBlock.style.display = "none"; 
} 

새로운 패턴 :

function doSomething() { 
    alert("I'm doing something!"); 
    toggleMyBlock(true); 
} 

function doSomethingElse() { 
    alert("I'm doing something else now!"); 
    toggleMyBlock(false); 
} 

function toggleMyBlock(show) { 
    if (show) { 
     // code here for what would be your 'it became visible' event. 
    } else { 
     // code here for what would be your 'it became invisible' event. 
    } 
    myBlock.style.display = show ? "block" : "none"; 
} 
+1

+1 질문에 답하고, dom 이벤트가 발생하지 않으며, javascript를 구조화하는 더 나은 방법을 지적했습니다. jquery에서하지 않는 것에 대해서 ... – Ryan

1
당신은 (최소한의 페이드 시간)을 CSS3 전환을위한 DOM의 이벤트를 수신 자바 스크립트를 사용할 수

:

+1

그가 오래된 브라우저 * IE *를 지원해야하는 경우? – Ryan

+0

MSIE 인수가 이미 사망하게하십시오. ChromeFrame은 훌륭하게 작동하며 플래시보다 불편 함이 적습니다. MSIE 10은 실제로 css3을 포함하여 최소한의 "html5"(나쁜 전문 용어 사용 경고)를 지원합니다. https://developer.mozilla.org/en-US/docs/CSS/Tutorials/Using_CSS_transitions MSIE를 지원하기를 원하기 때문에 무언가를 할 수 없다는 말은 이층입니다. MSIE를 통해도 작업을 완료 할 수 있습니다. – CoolAJ86

+0

끔찍한 생각으로 미안합니다. 개발자가 아닌 제 사무실의 모든 사람들을 포함하여 많은 사람들이 직장에서 IE를 사용해야하며 관리자 권한에 액세스 할 수 없으며 chromeframe을 설치할 수 없습니다. 또한 OP는 javascript 답변을 요청했고 매우 좋은 답변이 제공되었습니다. 마지막으로 아무도 MSIE 때문에 무언가를 할 수 없다고 말했습니다. op가 원하는 것만 할 수 있습니다 * 당신의 대답이 제안한 방식이 아닙니다. – Ryan

1

나는 당신이 찾고있는 것과 가장 가까운 것이 DOMAttrModified event 일 것이라고 생각합니다. 나는 그것을 사용의에 완전히 확실하지 않다, 그러나의 라인을 따라입니다 :

element.addEventListener('DOMAttrModified', function (e) { 
    ... 
}); 

이벤트 핸들러가 displayblock 또는 none로 설정되어 있는지 여부를 확인하기 위해 당신에게 충분한 정보를 제공해야 MutationEvent받습니다.

내가 질문을 오해했을 수

편집 할 수 있습니다. CSS 변경으로 인해 DOMAttrModified 이벤트가 발생한다고 생각하지 않습니다. 처음에는 JavaScript로 display에 CSS 값을 설정한다는 의미의 질문을 읽었습니다. 내 대답이 도움이되지 않을 수도 있습니다.

0

향후 새로운 "교차점 옵저버 API"가 여러분이 찾고있는 것입니다. 현재 최신 Chrome, Firefox 및 Edge에서 작동합니다. 자세한 내용은 https://developer.mozilla.org/en-US/docs/Web/API/Intersection_Observer_API을 참조하십시오. 디스플레이를 관찰

간단한 코드 예 : 유료 전환 :

// Start observing visbility of element. On change, the 
// the callback is called with Boolean visibility as 
// argument: 

respondToVisibility(element, callback) { 
    var options = { 
    root: document.documentElement 
    } 

    var observer = new IntersectionObserver((entries, observer) => { 
    entries.forEach(entry => { 
     callback(entry.intersectionRatio > 0); 
    }); 
    }, options); 

    observer.observe(element); 
} 

respondToVisibility(myElement, isVisible => { 
    if (isVisible) { 
    doSomething(); 
    } 
}); 

액션 : https://jsfiddle.net/elmarj/u35tez5n/5/

관련 문제