Javascript 我可以完全禁用消毒吗?

Javascript 我可以完全禁用消毒吗?,javascript,angularjs,Javascript,Angularjs,是否可以完全禁用HTML的清理功能 我想要实现的是在我的控制器中: $scope.greeting = '<h2>Hello World</h2>' 我不能(也不想)使用ng绑定html之类的,我想一起禁用消毒 为了提供更多的上下文,我正在准备一个简单的“框架包装”,用于为特定的系统开发一个模板 当您为这个系统开发模板时,他们有预定义的代码片段,您可以通过写“{something}}}”将其放在页面上,但它不是在angular(可能是mustache或其他)上运行的 现

是否可以完全禁用HTML的清理功能

我想要实现的是在我的控制器中:

$scope.greeting = '<h2>Hello World</h2>'
我不能(也不想)使用ng绑定html之类的,我想一起禁用消毒

为了提供更多的上下文,我正在准备一个简单的“框架包装”,用于为特定的系统开发一个模板

当您为这个系统开发模板时,他们有预定义的代码片段,您可以通过写“{something}}}”将其放在页面上,但它不是在angular(可能是mustache或其他)上运行的

现在模板只能在线开发,这是一个非常不友好的过程。因此,我在angular中设置了简单的项目,包括相应的路由等,这样每个人都可以在自己的机器上开发模板,然后简单地将其复制到系统中

这就是为什么在模板文件中不应该注意到它是以角度完成的,它只是尽可能地接近它们的系统

最后一个注意事项-我确实尝试过:

myApp.config(['$sceProvider',function($sceProvider){
    $sceProvider.enabled(false);
}]);
没有为我做任何事情

是的,您可以关闭SCE,但这不会导致字符串被插入到HTML中 使用您的场景:

  $scope.movie = {title:"<h1>Egghead.io AngularJS, Binding</h1>",
 src:"http://www.youtube.com/embed/Lx7ycjC8qjE"};
会产生这个

<h1>Egghead.io AngularJS Binding</h1>
应用程序禁用
$sceProvider

var app = angular.module('plunker', ['ngSanitize']);
app.config(['$sceProvider',function($sceProvider){
    $sceProvider.enabled(false);
}]);
app.controller('MainCtrl', function($scope, $sce) {

  $scope.movie = {src:"http://www.youtube.com/embed/Lx7ycjC8qjE", title:"Egghead.io AngularJS Binding"};
});
插入“不安全”URL时不会出错。将显示视频


附件2:
app.config
使用默认SCE设置注释掉

错误:

错误:[$interpolate:interr]无法插入:{{movie.src}}错误: [$sce:unsecURL]阻止从url加载资源 $s代理策略。网址:


尝试使用装饰器增强或更改$sce的标准行为:

 angular
  .module( appName, [ ] )
  .config([ "$provide", function( $provide )
  {
        // Use the `decorator` to enhance or change behaviors of original service instance; 

        $provide.decorator( '$sce', [ "$delegate", function( $delegate )
        {
            // Save the original $sce.parseAsHtml
            var parseAsHtml= $sce.parseAsHtml;

            $delegate.parseHtml= function( ) {
              // Implements your custom behavior...
            };

            return $delegate;
        }]);
  }]);

不久前,我设法呈现了从如下服务返回的一些HTML:

$scope.greeting = $sce.trustAsHtml('<h2>Hello World</h2>');
$scope.greeting=$sce.trustAsHtml('Hello World');
在你的HTML中

<div ng-bind-html="htmlGreeting"></div>

不要忘记在控制器中注入$sce服务


编辑这里的一个例子:我设法找到了另一种解决问题的方法,而不使用任何指令

基本上,我使用注入器来使用$compile服务

JS:

angular.injector(['ng']).invoke(函数($compile,$rootScope){
$('.html content').append($compile('Hello World')($rootScope));
});

这里有一个演示:

@Donal这有什么帮助?你需要升级你的angular版本来利用这个功能。你应该有angular 1.3+version@pankajparkar我使用的是1.3.15,这是非常好和详细的答案,谢谢你,不幸的是,它只处理一种情况-URL。但我真正需要的是HTML。你也使用角度指令,我需要它100%没有指令。你可以在我的问题描述中看到这一点。但你们可能是对的,我可能会遇到这样的情况,即使否认$sce也无济于事。-如果我有相同版本的angular和sanitize@Tom,同意,这只是一个用例。但是我没有你的用例来演示。原因是b/c
{{greeting}
。我将Plunker 2更改为user
src=“{{movie.src}}”
,并创建了相同的错误。考虑到您的担忧,我应该使用
src
而不是
ng src
。我选择了
ngsrc
的用例,因为将插值字符串传递给ngsrc是最严格执行的SCE行为,而直接插值
{{greeting}
是执行最少的,通常只会成功。因此,如果没有您的特定用例(导致中断的数据),我不会导致错误。@Tom,请使用
src=“{{movie.src}}}”
尝试新的Plunker,并提供导致SCE错误的html的更多细节,但我不会尝试使用src做任何事情。。。只需将您的movie.title包装在标签中:$scope.movie={title:'Whatever'},您将在页面上看到标签打印出来,而不是呈现出来html@Tom在angular中不可能编译HTML,如果不使用Directive,仍然不起作用。我对angular代码做了大量的研究,angular似乎会自动用文本节点替换每个{{}表达式,这基本上阻止了HTML呈现。这可能吗?这很奇怪,我在最近的一个项目中很少使用它。它是无声地失败还是返回一些错误?你对它为什么不起作用有任何线索吗?
trustAsHtml
用于禁用SCE,它不会编译。HTML不能“馈送”到带有AngularJS的浏览器。Angular不适用于被动模板。该框架绕过了浏览器的HTML解释器。我的答案中包含了一个指向小提琴的链接,显示了它的工作原理。您使用的是指令
ng bind HTML
。此指令专门将内容编译为HTML。指令是在AngularJS中将字符串编译为标记的唯一方法。OP显然无法对此解决方案使用任何指令。检查他对我答案的第一个评论,我需要100%没有指示。否则,他最初禁用SCE的方法将使信任变得不必要。不,这一点都不明显。我是在OP的回应后才意识到的。问题是误导b/c OP仍在学习。你的答案(适用于形成的问题)很好。我希望更多的5位代表用户也能做到这一点。那么,你是在绕过整个Angular管道并执行代码?因此,HTML没有被跟踪,角度变得毫无用处。现在我们回到jQuery代码。
var app = angular.module('plunker', ['ngSanitize']);
//app.config(['$sceProvider',function($sceProvider){
//    $sceProvider.enabled(false);
//}]);
app.controller('MainCtrl', function($scope, $sce) {

  $scope.movie = {src:"http://www.youtube.com/embed/Lx7ycjC8qjE", title:"Egghead.io AngularJS Binding"};
});
 angular
  .module( appName, [ ] )
  .config([ "$provide", function( $provide )
  {
        // Use the `decorator` to enhance or change behaviors of original service instance; 

        $provide.decorator( '$sce', [ "$delegate", function( $delegate )
        {
            // Save the original $sce.parseAsHtml
            var parseAsHtml= $sce.parseAsHtml;

            $delegate.parseHtml= function( ) {
              // Implements your custom behavior...
            };

            return $delegate;
        }]);
  }]);
$scope.greeting = $sce.trustAsHtml('<h2>Hello World</h2>');
<div ng-bind-html="htmlGreeting"></div>
angular.injector(['ng']).invoke(function($compile, $rootScope) {
    $('.html-content').append($compile('<h2>Hello World</h2>')($rootScope));
});