我很想知道AngularJS如何通过ng-include指令防止内联<script>
标签执行。
模板被包含后,DOM被检查,脚本标签确实存在,但它们没有被执行。它们是如何被解除武装的呢?
我已经开始审查源代码,但我尝试将脚本标签自己添加到DOM中(appendChild,innerHTML,innerText,document.write等),结果总是被执行。
谢谢。
我很想知道AngularJS如何通过ng-include指令防止内联<script>
标签执行。
模板被包含后,DOM被检查,脚本标签确实存在,但它们没有被执行。它们是如何被解除武装的呢?
我已经开始审查源代码,但我尝试将脚本标签自己添加到DOM中(appendChild,innerHTML,innerText,document.write等),结果总是被执行。
谢谢。
angular.js
文件之前加载jQuery库即可。 <head>
<script src="//unpkg.com/jquery"></script>
<script src="//unpkg.com/angular/angular.js"></script>
<link rel="stylesheet" href="style.css">
<script src="script.js"></script>
</head>
jqLite.append
的源代码在 GITHUB jqLite.js Line #972。它附加脚本元素而不执行它们。另一方面,jQuery append
方法识别脚本元素并执行它们。 - georgeawg看起来ng-include调用了$element.html(ctrl.template);
请参见GitHub上的源代码
然后,jqLite的html函数使用element.innerHTML = value;
插入内容。 请参见GitHub上的源代码
经过测试,似乎这就足以不执行<script>
标记。
我在这里创建了一个jsFiddle。 - #3相当于AngularJS正在执行的操作,并且不会执行脚本标签。
ng-sanitize
负责这种行为。https://github.com/angular/angular.js/blob/26a5779cddf70944b7548e3a6410d35237a516e5/src/ngSanitize/sanitize.js - felixmosh