최근 작업 중인 사이트에 History객체의 .pushState() 메서드와 .replaceState() 메서드를 이용해서 ajax에 대한 URL history 처리를 해 두었는데, QA를 진행 하던 중 Mac Safari에서 window.onpopstate 이슈가 발생했다.

원인을 찾아가 보니 결국 popupstate 이벤트가 발생되는 시점의 문제였는데, 다른 브라우저들은 문제가 없는 반면 Mac Safari에서는 이 이벤트가 페이지 로드와 동시에 발생되는 문제가 발생한 것…

해결

임시 방편일지 이렇게 하는 것이 최선책일지는 확신이 되지는 않으나, 일단 Mac Safari일 경우에 한하여 이벤트 바인딩 시점을 지연시키는 방식으로 해결을 해 두었다.

(function(ua){
  ua = ua || navigator.userAgent;
  ua = ua.toLowerCase();
  if( /safari/.test(ua) && !!window.chrome ){
    // not safari
    window.onpopstate = function(event){
      event = event || window.event;
      ...
    };
  }else{
    // if safari
    setTimeout(function(){
      window.onpopstate = function(event){
        ...
      };
    }, 500);
  }
})(navigator.userAgent);

현재로서는 일단 아무런 문제 없이 잘 적용이 되어 있는 것으로 보인다.