我尝试通过在 Controller 中生成链接将书签按钮添加到我的网站。

模板部分:

    <a id="bookmarklet"
       class="bookmarklet"
       onclick="alert('Drag and drop me to the bookmarks bar');return false;"
       href="{{getCode()}}">
      + Add
    </a>

Controller 部分:
$scope.getCode = function () {
  var code = 'javascript:(function(){s=document.createElement(\'SCRIPT\');s.type=\'text/javascript\';' +
    's.src=\'http://localhost:9000/scripts/bookmarklet/bookmarklet.js?x=' + ($scope.user.id) + '\';' +
    'document.getElementsByTagName(\'head\')[0].appendChild(s);document.sc_srvurl=\'http://localhost:8080\'})();'  ;
  return code;
};

但我在编译后得到以下信息:
<a class="bookmarklet" href="unsafe:javascript:(function(){s=document.createElement('SCRIPT');s.type='text/javascript';s.src='http://localhost:9000/scripts/bookmarklet/bookmarklet.js?x=5517325d40c37bc2bfe20db6';document.getElementsByTagName('head')[0].appendChild(s);document.sc_srvurl='http://localhost:8080'})();">
              + Add
            </a>

链接以“ unsafe ”开头,我不知道如何告诉 angular 信任此链接。

这个答案 - Angular changes urls to "unsafe:" in extension page 建议将协议(protocol)添加到白名单。
我不想禁用 $sce 或将“javascript”添加到白名单协议(protocol),因为我认为它不安全。

我可以以某种方式告诉 angularjs 避免使用 $sce 添加前缀“不安全”吗?不幸的是,文档对我来说不清楚,$sce.trustAsJs(code) 没有帮助我。

!EDIT Angular 版本是 1.4.1。

最佳答案

尝试通过编写自定义指令来规避限制:

var app = angular.module('myApp', []);

app.directive('bookmarklet', function () {
    return {
        restrict: 'A',
        scope: {},
        link: function($scope, element, attrs) {
            if (element[0].tagName !== 'A') {
                return;  // simply do nothing (or raise an error)
            }
            element[0].href = 'javascript:alert("It works in 1.4.1, too!")';
        }
    };
 });

用法:
<div ng-app="myApp">
    <a href="#foo" bookmarklet>click me</a>
</div>

我还创建了一个 fiddle 演示来测试它:http://jsfiddle.net/t0acdxcL/1/

关于angularjs - 如何避免通过 AngularJs 向 javascript 添加前缀 "unsafe"?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31969824/

10-11 22:29
查看更多