2014-07-07 6 views
2

이 부분은 fiddle을 참조하십시오.Enquire.js -로드시 일치하지 않는 이벤트

enquire.register("screen and (max-width: 640px)", { 
    match: function() { 
     $("body").css("background","red"); 
    }, 
    unmatch: function() { 
     $("body").css("background","blue"); 
    } 
}); 

브라우저 창은 다음 배경 색이 빨간색으로 설정됩니다 부하에 640 이하 입니다. (즉, 경기 이벤트가 호출 됨). 그러나 창이로드시 640px보다 넓은 경우 아무 일도 일어나지 않습니다. 즉 일치하지 않는 이벤트가 호출되지 않습니다. 왜 안돼? 조건과 일치하지 않는 경우 일치하지 않는 이벤트가 강제로 실행되도록하는 방법이 있습니까?

기본적으로 내가 원하는 것은 if-else 문이 즉시 호출된다는 것입니다.

답변

4

내가 enquire.js를 디자인했을 때 모바일 용 RWD와 함께 사용하도록되어있었습니다. 따라서 진보적 인 개선 접근법을 취하고 있다고 가정합니다. 즉, 쿼리가 일치 할 때 match가 호출되고 이미 한 번 일치가 발생하고 쿼리가 더 이상 일치하지 않는 경우에만 unmatch가 호출됩니다. 이것은 이상하게 보일 수 있지만 일반적인 사용 사례는 "이 쿼리가 일치 할 때 뭔가를 수행하고 더 이상 일치하지 않을 때 실행 취소합니다"입니다. 예는 큰 화면에 탭 영역에 요소를 변환하고, 그렇지 않으면 스택 요소에 반환 될 수 있습니다 쿼리가 일치하지 않는 경우

UNMATCH가 처음 호출 된 경우
enquire.register(desktopMediaQuery, { 
    match : function() { 
    makeTabs(someElement); 
    }, 
    unmatch : function() { 
    makeStacked(someElement); 
    } 
}; 

는, 다음 넣어야 할 것 match가 이미 발생했는지 (또는 악화되었지만, makeStacked에 그런 논리가 있는지) 확인하기 위해 일치하지 않는 콜백의 논리. 우리는 엄격하게 예에서, 점진적 개선을 따라한다면

은, 난 그냥 CSS에서 기본적으로 파란색 배경을 가지고 있고, 경기에 클래스를 추가하고 UNMATCH에서 클래스를 제거하는 것입니다 :

enquire.register("screen and (max-width: 640px)", { 
    match: function() { 
     $("body").addClass("red-bg"); 
    }, 
    unmatch: function() { 
     $("body").removeClass("red-bg"); 
    } 
}); 

귀하의 예가 실제로 원하는 것의 단순화 된 버전이라고 가정합니다. 이 더 나은 정장 당신이해야 할 일을하는 경우 또한, 두 개의 미디어 쿼리를 사용할 수

enquire.register("(max-width: 640px)", { 
    setup : function() { 
     $("body").css("background","blue"); 
    }, 
    match : function() { 
     $("body").css("background","red"); 
    }, 
    unmatch : function() { 
     $("body").css("background","blue"); 
    } 
}); 

: 그래서 다른 방법은 기본 케이스를 충당하기 위해 설정 콜백을 사용하는 것입니다. 위와 같이 설치 프로그램을 사용하는 것보다 더 나은 의도라고 생각합니다.

enquire.register("(max-width: 640px)", { 
    match : function() { 
     $("body").css("background","red"); 
    } 
}) 
.register("(min-width: 641px)", { 
    match : function() { 
     $("body").css("background","blue"); 
    } 
}); 

여기 두 접근 보여주는 바이올린의 (미디어 쿼리가 검출되지 않고) http://jsfiddle.net/7Pd3m/

+1

그것은 참으로 (많이) 단순화 된 사건 (자신의 문서 http://wicky.nillia.ms/enquire.js/#quick-start에서 참조). 나는 Inquire를 Masonry와 Stellar와 함께 작동 시키려고 노력하고있다. 나는 마지막 해결책을 참았다. 그것은 내가하고 있었던 것에 대한 더 나은 개요를 유지했습니다. 하지만 적어도 지금은 왜 enquire.js 그것이 어떻게 작동하는지 이해합니다. 고마워요! 마지막으로 약간 흥미로운 주제 : Enquire.js는 CSS 미디어 쿼리와 동일한 방식으로 스크롤바를 고려합니까? 나는 그것을 테스트하지 않았지만 CSS 나 Inquire에 포함되거나 포함되지 않은 스크롤 막대의 너비에 기인 한 일부 동작이 발생했습니다. –

+0

@WickyNilliams, 마지막 예제처럼 내 문제를 정렬하려고했지만 다소 발생하지 않습니다 .http : // stackoverflow.com/q/38168744/3697102 – Ayan

+0

@WickyNilliams 여기서 또 다른 enquire.js를 사용하는 사용자입니다. 그러나, 나는 거의 1 시간 반 동안 내가 뭘 잘못했는지 알아 내려고 노력했다. 나는 같은 문제를 겪고 있었다. 내가 당신의 대답을 읽은 후에 내가 왜 이렇게 만들었는지 완전히 이해하고 있지만 데모 페이지에서 코드 스 니펫 'Unmatch'에 대한 작은 노트를 작성하고 첫 번째로 'unmatch'를로드하면 작동하지 않는다고 제안합니다. 그런 식으로 :)). 그것은 많은 두통을 방지 할 것입니다 :)이 멋진 도구를 주셔서 감사합니다! – viery365

0

문의 JS은 설치 번 트리거되는 레지스터 기능의 내부 호출하는 방법을 제공하며이 때 레지스터 핸들러 호출됩니다. 그래서 당신은 이런 식으로 포함하도록 코드를 확장 할 수

enquire.register("screen and (max-width: 640px)", { 
    setup: function() { 
    // do stuff here as soon as register is called. 
    }, 
    match: function() { 
     $("body").css("background","red"); 
    }, 
    unmatch: function() { 
     $("body").css("background","blue"); 
    } 
});