章节
问答
课签
笔记
评论
占位
占位

深入domManip(下)

我们考虑下面的一个例子:

var div = document.querySelectorAll('div')[0];
div.innerHTML = "<script>alert('慕课网')";

这样JavaScript 不会执行。换句话能插入script标签,但是不执行脚本代码,但是在早起的ie下面,如果设置了defer是另外,这个后面单独讲innerHTML的缺陷会提到


如果我们换成jQuery的appned方法:这样的处理代码就执行了,可见jQuery的方法内部可不是那么简单的处理了

$('div').append("<script>alert('慕课网')")

简单讲,如果.html()传入的字符串有

<script> <object> <embedt> <optiont> <style>

其中一个 .html()方法就不会用innerHTML 操作,而是用jQuery.append() 处理字符串塞入

.append()-> .domManip() -> buildFragment() ->clean() 这样的处理流程

clean() 中会动态产生一个div, 将div 的innerHTML 设为传入的字符串,再用getElementsByTagName('script') 的方式把所有的script 抓出来另行储存

clean() 执行完毕回到domManip() 中, domManip() 再将script 们一一拿出来执行

如果是外部js 就动态载入,如果是内联 js 就用eval()

总结下来,domManip主要就做了两件事:

1.根据用户传入的参数,创建了多个fragment,然后通过回调函数参数传入
2.控制script的执行过程,在创建fragment的时候不执行,最后dom操作结束后会统一执行

任务

?不会了怎么办
||

提问题

写笔记

截图
提交
||

请验证,完成请求

由于请求次数过多,请先验证,完成再次请求

加群二维码

打开微信扫码自动绑定

您还未绑定服务号

绑定后可得到

  • · 粉丝专属优惠福利
  • · 大咖直播交流干货
  • · 课程更新,问题答复提醒
  • · 账号支付安全提醒

举报

0/150
提交
取消
全部 精华 我要发布
全部 我要发布
最新 点赞
只看我的

手记推荐

更多

本次提问将花费2个积分

你的积分不足,无法发表

为什么扣积分?

本次提问将花费2个积分

继续发表请点击 "确定"

为什么扣积分?