为什么AngularJS$compile不执行javascript代码?
我试图编译一个HTML,里面有样式和脚本标记。HTML被正确编译,代码被添加到DOM中,样式也可以工作,但脚本不会执行 有人知道为什么吗 请参阅下面的代码。“Hello World”以粗体显示,但不会引发为什么AngularJS$compile不执行javascript代码?,angularjs,angularjs-directive,angularjs-compile,Angularjs,Angularjs Directive,Angularjs Compile,我试图编译一个HTML,里面有样式和脚本标记。HTML被正确编译,代码被添加到DOM中,样式也可以工作,但脚本不会执行 有人知道为什么吗 请参阅下面的代码。“Hello World”以粗体显示,但不会引发窗口。警报 <html> <body> <div ng-app="myModule"> <div ng-controller="myController"> <d
窗口。警报
<html>
<body>
<div ng-app="myModule">
<div ng-controller="myController">
<div compile="html"></div>
</div>
</div>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.10/angular.min.js"></script>
<script type="text/javascript">
<!--
var module = angular.module("myModule", []);
module.controller("myController", function ($scope) {
$scope.message = "World";
var html = "<div class='hello'>Hello {{ message }}</div>";
var style = "<style type='text/css'>.hello { font-weight: bold; }</style>";
var script = "<script type='text/javascript'>window.alert('Hello from JS!');</script>";
$scope.html = html + style + script;
});
module.directive("compile", function ($compile) {
return function (scope, element, attrs) {
scope.$watch(
function (scope) {
return scope.$eval(attrs.compile);
},
function (value) {
element.html(value);
$compile(element.contents())(scope);
}
);
};
});
//-->
</script>
</body>
</html>
我想说的是XSS保护,但我无法为您提供这方面的来源。但是从开发人员的角度来看,无论如何你都不应该这样做。如果有人想维护您的代码,这会让人感到困惑,所以请不要这样做that@MrWook谢谢你的评论。我知道!这是一个具体的案例,我问我的客户什么时候想要发布更改,他回答“昨天!”:P因此我们尝试只在后端处理解决方案(html变量由AJAX请求填充),而不在前端进行更改。但我被困在这个“问题”上了。它可能真的是XSS,但Chrome并没有在控制台上给出任何错误。真烦人,没必要出错。它将以角的方式逃逸。即使你的客户这么说。请先找到更好的解决方案,然后再在计算机内部创建安全漏洞code@MrWook好。。我不同意这可能被称为安全漏洞。我认为,一旦它在同一个域上运行,它实际上就不是XSS。它只是一个加载javascript代码的AJAX请求。如果是XSS,Chrome真的需要至少显示一个警告,让我(至少,再次)决定是否继续使用该网站。我也不能保证是AngularJS逃脱了它,可能是Chrome。关于特定的安全案例,没有人可以利用这个漏洞,除非以相同的方式公开所有web应用程序,例如客户端脚本。如果我错了,请纠正我。做你想做的。您不需要编译它,只需使用普通的旧JavaScript即可。var script=document.createElement('script');script.type='text/javascript';script.innerHTML='window.alert(\'Hello from JS!\');';document.getElementsByTagName('head')[0].appendChild(脚本);