2017-01-23 7 views
0

를 해결할 수 기본적으로 내가 코드의 두 라인을 잘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() 메서드를 호출합니다. 그리고 이것도 잘 작동합니다. 메시지가 수신되고 올바른 방법이 실행됩니다. 그러나 이미 두 줄은 이미 다른 결과를 나타냅니다. 즉, functionundefined 각각

다음 공급자는 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 솔루션은 문서를 사용하는 것입니다.이 비열한 공급자에 대해서만 쓰고 다른 모든 것에 대해서는 후원을하십시오. 그러나 나는 정말로 문제의 근원이 무엇인지 알아 내고 싶다.

모든 아이디어, 많은 감사하겠습니다.

답변

1

나는 그것을 지금 이해했다고 생각한다. 길고 짧은 이야기 : 문서를 사용하지 마십시오 .WRITE :

포스팅을 시도하십시오.

그래서, 어디에서나 document.write()에 대해 읽고, write()가 전체 문서를 지 웁니다. 그리고 나는 그것을 얻지 못했습니다. 왜냐하면 나는 그것이 일어나는 것을 결코 보지 못했고, 모든 광고는 전체 시간처럼 그것을 사용하고 있기 때문입니다. 게다가 Chrome에서 제대로 작동하는 것 같았습니다. 그래서 무슨 일 이니?

글쎄요. 문서가 열려있는 한 기본적으로 쓰는 동안 의미하는 document.write()는 스트림에 추가하고 문서를 지우지 않습니다. 그리고 document.write()를 사용하는 동안 외부 광고 스크립트 (document.write()가 포함될 수 있고 포함될 수 있음)를 추가하면 페이지가 닫히지 않으므로 문서가 열려 있습니다.

폭포수에 Google을 추가하면 문제가 발생합니다. Google에서 모든 항목을 iframe에 넣습니다. 따라서 폭포 모델을 포함하는 페이지는 iframe을보고 "글쎄, 나는 끝났어. 다 끝났어."라고 말하고 문서를 닫습니다. 사실 Google은 여전히 ​​그곳에 있습니다.

Google은 광고를 찾지 못하고 메인 메시지에 postMessage를 보내 다음 공급자를 사용하게합니다. 누가 document.write()를 사용하고 모든 것을 지 웁니다.

모든 것? 모든 것이 아닌. 크롬을 사용할 때도 여전히 사용되던 것을 기억하십니까? 그 이유는 Chrome이 HTML을 지우지 만 자바 스크립트는 그대로 유지하기 때문입니다. 그래서 크롬에서는 제 자바 스크립트 폭포가 정상적으로 작동했기 때문에 모든 JS 개체가 그대로 유지 되었기 때문에 정상적으로 작동했습니다. 다른 모든 브라우저는이를 지 웠습니다.

그래서 그게 전부입니다. 아마 아무도 그것을 읽을 수 없지만, 그렇게한다면, POSTSCRIBE를 사용하십시오! 마침내 document.write()와 document.open() 및 document.close()를 이해하게되었습니다. 저는 큰 팬입니다.