0

나는 이것을 파악하려고 몇 시간 동안 내 머리를 긁어 왔습니다. 나는이 페이지를 가지고있다 : http://173.203.72.190/default.aspx. '모든 요리'를 클릭하면 일종의 오버레이가 열리기로되어 있습니다.jQuery 오버레이가 IE6, Opera에서 작동하지 않습니다.

그것은 IE6와 오페라를 제외한 거의 모든 브라우저에서 잘 작동합니다. IE6와 Opera에서 jQuery 'overlay'는 열리지 않습니다.

아무도 아이디어가있을 수 있습니다.

편집 : 오버레이를 트리거 코드는 다음과 같습니다 :

$("a#zoneListLink").click(function() { 

    var listTop = $(this).css("top"); 
    var listLeft = $(this).css("left"); 

    var api = $("a#zoneListLink").overlay({api: true, close:'div.close', top: listTop, left:listLeft, onLoad:function() { $(document).click(function() { api.close(); }); }, 
    onClose:function() { $(document).unbind("click"); } }).load(); 

}); 
+0

잘하면 당신은 그 페이지에서 진행되는 많은 것들을 가지고 있지만 jQuery가 있다면 그것을 가려 냈습니다. 어쩌면 시도하고 문제를 재현하는 최소 코드 페이지를 줄일 수합니다. – Hogan

+0

중지 지원 IE6 – Jason

+0

좋은 지적. 그것을 시도 할 것입니다 (Jason이 아니라 Hogan에 응답). 제이슨, 나는 좋아할 것입니다! 그러나 사용자의 10 %는 여전히 IE6를 사용합니다. 또한이 문제는 Opera에서도 발생합니다. –

답변

1

는 jQuery를 오버레이 효과 내부의 버그 나 호환성이있다. 그것은 .. 오페라의 행동이 더 의미가 있기 때문에 찾기 어려운, 그러나 스크립트의 버그가 기대를 나누기

첫째, 파이어 폭스 오페라에 예를 들어이 명령의 출력을 비교 :

javascript:alert(getComputedStyle(document.getElementById("cuisineListLink"),'').top); 

오페라가 당신에게주는 최고 요리 목록 링크의 위치 (픽셀 단위). Firefox는 "자동"이라고 말합니다. "()으로 parseInt (t, 10) /100*n.height"

if(typeof t=="string"){ 
    t=t=="center"?Math.max((n.height()-q)/2,0):parseInt(t,10)/100*n.height() 
} 

나는 그것을하지 왜 아무 생각이 :

지금, combined.js에서 (나 래핑)이 코드를 찾아 이 코드는 문자열 "center"(레이어의 수직 가운데 정렬을 수행) 또는 숫자를 기대합니다. Opera가 '310px'와 같은 문자열을 전달하면 스크립트는 정수를 추출하여 100 (즉, 3.1)으로 나누고 브라우저 창 (?!)의 높이와 곱합니다. 그물 효과는 오버레이가 스크린 바깥 쪽 3 개의 스크린 높이 아래로 조심스럽게 배치된다는 것입니다. 파이어 폭스에서

, 우리는이 라인에 도착하고 t 변수는 문자열 '자동'입니다. 이 스크립트는 'Not a Number', NaN을 반환하고 100으로 나눠서 창 높이를 곱하는 parseInt()를 시도합니다. 물론 NaN이 반환됩니다. 그런 다음 오버레이를 NaNpx에 배치합니다. 그러면 브라우저는 단순히 가짜 값으로 무시합니다. Firefox의 오류 콘솔에서 그 취지에 대한 경고를 찾을 수 있습니다. 이 코드를 훨씬 이해가되지 않기 때문에

나는 다른 오버레이 플러그인 (혹은 새로운 반복?)를 사용하는 것이 좋습니다 것입니다.

+0

환상적인 작품! 나는 나의 질문이 건초 더미에서 바늘을 발견하는 것 (문맥이없고, 디버깅하기가 매우 어렵다)과 약간 닮았다는 것을 인정해야한다. 지난 밤에 'listTop'과 'listLeft'가 'auto'를 반환한다는 것을 알았습니다. 오버레이 컨트롤이 윈도우에서 '정적'위치로 컨트롤을 생성했기 때문에 이것이 틀렸다는 것을 깨달았습니다. –

+0

코드를 아래 코드로 변경했습니다. \t \t var listPosition = $ (this) .offset(); 가까운 사실, : \t \t \t \t \t \t VAR API를 = $ ("A # zoneListLink") 오버레이 ({API를. 'div.close', 최고 : listPosition.top + 26, 왼쪽 : listPosition.left,에 onLoad을 ($ {document} .unbind ("click");}} $ {document.close();}}}}).하중(); \t \t 정적 대신 위치를 절대 지정 -> $ ("# zoneList"). css ("position", "absolute"); 그리고 작동합니다! –

+0

마크 업을 그대로 유지하려는 또 다른 방법은 오버레이를 정적으로두고 위쪽/왼쪽에 대한 값을 전혀 전달하지 않는 것입니다. 결국 오버레이는 스크립트가 위치를 변경하지 못한 다른 브라우저에서 완벽하게 배치되었습니다. 그래서 listPosition.top + 26 대신 null이나 뭔가를 전달할 수있을 것 같습니까? 또는 "auto"문자열을 하드 코딩하십시오. 성능 최적화를 고려해보십시오. 물론 마크 업이 움직일 수있는 경우 현재 버전을 유지하는 것이 좋습니다. – hallvors

관련 문제