4

현재 페이지 전송을 위해 푸시 스테이트을 사용하는 사이트의 개발자입니다.Google DFP Refresh Ads가 Internet Explorer 10에서 window.history 스택을 제거합니다.

이 사이트는 내가 인터넷 익스플로러

내가 윈도우 7, IE10 문제가 나타 납니까

각 페이지 전환/노선에를 새로 고침하는 , 구글 DFP 광고 사용 .

googletag.pubads().refresh(GOOGLE_ADS); 

따라서 잘못된 항목을 가지고있는 뒤로 가기 버튼의 사용을 일으키는 원인이되는 window.history 실행 스택에 항목을 제거합니다.

간단한 예

히스토리 스택에 항목을 추가

console.log(window.history.length) // 3 

window.history.pushState ({}, '제목', '/ PAGE_1');
window.history.pushState ({}, 'title', '/ page_2');
window.history.pushState ({}, 'title', '/ page_3');
window.history.pushState ({}, 'title', '/ page_4'); 내가 다시 버튼을 누르면한다면

console.log(window.history.length) // 7 

새로 고침 광고

googletag.pubads().refresh(GOOGLE_ADS); 

확인 역사 길이 다시

console.log(window.history.length) // 3 

, 그것은 이전 페이지로 이동 것 방문 페이지.

누구든지 IE에서이 문제를 확인합니까? DFP 소스를 보면 window.history를 두 번 참조합니다.

답변

2

전적으로 동일한 문제가 있습니다. 다른 도메인의 iframe에서 광고를 실행해도 기록이 손실됩니다. 나는 iframe src 이벤트 이벤트로 변경 IE 처리와 관련이 있다고 생각하지만, 기본적으로 Google 광고를 사용하면 IE에서 완전히 pushstate가 깨진다. 내가 고칠 수있는 유일한 방법은 Google 광고를 사용하지 않는 것입니다.

+0

그래,이 문제가 아직 해결되지 않은 것은 이상합니다. 우리는 현재 IE에서 광고를 새로 고치지 않고 있습니다. – Bodman

1

IE10과 IE11에서 같은 문제가 발생합니다. 매우 실망 스럽습니다. 내가 여기에 볼 수있는 마이크로 소프트와의 버그를 제기 한 내용을 그 가치에 대한

:

https://connect.microsoft.com/IE/feedbackdetail/view/979564/ie-pushstate-history-is-corrupted-by-google-adsense-google-dpf-doubleclick-for-publishers-advertising

당신은 시간이 당신이 희망 수정쪽으로 더 무게를 제공하기 위해 버그에 관해서 추가해야합니다.

+0

MS 팀이 PoC를 요청한 것으로 응답했습니다. 아마도 그들에게 회신 해 주시겠습니까? 이후로 아무런 조치가 취해지지 않았습니다. –

2

아담 우리는 똑같은 문제를 가지고 있었다. IE10과 IE11에서는 DFP를 사용하는 경우 pushstate가 거의 쓸모가 없습니다.

그러나 우리는 해결책을 찾았습니다. 그것은 예쁘지 않지만 작동합니다.

광고를로드하는 대신 iframe을 삽입합니다. 해당 iframe 내에서 평상시처럼 광고가로드됩니다. 그러나 refresh() - 메서드는 해당 iframe 내부에서 사용할 수 없으며 동일한 문제가 여전히 발생합니다. 하지만 광고가 iframe에로드 될 때 수행 할 수있는 작업은 전체 iframe을 새로 고치는 것입니다. 이렇게하면 새로 고침되고 푸시 스테이트 기능이있는 광고는 그대로 유지됩니다.

아주 고약하지만 작동합니다. iframe에서 광고를로드하는 것은 여러 가지 이유로 나쁜 것이므로 IE10 및 IE11에서만이 작업을 수행합니다.

0

은 내가 DFP 도움말 포럼에 게시 된 : 내가 jQuery를 사용하는 솔루션을 작업 한 https://productforums.google.com/forum/#!topic/dfp/9BsgVtKTU9A

.

if(typeof googletag !== 'undefined' && typeof googletag.pubads !== 'undefined') { 
    if(adsCloned === false) { 
     var $dfpIframe = $('#div-gpt-ad-1477269112222-0').find('iframe'); // this is ad id that you use in googletag.defineSlot() 

     $dfpIframe.each(function (i, v) { 
     var $clone = $(v).clone(); 
     $(v).replaceWith($clone); 
     }); 
     adsCloned = true; 
    } 
    googletag.pubads().refresh(); 
} 

