>  기사  >  웹 프론트엔드  >  iframe 비동기 로딩 기술 및 성능 분석_javascript 기술

iframe 비동기 로딩 기술 및 성능 분석_javascript 기술

WBOY
WBOY원래의
2016-05-16 18:04:341134검색

원본 번역글입니다. 원래 주소.

우리는 종종 iframe을 사용하여 타사 콘텐츠, 광고 또는 플러그인을 로드합니다. Iframe은 메인 페이지와 병렬로 로드될 수 있고 메인 페이지를 차단하지 않기 때문에 사용됩니다. 물론, iframe 사용에는 장단점이 있습니다. Steve Souders는 자신의 블로그에서 이에 대해 다음과 같이 설명합니다. Iframes를 아껴서 사용:

  • iframe은 메인 페이지의 onload 이벤트를 차단합니다.
  • 메인 페이지와 iframe은 동일한 연결 풀을 공유합니다

메인 페이지의 온로드를 차단하는 것은 이 두 가지 문제 중 성능에 가장 영향을 미치는 측면입니다. 일반적으로 우리는 온로드 시간이 가능한 한 빨리 실행되기를 원합니다. 한편으로는 사용자가 이를 경험했으며 더 중요한 것은 Google이 웹사이트의 로딩 속도를 평가한다는 것입니다. 사용자는 IE 및 FF에서 Google 툴바를 사용할 수 있습니다. 시간 시간.

그럼 페이지 성능을 향상시키기 위해 메인 페이지의 onload 이벤트를 차단하지 않고 iframe을 로드하려면 어떻게 해야 할까요?

이 기사에서는 iframe을 로드하는 네 가지 방법, 즉 일반 iframe, 온로드 후 iframe 로드, setTimeout() iframe 및 비동기 로딩 iframe에 대해 설명합니다. 저는 IE8 타임라인을 사용하여 각 메소드의 로딩 결과를 표시합니다. 동적 비동기 로딩 방식이 최고의 성능을 가지고 있기 때문에 더욱 주의를 기울일 것을 권합니다. 게다가 Friendly iframe(친절한 iframe) 기술도 있습니다. iframe 로딩 기술이라고 볼 수는 없지만, 차단 없이 로딩되기 때문에 iframe을 사용해야 합니다.
일반 방법으로 iframe 로드
이것은 브라우저 호환성 문제가 없는 잘 알려진 일반 로딩 방법입니다.
메서드는 각 브라우저에서 다음과 같이 작동합니다.

기본 페이지가 온로드되기 전에 iframe이 로드됩니다.
iframe은 기본 페이지의 모든 iframe 콘텐츠가 로드된 후
iframe의 온로드를 트리거합니다. iframe의 onload가 트리거된 후에 page onload가 트리거되므로 iframe이 메인 페이지의 로딩을 차단합니다.
iframe이 로딩 중일 때 브라우저는 무언가를 로딩 중이며 사용 중인 상태임을 나타냅니다.
다음은 데모 페이지입니다. 타임라인을 보면 iframe이 메인 페이지 로딩을 차단하고 있음을 알 수 있습니다.

iframe 비동기 로딩 기술 및 성능 분석_javascript 기술
내 제안: 온로드 차단에 주의하세요. iframe의 콘텐츠를 로드하고 실행하는 데 짧은 시간만 소요된다면 큰 문제가 되지 않으며, 이 방법을 사용하면 메인 페이지와 병렬로 로드할 수 있다는 장점이 있습니다. 하지만 이 iframe을 로드하는 데 시간이 오래 걸리면 사용자 경험이 매우 저하됩니다. 직접 테스트한 다음 http://www.webpagetest.org/에서 몇 가지 테스트를 수행하여 온로드 시간에 따라 다른 로딩 방법이 필요한지 확인해야 합니다.


onload 후 iframe 로드
iframe에 일부 콘텐츠를 로드하고 싶지만 해당 콘텐츠가 페이지에 그다지 중요하지 않은 경우. 또는 콘텐츠가 사용자에게 즉시 표시될 필요는 없지만 트리거하려면 클릭해야 합니다. 그런 다음 기본 페이지가 로드된 후 iframe 로드를 고려할 수 있습니다.

코드 복사 코드는 다음과 같습니다.
<script> 로드 이벤트를 차단하지 않습니다. <br>function createIframe() { <br>var i = document.createElement("iframe") <br>i.src = "path/to/file" <br>i. 스크롤링 = " 자동"; <br>i.frameborder = "0"; <br>i.width = "200px"; <br>i.height = "100px" <br>document.getElementById("div-that -holds- the-iframe").appendChild(i); <br>}; <br>// 브라우저의 이벤트 처리 기능 지원 확인 <br>if (window.addEventListener) window.addEventListener("load", createIframe , false) <br>else if (window.attachEvent) window.attachEvent("onload", createIframe) <br>else window.onload = createIframe; <br></script>
这种加载方法也是没有浏览器的兼容性问题的:

iframe会在主页面onload之后开始加载
主页面的onload事件触发与iframe无关,所以iframe不会阻塞加载
当iframe加载的时候,浏览器会标识正在加载
这是是一个测试页面,时间线图如下
iframe 비동기 로딩 기술 및 성능 분석_javascript 기술
这种方法比普通方法有什么好处呢?load事件会马上触发,有两个好处:
其他等待主页面onload事件的代码可以尽早执行
Google Toolbar计算你页面加载的时间会大大减少
但是,当iframe加载的时候,还是会看到浏览器的忙碌状态,相对于普通加载方法,用户看到忙碌状态的时间更长。还有就是用户还没等到页面完全加载完的时候就已经离开了。有些情况下这是个问题,比如广告。

