1

인기있는 링크 모음 기능 (지난 24 시간 내 해당 부서에서 가장 많이 사용하는 링크 등)을 추가하기 위해 회사 인트라넷의 다양한 페이지에서 클릭 추적을 구현합니다.자바 스크립트/jQuery : 사용자가 페이지를 떠나기 전에 도메인 간 클릭 추적 이벤트가 성공하는 것을 확인하는 방법은 무엇인가요?

jQuery의 .live()를 사용하여 페이지의 모든 링크 요소에 대한 mousedown 이벤트에 바인딩하고 이벤트를 필터링 한 다음 true를 반환하기 전에 백엔드 서버에 다양한 데이터가있는 의사 아약스 요청을 시작합니다. 링크 액션 화재 : 당신은 아마 위의에서 추측 할 수로서

$("#contentarea a").live("mousedown", function(ev) { 
    // 
    // detect event, find closest link, process it here 
    // 
    $.ajax({ 
     url: 'my-url', 
     cache: false, 
     dataType: 'jsonp', 
     jsonp: 'cb', 
     data: myDataString, 
     success: function() { 
      // silence is golden -- server does send success JSONP but 
      // regardless of success or failure, we allow the user to continue 
     } 
    }); 

    return true; // allow event to continue, user leaves the page. 
} 

, 내가 가진 몇 가지 제약 조건 :

  • 백 엔드 추적 서버가 호출 페이지와 다른 하위 도메인에 있습니다. 나는 이것을 얻을 수 없다. 그래서 POST가있는 적절한 AJAX와 반대되는 JSONP (및 GET)을 사용하고 있습니다. 웹 서버에는 스크립트에 대한 아웃 바운드 네트워크 액세스가 없으므로 AJAX 프록시를 구현할 수 없습니다.
  • 이것은 아마도 관련이 없지만, 전체 공개를 위해 콘텐츠 및 스크립트는 "기본 콘텐츠"iframe 내에 있습니다 (변경되지는 않을 것입니다.) 결국 이벤트 수신기를 부모로 옮길 것입니다. 프레임을 링크 및 모든 하위 콘텐츠를 모니터링 할 수 있지만 1 단계는 "1 자식 창"의 단순화 된 사례에서 제대로 작동하도록합니다. 부모와 자식은 같은 도메인입니다.
  • 백엔드는 IIS/ASP입니다 (다시 한 번 제약 조건 - 요청하지 마십시오!). 백엔드 프로세스를 즉시 포킹 할 수 없거나 그렇지 않으면 응답을 종료 할 수 있지만 계속 처리 할 수 ​​있습니다. 더 나은 플랫폼

대부분의 경우에도 시스템이 작동합니다. 페이지의 링크를 클릭하면 데이터베이스에 거의 완벽하게 표시됩니다.

신뢰할 수는 없습니다. 많은 수의 링크, 특히 대상이 "_top"로 설정된 오프 사이트 링크의 경우에는 나타나지 않습니다. 링크가 새 탭이나 창에서 열리면 OK를 등록합니다.

내가 스크립트 오류를 ​​배제했다 - 그것은 보인다 중 하나

의 (a) 요청이 결코 시간에 백 엔드에 그것을 만들기하지 않습니다; 또는

(b) 요청이 이루어 지지만 ASP가 클라이언트가 곧 연결이 끊어지는 것을 감지하고 GET 요청이므로 처리하지 않습니다.

서버에 대한 대기 시간이 매우 빠르며 많은 링크가 OK이므로 (b)를 의심합니다. 이벤트가 발생한 후 경고 팝업에 넣거나 반환 값을 false로 설정하면 클릭이 OK로 등록됩니다.

내 제약 조건을 변경할 수없는 상황에서 어떻게 해결할 수 있는지 조언 해주세요. 사실 AJAX가 아니므로 GET 요청을 동기식으로 만들 수는 없습니다.

: ASP에 POST 요청을하는 것이 더 효과적일까요? (b)가 범인 인 경우 POST 대 GET에 대해 다르게 작동합니까? 그렇다면 숨겨진 iframe/양식을 사용하여 데이터를 POST 할 수 있습니다. 그러나, 나는 이것이 더 느리고 더 clunky하고, 시간 내에 그것을 만들지 않을 것 같다고 생각한다. 도메인 간이므로 요청이 완료되었는지 확인할 수 없습니다.

Q : GET 요청이 실행 된 후 지연을 스크립트에 추가 할 수 있습니까? 단일 스레드 방식으로이 작업을 수행하려면 어떻게해야합니까? 내 함수에서 true를 반환하여 결국 기본 이벤트가 발생하는지 확인해야하므로 setTimeout()을 사용할 수 없습니다. '성공'을 기다리는 긴밀한 루프가 실행되고 일부 변수 작업을 설정하겠습니까? 나는 이것이 물건을 너무 많이 동결시킬 것이고 응답이 늦어 질 것이라고 걱정한다. 나는 jQuery 지연() 플러그인이 너무 루프라고 생각 하는가?

아니면 다른 원인이 범인이라고 생각하지 않습니까?

저는 방탄 안정성이 필요하지 않습니다. 모든 링크가 똑같이 잡을 수 있다면 95 %는 괜찮습니다. 그러나 지금은 일부 링크가 시간의 100 %를 포착 할 수있는 반면 다른 링크는 얻을 수없는 링크입니다. 이는 달성하고자하는 목표에 맞게 링크를 끊을 수 없습니다.

미리 감사드립니다.

답변

0

해결되었습니다!

간단히 대답하면 GET 요청으로이 교차 도메인을 수행 할 수있는 확실한 방법이 없습니다. 나는 이벤트를 저장하고 나중에 이벤트를 재생하는 것을 포함하여 모든 종류의 것을 시도해 보았다.

나는 빡빡한 루프를 시도했지만 신뢰할 수 없었다.

마지막으로, 내가 포기하고 대상을 숨겨진 iFrame으로 설정하여 결과를 게시 한 동적으로 생성 된 양식을 사용했습니다.

은 안정적으로 작동합니다. 이동하기 전에 브라우저가 POST 요청을 끝내기 시작하고 ASP는 POST를 준수합니다. 그것이 'clunky'가 아니라고 밝혀졌습니다. 물론, 브라우저 보안 모델로 인해 나는 결과를 볼 수 없다. 그러나이 경우 중요하지 않다.

나는 지금 내가 그 옵션을 먼저 시도하지 않았다고 나 자신을 차리고있다.

0

링크 이벤트 핸들러에서 false를 반환하고 URL을 기억하고 JSONP 요청이 성공했을 때만 탐색하려고합니다. 다행히 지연 시간이 너무 길어서는 안됩니다. 당신이 인트라넷에 있다는 것을 고려할 때, 괜찮을 수도 있습니다.

+0

감사합니다. 나는 그것에 대해 생각해 보았습니다. 문제는 일부 링크가 이미 자바 스크립트 이벤트를 묶어 놓은 것입니다 (예 : thickbox에 표시). 전체 이벤트를 저장 한 다음 나중에 실행할 수있는 방법이 있습니까? onclick 이벤트가 아니며 jQuery를 사용하여 동적으로 적용됩니다. – Jhong

0

나는 다른 접근 방식을 시도 할 것이다. 다음과 같은 다른 이벤트에 바인딩 할 수 있습니다.

$(window).unload(function(event) { 
    // tracking code here 
}); 
+0

감사합니다. 좋은 생각입니다. 그러나 여전히 진실을 되돌려야하고 동 기적으로 요청을 보낼 수는 없으므로이 메시지는 여전히 "차단"될 수 있습니까? 일부 링크는 새 창이나 thickbox 스타일의 팝업으로 열립니다. 창문이 닫히지 않을 거라고 생각해. 그만두고 추적해야 해. – Jhong

+0

예, 언로드는 이벤트가 아닐 수도 있습니다. 동기식으로 전송할 수 없으면 내가 생각할 수있는 유일한 옵션은 인위적으로 코드를 느리게하는 일종의 지연 루프입니다. 그러나 그것은 바람직하지 않습니다. – kingjeffrey

+0

나는 이것을 시험해야 할 것이라고 생각한다. 사람들의 시스템을 잠그는 데 약간 겁 먹었습니다. 많은 사용자가 꽤 오래된 랩톱에서 여전히 IE6에 있습니다. 요청이 완료 될 때까지 대기하거나 시간이 초과되면 백그라운드 스레드가 여전히 실행됩니까? 나는 페이지 애니메이션 등을 가지고있다. 반감기가 지나치게 길어 지거나 내 루프에 걸리는 것이 좋을 것이다. – Jhong

관련 문제