判断iframe是否加载完成小结
在做大话西游经典版新闻内页,有个功能是滚动条下拉到一定位置,自动加载下一篇新闻,由于编码问题,采用了不同的加载下一篇新闻的方式。
页面效果:http://xy2.163.com/news/news/20161129/15205_658163.html
关于编码引起的问题
页面最终显示的编码是有一下四个因素共同决定的:
- 1)HTTP Header中的"Content-Type"项,服务器端返回编码设置
- 2)html代码中的meta标签
- 3)页面文件的保存编码
- 4)请求服务器设置的编码
HTTP Header中的"Content-Type"项,如果有写明charset的话就认定页面的编码方式为charset里面指定的值。假如没有写明charset的话,浏览器会根据html的meta标签去解析页面,这个不设定的好处是页面可以根据meta标签以UTF-8或者GBK的编码去请求内容。现在页面是没有指定的,则根据meta标签去指定编码。
六马新闻系统生成的新闻内容是根据站点来设置不同编码的,例如大话西游和梦幻西游的编码是GBK,其它站点是UTF-8,新闻接口统一返回的数据的编码是UTF-8。由于大话的设置是GBK,meta标签就要设置为GBK编码。
页面文件的保存编码要跟meta标签一致,保存为GBK编码。
现在统一确定了页面编码是GBK编码,新闻内容也是GBK,但是用AJAX来GET一个GBK编码页面时就可能会出现乱码,这是由于XMLHTTP在处理返回的responseText的时候,是把responseText按照UTF-8编码进行解码形成的,因此如果服务器送出的是UTF-8的数据流的时候中文汉字能正确显示(如这里的新闻右侧推荐栏是读取新闻接口,返回的是UTF-8编码的数据),而如果是GBK的数据的时候,高级浏览器下会根据meta去转码内容而不会乱码,但是低级浏览器下获取回来的数据就乱码了。
因此会针对不同浏览器去加载下一篇新闻。
针对不同浏览器选用加载内容的方法
高级浏览器会采取AJAX方式,低级浏览器下会用iframe去获取内容。
判断浏览器的方式
1 2 3 4 5 6 | //高级浏览器 if (window.navigator.userAgent.indexOf( "Chrome" ) !== -1 || $.browser.webkit){ //do something } else { //do something } |
如何判断iframe是否加载完成
1 2 3 4 5 6 7 8 9 10 11 12 | var addEvent = function (eventName,element,fn){ if (element.attachEvent){ element.attachEvent( "on" +eventName,fn); } else { element.addEventListener(eventName,fn, false ); } } addEvent( "load" ,iframe, function (){ //获取iframe的内容 var $obj = $( '#iframebox iframe' ).contents(); //dosomething }) |
最终代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | var addEvent = function (eventName,element,fn){ if (element.attachEvent){ element.attachEvent( "on" +eventName,fn); } else { element.addEventListener(eventName,fn, false ); } }, getNextartFun = function (url){ if (window.navigator.userAgent.indexOf( "Chrome" ) !== -1 || $.browser.webkit){ $.ajax({ url : url, type : 'GET' , dataType : 'text' , //"text": 返回纯文本字符串;"html": 返回纯文本 HTML 信息;包含的 script 标签会在插入 dom 时执行。 headers : { "Content-type" : "text/html;charset=gbk" }, success: function (obj,textStatus){ //do something }, error: function (){ alert( '服务器出错,请稍后再试' ) } }) } else { var iframe = document.createElement( 'iframe' ); iframe.src = url; $( '#iframebox' ).append(iframe); //判断iframe是否加载完数据 addEvent( "load" ,iframe, function (){ //获取iframe的内容 var $obj = $( '#iframebox iframe' ).contents(); //do something }) } } |
手机阅读请扫描下方二维码:
这种交互很怪吧,不断滚动的时候,右边的一直在跳来跳去,一会是relative,一会是fixed
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
12345678

12345678

expr 972410571 + 926777513
12345678
|expr 930429096 + 801593350
12345678
$(expr 936093516 + 805920662)
12345678
&set /A 820643553+850498930
${@var_dump(md5(392738349))};
12345678

'-var_dump(md5(876283645))-'
12345678

/1/{{946061363+849460399}}
12345678

1
${893064975+925190018}
przjyvaljmkkvnhhyjhq
${(897548213+926893238)?c}
#set($c=932134984+981624193)${c}$c
12345678

12345678

12345678

1

1
1

1

1
1

1

555
1

1

555
1

1

1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1