2012-08-10 2 views
1

내 GWT 애플리케이션에서 JSNI 및 jQuery를 통해 클릭 핸들러를 첨부 한 버튼이 있습니다.GWT : JSNI에서 트리거 된 Window.onResize()는 한 번만 호출됩니다.

private native void attachClickActions() /*-{ 
    $wnd.jQuery("#theButton").click(function() { 
     // ... 
     $wnd.jQuery(this).animate({ 
      // ... 
     }, 500, function() { 
      @com.google.gwt.user.client.Window::onResize()(); 
     }); 
    }); 
}-*; 

(아니, 우리는 논의 가입하지 않은 여러 가지 이유로 자바 코드의 경우 clickHandler를 통해이 작업을 수행 할 수 없습니다.) 본질적으로

, 사용자가 클릭하십시오 JSNI는 다음과 같이 보입니다 버튼, jQuery animate()이 호출되고 완료되면 콜백 함수는 Window.onResize()을 호출합니다. 아주 간단합니다.

그리고 처음으로 작동합니다. 사용자가 버튼을 클릭하면 애니메이션이 발생하고 onResize가 호출됩니다. 그러나 모든 후속 클릭은 animate() 함수가 성공적으로 완료 되더라도 onResize 액션을 실행하지 않습니다. alert()과 같이 콜백에 넣은 다른 모든 코드는 애니메이션이 완료 될 때마다 발생하기 때문에 콜백에 문제가되지 않습니다. 나는 onResize()이 애니메이트 액션이 요소의 크기에 변화를 적용하고 onResize()이 트리거 될 때 변경이 발생했기 때문에 후속 호출되지 않는다는 것을 알고 있습니다.

Window.onResize()이 처음으로 호출되고 이후 호출이 무시되는 이유는 무엇입니까?

답변

1

이 이유는 GWT 팀이 이벤트를 Window 클래스에 작성한 이유 때문입니다. 분명히 Trident (IE) 및 Webkit (Chrome, Safari)과 같은 특정 브라우저 엔진에서는 onResize 이벤트가 한 번만 발생해야하는 경우 여러 번 트리거되는 경우가 있습니다. 이 상황을 처리하기 위해 onResize() 메서드를 구현하면 브라우저 창의 현재 크기가 확인됩니다. 마지막으로 onResize() 호출 이후 크기가 변경되지 않은 경우 다시 트리거되지 않습니다.

본질적으로 실제로 크기가 조정되지 않은 창에서 onResize() 이벤트를 여러 번 호출하려고했기 때문에이 IE/Webkit "수정"은 이벤트 발생을 중지 시켰습니다. 사람이 궁금하다면

다음은 onResize() 방법의 실제 코드이다 :

static void onResize() { 
    if (resizeHandlersInitialized) { 
     // On webkit and IE we sometimes get duplicate window resize events. 
     // Here, we manually filter them. 
     int width = getClientWidth(); 
     int height = getClientHeight(); 
     if (lastResizeWidth != width || lastResizeHeight != height) { 
      lastResizeWidth = width; 
      lastResizeHeight = height; 
      ResizeEvent.fire(getHandlers(), width, height); 
     } 
    } 
} 
관련 문제