setTimeout()来加载iframe
这种方法的目的是不阻塞onload事件。
Steve Souders(又是他?)有一个这种方法的测试页面(http://stevesouders.com/efws/iframe-onload-nonblocking.php)。他写道:“src通过setTimeout动态的设置,这种方法可以再所有的浏览器中避免阻塞”。
复制代码 代码如下:


<script> <br>function setIframeSrc() { <br>var s = "path/to/file"; <br>var iframe1 = document.getElementById('iframe1'); <br>if ( - 1 == navigator.userAgent.indexOf("MSIE")) { <br>iframe1.src = s; <br>} else { <br>iframe1.location = s; <br>} <br>} <br>setTimeout(setIframeSrc, 5); <br></script>

在除了IE8以外的所有浏览器中会有如下表现:
iframe会在主页面onload之前开始加载
iframe的onload事件会在iframe的内容都加载完毕之后触发
iframe不会阻塞主页面的onload事件(IE8除外)
为什么不会阻塞主页面的onload呢(IE8除外)?因为setTimeout()
当iframe加载的时候,浏览器会显示忙碌状态
下面是时间线图
iframe 비동기 로딩 기술 및 성능 분석_javascript 기술
因为IE8的问题,这种技术就不适合很多网站了。如果有超过10%的用户使用IE8,十分之一的用户体验就会差。你会说那也只是比普通加载差一点点,其实普通加载性能上也不差。onload事件对于10%的用户来说都更长。。。。额,你自己考虑吧。但是最好在看了下面这个很赞的异步加载方法之后再决定吧。
我在参加Velocity 2010的时候,Meebo的两个工程师(@marcuswestin and Martin Hunt)做了一个关于他们的Meebo Bar的演讲。他们使用iframe来加载一些插件,并且真正做到了无阻塞加载。对于有的开发者来说,他们的做法还比较新鲜。很赞,超级赞。但是一些原因导致这种技术没有得到相应的关注,我希望这篇blog能把它发扬光大。
复制代码 代码如下:

<script> <br>(function(d) { <br>var iframe = d.body.appendChild(d.createElement('iframe')), <br>doc = iframe.contentWindow.document; <br>// style the iframe with some CSS <br>iframe.style.cssText = "position:absolute;width:200px;height:100px;left:0px;"; <br>doc.open().write('<body onload="' + 'var d = document;d.getElementsByTagName(\'head\')[0].' + 'appendChild(d.createElement(\'script\')).src' + '=\'\/path\/to\/file\'">'); <br>doc.close(); //iframe onload event happens <br>})(document); <br></script>

神奇的地方就在:这个iframe一开始没有内容,所以onload会立即触发。然后你创建一个script元素,用他来加载内容、广告、插件什么的,然后再把这个script添加到HEAD中去,这样iframe内容的加载就不会阻塞主页面的onload!你应该看看他在个浏览器中的表现:
iframe会在主页面onload之前开始加载
iframe的onload会立即触发,因为iframe的内容一开始为空
主页面的onload不会被阻塞
为什么这个iframe不会阻塞主页面的onload?因为
如果你不在iframe使用onload监听,那么iframe的加载就会阻塞主页面的onload
当iframe加载的时候,浏览器终于不显示忙碌状态了(非常好)
我的测试页给出下面的时间线:
iframe 비동기 로딩 기술 및 성능 분석_javascript 기술
이스케이프 문자로 인해 코드가 약간 불편해 보이지만 문제가 되지 않습니다. 한번 시도해 보세요.

친숙한 iframe 로딩

광고를 로드하는 데 사용됩니다. 이는 iframe 로딩 기술은 아니지만 iframe을 사용하여 광고를 담습니다. 가장 중요한 점은 iframe이 로드되는 방식이 아니라 기본 페이지, iframe 및 광고가 함께 작동하는 방식입니다. 다음과 같습니다:
  • 먼저 iframe을 생성하세요. 그의 src를 동일한 도메인 이름의 정적 HTML 파일로 설정하십시오.
  • 이 iframe에서 js 변수 inDapIF=true를 설정하여 광고가 이 iframe에 로드되었음을 광고에 알립니다.
  • 이 iframe에서 스크립트 요소를 생성하고 광고의 URL을 src로 추가한 후 일반 광고 코드처럼 로드합니다.
  • 광고가 로드되면 광고에 맞게 iframe 크기를 재설정하세요.
  • 이 방법에도 브라우저 호환성 문제가 없습니다.
Ad Ops Council에서 이 방법을 권장하고 있으며 AOL에서도 이 방법을 사용하고 있습니다. 소스 코드를 보고 싶다면 여기가 있습니다. 스웨덴 출판사인 Aftonbladet은 이러한 종류의 로딩에 대해 매우 좋은 결론을 내렸습니다. 홈페이지에서 로딩 시간은 30% 감소하고 사용자는 매주 7% 증가하며 뉴스 섹션 클릭 수는 35% 증가합니다. 다음 정보를 살펴보시기 바랍니다. 광고가 포함된 고성능 웹 사이트: 제3자가 속도를 저하시키지 않도록 하세요
해당 테스트 페이지를 만들지 않아서 첫 번째 곡에 대한 정보가 없습니다. 내 연구 결과:
이 방법은 웹페이지에서 특정 src 주소로 iframe만 호출하려는 경우에는 그다지 유용하지 않습니다.
웹 페이지에 여러 광고를 표시하려는 경우 더 유연한 방법은 하나의 광고를 로드한 다음 iframe을 업데이트하여 다른 기본 페이지를 로드하는 것입니다. DOMContentLoaded 시간은 차단되지 않으며 페이지 렌더링도 수행되지 않습니다. 물론, 메인 페이지의 onload 이벤트는 계속 차단됩니다.
재인쇄 시 표시해 주세요:
저자: BeiYuu
성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.