script 的 defer 问题

数以亿计[web]窗体使用了[script]标签,估计有不少人都遇到了类似的麻烦。麻烦是什么呢?

[script]标签有一个属性[defer],其作用是标识该[script]的执行在页面完全载入之后,并鬼使神差的使[src]属性失去了的功效。这无形中限制了一些操作,如:document.write()。

真实世界里程序员 XX 在一次项目中碰到这样一种情况。该项目的终极目标是提供一段 HTML+CSS 的文本,并在使用该文本的[web]窗体上正常显示出来。[web]窗体里使用了这句话:
<script type="text/javascript"><!--
__BitAuto_AutoSense_200707 = "{127CF09A-2B87-4f6e-9D37-FC7B894C7521}";
__BitAuto_AutoSense_200707_Version = "1.0";
-->
</script>
<script type="text/javascript" src=" http://autosense.bitauto.com/JScript.js"></script>

别小看这句话啊,它真的完成了这个目标哦。
事过变迁,NB 的 YY 将这句话修改成了:
<script type="text/javascript"><!--
__BitAuto_AutoSense_200707 = "{127CF09A-2B87-4f6e-9D37-FC7B894C7521}";
__BitAuto_AutoSense_200707_Version = "1.0";
-->
</script>
<script defer type="text/javascript" src=" http://autosense.bitauto.com/JScript.js"></script>

这下子完了,这句话不管用了。因为 http://autosense.bitauto.com/JScript.js 使用到了 document.write()。它在[web]窗体完全载入后重新[write]了。

在 XX 痛苦的时候,BB 和 CC 出现了,使用他们的“阴谋”和“诡计”终于想出了这么一招。记住:不是《葵花宝典》。

[中间广告]
{
这里提到的BB是兔子,CC是毛驴
在此非常感谢BB和CC的帮助...
}

<script type="text/javascript" src=" http://autosense.bitauto.com/tJScript.js"></script>
<script type="text/javascript" id="bitauto_autosense_script"></script>
<div id="bitauto_autosense" class="bitauto_autosense"></div>
<link type="text/css" rel="stylesheet" href=" http://autosense.bitauto.com/style/sohu.css"></link>

思路是:使用一个[script]下载那段前面提到的 HTML+CSS 的文本,在下载的同时使用[appendChild()]挂到[div]上去。

疑问是:为什么不使用XMLHttpRequest下载呢?
答案是:下载方和提供下载方处于不同的URL地址,出现跨域的安全验证,这会让一批人因烦而死。

以下是  http://autosense.bitauto.com/tJScript.js 内容。

// 浏览器类型
var __Browser = new Object();
__Browser.isMozilla = (typeof document.implementation != 'undefined') && (typeof document.implementation.createDocument != 'undefined') && (typeof HTMLDocument!='undefined');
__Browser.isIE = window.ActiveXObject ? true : false;
__Browser.isFirefox = (navigator.userAgent.toLowerCase().indexOf("firefox")!=-1);
__Browser.isOpera = (navigator.userAgent.toLowerCase().indexOf("opera")!=-1);

var __bitauto_autosense = {

Version: "1.0",

CharSet: "gb2312",

EffectAreaID: "",

AutoSenseUrl: " http://autosense.bitauto.com/Autosense.aspx",

DynamicLoadJavaScript: function() {
this.AutoSenseUrl = " http://autosense.bitauto.com/tAutosense.aspx";
this.AutoSenseUrl += "?c=" + this.CharSet;
this.AutoSenseUrl += "&t=" + this.EffectAreaID;
this.AutoSenseUrl += "&d=bitauto_autosense";

document.getElementById("bitauto_autosense_script").src = this.AutoSenseUrl;
},

AppendHTML: function( _EffectAreaID, _Version ) {
this.EffectAreaID = _EffectAreaID;
this.Version = _Version;

if( this.Version == "1.0" )
{
this.AutoSenseUrl += "?c=" + __CharSet
this.AutoSenseUrl += "&t=" + __EffectAreaID;

document.write( "<script language='javascript' src='" + __JScript_Src + "'></script>" );
}
else if( this.Version == "1.1" )
{
if( window.attachEvent )
{
window.attachEvent( "onload", this.DynamicLoadJavaScript );
}
if( window.addEventListener )
{
window.addEventListener( "load", this.DynamicLoadJavaScript, true );
}
}
}
}

// 当前访问页面编码格式
if( __Browser.isIE ) { __bitauto_autosense.CharSet = document.charset; }
if( __Browser.isFirefox ) { __bitauto_autosense.CharSet = document.characterSet; }

// 样式有效范围编码
if( typeof( __BitAuto_AutoSense_200707 ) != 'undefined' )
{
__bitauto_autosense.EffectAreaID = __BitAuto_AutoSense_200707;
}

// 输出[autosense]广告
__bitauto_autosense.AppendHTML( "{127CF09A-2B87-4f6e-9D37-FC7B894C7521}", "1.1" );  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值