背景在不支持打包构建的前端历史项目中,我们经常会有动态引入脚本的需求。为了写的方便,我们在开发的时候会习惯性的使用jQuery生成脚本标签append到body上,把它当做和原生的写函数一模一样//jQueryvar$script=$('标签,但是网上也发了xhr的请求被拒绝了,这是怎么回事?这些需要看源码//我们使用jQuery插入动态脚本//注意jQuery生成的脚本和原生的有细微差别//比如原生方式插入这个script标签就不会发送jsonp请求,原因是我还没找到//所以如果要按照标准的jsonp,需要使用native写法,不要偷懒var$script=$('');$('body').append($script);//jQuery源码(截取并添加注释)//append方法append:function(){//发送xhr的逻辑就在这个domManip中,让我们拭目以待1||this.nodeType===11||this.nodeType===9){vartarget=manipulationTarget(this,elem);//原来的插入动作,正是这句话让我们searchforthescripttagstructureinHTML//但是为什么明明有tag却没有jsonp请求呢?看看target.appendChild(elem);}});},//domManip的重要部分被拦截...//发送对应的xhr请求jQuery._evalUrl(node.src);...}//上面两个片段分别说一下//下面说说disableScript是干什么的functiondisableScript(elem){//通过这一行后,会处理script标签的类型,比如[trur/text/javascript]//很明显,前面带boolean的类型无论如何都是不合法的//所以这种奇怪的script标签类型会被当做一个文本块,而不是发送网络请求//这个类型会在后面的逻辑,但是插入的script标签不会让它重新请求elem.type=(elem.getAttribute("type")!==null)+"/"+elem.type;returnelem;}//看一下_evalUrljQuery._evalUrl=function(url){//需要注意的是,因为是使用xhr,所以全局拦截器设置为生效,可能会处理请求,比如添加时间戳returnjQuery.ajax({url:url,type:"GET",dataType:"script",async:false,//这里注意,是同步的,动态脚本标签只能这样同步global:false,"抛出":true});};