2014-01-15 3 views
1

Google의 doubleclick에서 해당 함수로 래핑 된 광고를 렌더링하려면 document.write를 재정의해야합니다. 표준 document.write는 페이지 내용을 완전히 대체하기 때문에 광고 내용을 기존 요소에 추가하기 위해 document.write가 페이지 내용을 완전히 대체합니다. 그러나이 오버라이드는 광고 렌더링 중에 만 발생하며 페이지에있을 수있는 다른 모든 문서. 파일에는 영향을 미치지 않습니다. 이것이 폐쇄를 통해 범위를 지정하거나 완수 할 수 있습니까? 나는 그 일이 어떻게 이루어지는 지 잘 모른다.지정된 범위 내에서 document.write를 재정의 하시겠습니까?

지금까지 내가 가진 :

(function(){ 
function RenderAd(adURL,Element) 
{ 
    document.write = function(adContent) {       
     Element.append(adContent); 
    } 
    $.getScript(adURL); 
} 
    RenderAd('http://ad.doubleclick.net/N4890/adj/za.za.home/main;pos=300top;tile=2;sid=Amazon;sz=300x250;ord=12247707435800953?',$('#HeaderDiv')); 
}(document.write)); 

을하지만 나중에 document.write('test');를 호출 할 때, 그것은 여전히 ​​document.write를 내 버전을 사용하고 있습니다.

+0

'document.write'의 값을 커스텀 함수로 덮어 쓰고 있습니다. 그러나 원래 값을 어디에도 다시 설정하지 않습니다. 자동으로 되돌려 야합니까? – Jon

+0

@ 존 이것은 범위와 종결의 전체 개념입니다. 문서 객체의 일부로 전역 함수로는 작동하지 않습니다. – AesopWaits

+0

코드가 속성을 수정하기 위해'window.document'에 직접 도달하는 대신에 인수를 사용하면됩니다. – Jon

답변

3

document.write는 HTML 문서에서 범위가 지정되므로 변경할 경우 후속 호출에서도 덮어 쓰기 버전이 실행됩니다. temp.var에 원래의 document.write 함수를 저장하고, 덮어 쓰고, 함수 호출을 완료 한 후 다시 호출하는 등의 작업을 시도 할 수 있습니다. 그러나 document.write 호출은 콜백을 통해 이루어 지므로 async입니다. 이런 식으로 한 페이지에 여러 광고를로드하는 경우 원본 문서를 언제 복원해야하는지 예측할 수 없습니다.

서비스 호출이 document.write() 호출로 래핑 된 HTML을 반환하는 시나리오에서 일반적으로 수행되는 작업은 해당 문서 객체를 포함하는 별도의 iframe에 문서를로드하는 것입니다.

가능한 경우 각 광고에 iframe을 만들고 Google의 doubleclick 호출에서 반환 된 데이터를 iframe에로드하십시오. document.write는 해당 iframe 용 버퍼를 만들고 상위 HTML에 영향을 미치지 않습니다.

1

iframe을 사용하여 광고를 배치하십시오. 그렇게하면 document.write를 재정의 할 필요가 없습니다. 광고는 자체 iframe에서 렌더링되며 기본 페이지의 document.write를 사용하지 않습니다.

간주 또 다른 해결책 : 1. 원래 document.write를 저장 변수 2. 재정의 document.write를 당신의 버전으로 3. $ .getScript 성공 콜백 원래 document.write를 복원합니다.

하지만 스크립트가 실행 된 후에 콜백이 시작되지 않으므로 작동하지 않습니다.

0

그것은) (당신이 document.write를 제어 할 수 있습니다 https://github.com/shenjunru/LazyWrite

시도에 오신 것을 환영합니다.

호프가 문제를 해결할 수 있기를 바랍니다. 어떤 질문이라도 환영합니다.