당신이 var adsCloned = false; 작동하는 이유를 정의해야 즉, 당신이 (이 경우 복제 된 iframe에) 페이지로드 후 삽입 된 iframe이 새로 고침 할 때 기록 항목이 늘 IE에 추가되기 전에.

편집 : 그것은 당신을 위해 작동하지 않을 경우 이 statememt 경우 삭제하려고 :

if(typeof googletag !== 'undefined' && typeof googletag.pubads !== 'undefined') { 
     var $dfpIframe = $('#div-gpt-ad-1477269112222-0').find('iframe'); // this is ad id that you use in googletag.defineSlot() 

     $dfpIframe.each(function (i, v) { 
      var $clone = $(v).clone(); 
      $(v).replaceWith($clone); 
     }); 
     googletag.pubads().refresh(); 
    } 

위의 코드 wont't 작업 - 내 실수. 하지만 나를위한 해결책은 전체 googletag 변수를 파괴하고 전체 코드를 다시 호출하는 것입니다.

는 DFP 스크립트의

첫 번째 호출은 다음과 같습니다 (노트 googletag.pubads() disableInitialLoad를();와 gads.id = 'dfpHeadScript';.) :

// Doubleclick 
var googletag = googletag || {}; 
googletag.cmd = googletag.cmd || []; 
(function() { 
    var gads = document.createElement('script'); 
    gads.async = true; 
    gads.id = 'dfpHeadScript'; 
    gads.type = 'text/javascript'; 
    var useSSL = 'https:' == document.location.protocol; 
    gads.src = (useSSL ? 'https:' : 'http:') + 
     '//www.googletagservices.com/tag/js/gpt.js'; 
    var node = document.getElementsByTagName('script')[0]; 
    node.parentNode.insertBefore(gads, node); 
})(); 

googletag.cmd.push(function() { 
    enovatis.dfpSlots.push(googletag.defineSlot('...', [240, 400], 'div-gpt-ad-1').addService(googletag.pubads())); 
    enovatis.dfpSlots.push(googletag.defineSlot('...', [[960, 100], [750, 100]], 'div-gpt-ad-2').addService(googletag.pubads())); 

    googletag.pubads().enableSingleRequest(); 
    googletag.pubads().collapseEmptyDivs(); 
    googletag.pubads().disableInitialLoad(); 
    googletag.enableServices(); 
}); 

googletag.cmd.push(function(){ 
    googletag.pubads().refresh(); 
}); 

및 새로 고침 광고하는 방법은 다음과 같습니다

var dfpInterval = null; 
var $dfpTop = $('#div-gpt-ad-1'); 
var $dfpLeft = $('#div-gpt-ad-2'); 

function refreshDfp() { 

    $dfpTop.empty(); 
    $dfpLeft.empty(); 

    googletag = {}; 
    googletag.cmd = []; 

    $('#dfpHeadScript').remove(); 

    (function() { 
     var gads = document.createElement('script'); 
     gads.async = true; 
     gads.id = 'dfpHeadScript'; 
     gads.type = 'text/javascript'; 
     var useSSL = 'https:' == document.location.protocol; 
     gads.src = (useSSL ? 'https:' : 'http:') + 
      '//www.googletagservices.com/tag/js/gpt.js'; 
     var node = document.getElementsByTagName('script')[0]; 
     node.parentNode.insertBefore(gads, node); 
    })(); 

    googletag.cmd.push(function() { 
     enovatis.dfpSlots.push(googletag.defineSlot('...', [240, 400], 'div-gpt-ad-1').addService(googletag.pubads())); 
     enovatis.dfpSlots.push(googletag.defineSlot('...', [[960, 100], [750, 100]], 'div-gpt-ad-2').addService(googletag.pubads())); 
     googletag.pubads().enableSingleRequest(); 
     googletag.pubads().collapseEmptyDivs(); 
     googletag.pubads().disableInitialLoad(); 
     googletag.enableServices(); 

     window.clearInterval(dfpInterval); 
     dfpInterval = window.setInterval(function(){ 
      if(typeof googletag.pubads !== 'undefined'){ 
       window.setTimeout(function(){ 
        googletag.pubads().refresh(); 
       }, 75); 
       window.clearInterval(dfpInterval); 
      } 
     }, 75); 
    }); 
} 

나는 그것을 전화 : refreshDfp.apply(window); 모든 것이 잘 작동합니다. 이 접근법의 유일한 단점은 매번 Google에 더 많은 요청을 보내는 것입니다.

관련 문제