2013-10-25 4 views
-1

완료하는 데 약간의 시간이 걸리는 AJAX 기능이 있습니다. 작업이 끝나면 결과가 표시된 새 탭을 열고 싶습니다. 나는 세 가지 옵션 해낸 적이 이렇게하려면 :자바 스크립트에서 setTimeout을 사용하여 PHP의 잠자기 시뮬레이트

  1. 사용 window.open()로부터 자바 스크립트 기능/이벤트 트리거에
  2. 사용 window.open()를 AJAX-호출합니다.
  3. javacript 함수/이벤트 트리거 내의 setTimeout-function에서 window.open()을 사용하십시오. 크롬에서

    1. 창 :

    문제는이 트릭을 할해야 모든 주요 브라우저 (IE, 크롬, 파이어 폭스와 사파리) 및 옵션 3와 함께 작동해야하지만 원치 않는 부작용이입니다 새 탭에는 열리지 않지만 팝업으로 열립니다.

  4. Safari에서 내부 팝업 방지가 활성화됩니다. 팝업이 열리지 않습니다. (source가)

가 지금은 절차 적 코드의 조각으로의 setTimeout()를 사용하여 결말을 생각 몇 가지 같은 :

$('.selector').click(function() { 
    doAjaxCall(); 
    setTimeout(function(){ }, 150); 
    window.open(...); 
}); 

글쎄,이 사파리하지만 크롬과 파이어 폭스 작동 무시하는 것 setTimeout()을 호출하고 window.open()으로 직접 이동합니다. 여기 내 문제가있다. window.open()이 호출 될 때 항상 사용해야하는 데이터가 최신이 아닙니다.

그래서, 여기 있습니다. 기본 사항으로 돌아갑니다. 증상이 나의 탐구 시나리오의의 단점을 알고이 같은 뭔가 결국 무엇을 알아 냈 :

$('.selector').click(function() { 
    doAjaxCall(); 
    for(i = 0; i <= 100000000; i++) { 
    // procedural and time consuming so doAjaxCall has enough time to complete 
    } 
    window.open(...); 
}); 

나는 아약스-처리를위한 xajax에 붙어있어 내 경우에는, 그래서 나는 할 수 없습니다 jQuery의 ajax 솔루션을 사용한다.

개선 방법에 대한 제안 사항이 있으십니까? ajax-function이 완료되었을 때 모든 주요 브라우저가 팝업을 열어주는 해결책이 있습니까?

답변

1

우선 브라우저는 setTimeout 함수를 무시하지 않지만 실행이 중지되지 않고 setTimeout 완료를 기다리지 만 실행을 계속하고 시간 초과가 완료 될 때까지 메소드를 실행하기 위해 대기합니다. setTimeout 메소드의 인수로 전달되었습니다.

그러나 원하는 것을 이루기 위해 php에서 sleep 메소드를 시뮬레이트 할 필요는 없습니다. ajax 호출에는 이벤트 핸들러를 연결할 수있는 성공 이벤트가 있습니다. 성공 이벤트가 발생할 때 새 탭을 엽니 다. 그렇지 않으면, 아약스 요청이 언제 종료되었는지 정확히 알 수 없습니다. jquery의 ajax를 사용할 수없는 경우 here

과 같은 오래된 학교 요청을 만들 수 있습니다. 대부분의 브라우저에는 팝업 차단기가 있기 때문에 새 창을 여는 것이 가장 좋은 방법은 아닙니다.