를 해결할 수 기본적으로 내가 코드의 두 라인을 잘document.write가 작동하는 컨텍스트를 어떻게 찾을 수 있습니까? 당신이 수수께끼
console.log(typeof (noAdsCallback));
document.write('<sc' + 'ript type="text/javascript">console.log(typeof(noAdsCallback));</scr' + 'ipt>');
첫 번째는 function
기록, 두 번째 로그 undefined
: 서로 후 작성했습니다.
물론 그보다 조금 까다 롭습니다. 여기에 설정이 간단히 나와 있습니다.
나는 광고 제공 업체라는 폭포가 있습니다. 즉, 필자는 document.write를 사용하여 일부 특수 태그 (광고 제공 업체가 제공 한)를 작성하여 일부 광고를로드하려고합니다.
이if (typeof(window.noAdsCallback) === "function") noAdsCallback();
이 기능은 기본적으로 다음 공급자의 태그를 기록, 같은 작업을 수행합니다 공급자가 나를 위해 광고를 찾을 수없는 경우
, 그들은 다음과 같습니다 자바 스크립트 - 조각을 다시 보내 내가 목록의 끝에 도달 할 때까지 첫 번째로.
이 시스템은 실제로 제대로 작동하여 원하는 작업을 정확하게 수행합니다. 처음 두 줄은 function
로그에 기록됩니다.
Google을 광고 제공 업체로 사용하는 경우를 제외하고 Google이 다르게 한 가지가 있습니다. 모든 것을 엉망으로 만드는 것처럼 보입니다.
Google에서는 폴백 - 자바 스크립트 스 니펫을 정의 할 수 없습니다. 내가 할 수있는 것은 fallback-url을 제공하는 것입니다. 따라서이 fallback-url (내부 iframe 내부의 iframe 내부에로드 된 이후)은 postMessage를 맨 위로 보내고 동일한 noAdsCallback() 메서드를 호출합니다. 그리고 이것도 잘 작동합니다. 메시지가 수신되고 올바른 방법이 실행됩니다. 그러나 이미 두 줄은 이미 다른 결과를 나타냅니다. 즉, function
및 undefined
각각
다음 공급자는 document.write를 사용하여 실행하려고하므로 noAdsCallback() 메서드가 반환 될 때 noAdsCallback() 메서드를 찾지 못합니다. 여하튼, 문맥은 분실되었다.
첫 번째 힌트 : 크롬에서는 두 줄의 로그가 모두 올바르게 표시되지만 (FF12 또는 IE에서는 작동하지 않습니다) FF 또는 IE에서는 작동하지 않습니다.
두 번째 힌트 : 컨텍스트가 전환되지 않는 한 정상적으로 작동하지만 메시징을 통해 통신이 어느 지점에서든 실행되면 혼란 스럽습니다.
세 번째 힌트 : 아래에 언급 된 환상적인 포스트 스크립트 라이브러리를 사용하여 실제로 문제를 해결하지만 다른 곳에서는 새로운 문제를 소개합니다.
네 번째 힌트 : document.write를 사용하기 전에 window.name을 디버깅하면 올바른 이름이 부여되므로 임의의 iFrame에 있지 않습니다.
마무리 생각. 나는 알고있다 : 나는 문서 쓰기를 사용하지 말라 !! 나는 그것을 안다. Adproviders이 모든 시간을 사용하기 때문에, 나는 그렇지 않으면 내가 얻을, 그것을 사용하도록 강요하고이 : 사실, 지금은 postscribe (https://github.com/krux/postscribe)를 사용하고 있는데 그것을 제외하고 매력처럼 작동
Failed to execute 'write' on 'Document': It isn't possible to write into a document from an asynchronously-loaded external script unless it is explicitly opened.
한 lousey 공급자에 대한. 그리고 workauround 솔루션은 문서를 사용하는 것입니다.이 비열한 공급자에 대해서만 쓰고 다른 모든 것에 대해서는 후원을하십시오. 그러나 나는 정말로 문제의 근원이 무엇인지 알아 내고 싶다.
모든 아이디어, 많은 감사하겠습니다.