最近在做一个angular js的项目。今早一个早上都在为一个bug发愁,、
就是ng-if出现一个弹框,弹框的指令中引用了一个模板,模板中有script脚本,在其他浏览器都没问题,就是在IE8下脚本不执行。
查了很多IE8执行脚本的问题,包括在script标签加defer属性,但是不解决实际问题。
后来发现并不是脚本不能执行,而是在主页面加载时(ng-if为false弹框没出现)就执行过了脚本。
网上都说 ng-if会移除dom,生成dom,而ng-show只是改变其display属性,
按理说不应该是ng-if="true"的时候才会加载dom,才会执行脚本才对?
但是把ng-if改成ng-show以后发现问题突然解决了,在IE8里面完美的实现了点击弹框后才执行脚本,
这一点没想明白是为什么,有没有高人可以解答?
bug怎么解决的我没看明白,至于angular的解析过程我可以解释下:
虽然在DOM查看器中我们看到的是angular解析之后的结果,但是实际上是浏览器先加载dom元素,然后angular再执行,去查找各种指令,然后解析出结果的。
所以angular有几个怪癖:ng-bind替换{{ expression }}可以解决花括号闪烁问题,你不能在定义href指令用在a标签上,等等类似的问题原因都是如此。
ng不是后台模板,对于后台语言来说,模板就是各种字符串解析拼接,但是ng是运行在浏览器中的,html会先变成dom元素,ng并不是在操纵字符串,而是在操纵dom元素。
你在ng-if里和ng-show里应该都是绑定的controller的model吧?
看你的解决过程,我猜测:
ng-if默认是true
ng-show默认是false
所以使用ng-if的时候,模板里的script会在model还没运算到的时候先执行
不过这可能也是在ie8上的特殊情况
我有个建议,不要直接把script放在模板里,比如放到模板的controller里,这样用ng-if也可以的