3

我正在用 JavaScript 开发一个 Windows Phone 应用程序。我正在使用AngularJS图书馆。问题是由于安全原因我无法添加动态内容。

我得到的错误:HTML1701: Unable to add dynamic content '<div id="view_login" class="view"> <div id="view_login_container"> <img class="logo" src="http://oi60.tinypic.com/okwifa.jpg"> <input type="text" placeholder="Username" ng-model="loginUsername"> <input type="password" placeholder="******" ng-model="loginPassword"> <button ng-click="doLogin()">Login</button> <button ng-click="changeView('/signup')" class="link">... or sign up now</button> </div> </div>'. A script attempted to inject dynamic content, or elements previously modified dynamically, that might be unsafe. For example, using the innerHTML property to add script or malformed HTML will generate this exception. Use the toStaticHTML method to filter dynamic content, or explicitly create elements and attributes with a method such as createElement. For more information, see http://go.microsoft.com/fwlink/?LinkID=247104.

我在 AngularJS 库中更改了一行应该可以解决问题:

append:function(a,c){
   **MSApp.execUnsafeLocalFunction(function () {**
      r(new N(c),function(c){
         1!==a.nodeType&&11!==a.nodeType||a.appendChild(c)
      })
   });
} 

不幸的是,它没有用。

我花了几个小时试图找到解决方案,但我没有设法解决。对于如何使用 AngularJS 使用 JavaScript 编写的 Windows Phone 应用程序,我将不胜感激。

4

4 回答 4

5

Microsoft Open Technologies 最近发布了一个 shim,它可以防止使用 AngularJS 以及许多其他流行 JavaScript 库的 Windows Store 应用程序出现这个确切的问题。

只需从 GitHub 下载JavaScript 动态内容 shim,然后在运行任何其他脚本之前在应用程序的开头引用该文件。您应该不会再看到动态内容错误。

让我知道这是否能解决您的问题!

于 2014-08-19T17:01:31.770 回答
3

我在 Windows Store 应用程序中使用 Angular 时遇到了这个问题。我想出的解决方案是猴子修补不安全的 DOM 操作函数,而不是不得不破解 Angular 或 jQuery,因为我仍然希望能够使用 bower 进行更新。

var patch = {
    methods: [
        'appendNode',
        'cloneNode',
        'insertBefore',
        'removeChild',
        'replaceChild'
    ],

    properties: [
        'innerHTML',
        'outerHTML'
    ]
};

patch.methods.forEach(function (name) {
    proxyUnsafeMethod(HTMLElement.prototype, name);
});

patch.properties.forEach(function (name) {
    proxyUnsafeProperty(HTMLElement.prototype, name);
});

function proxyUnsafeMethod(object, name) {
    var _unsafe = object[name];

    object[name] = function () {
        var context = this;
        var args = arguments;

        return MSApp.execUnsafeLocalFunction(function () {
            return _unsafe.apply(context, args);
        });
    };
}

function proxyUnsafeProperty(object, prop) {
    var descriptor = Object.getOwnPropertyDescriptor(object, prop);

    proxyUnsafeMethod(descriptor, 'set');

    Object.defineProperty(object, prop, descriptor);
}
于 2014-07-25T13:06:54.723 回答
0

<!-- -->Angular为 ng-repeat 和其他指令动态放置 HTML 注释标签。不幸的是,微软认为这些在使用 javascript 从 javascript 中输入时是不安全的element.innerHTML,因此是不允许的。

解决方法是修改实际的 angular.js 文件并将所有element.innerHTML调用包装在MSApp.execUnsafeLocalFunction();

在我使用的 Angular 版本中,这是第 2539 行和第 2162 行

第 2539 行:

MSApp.execUnsafeLocalFunction(function() { element.innerHTML = value; });

第 2162 行:

MSApp.execUnsafeLocalFunction(function() { div.innerHTML = '<div>&#160;</div>' + element });

最好的方法是在 angular.js 文件中搜索所有 innerHTML 实例并将其包装起来。

于 2014-04-23T19:32:12.243 回答
0

在很多情况下,当您遇到动态内容问题时,Winstore-jsContrib可能会有所帮助。只需在应用程序的开头添加 .js 文件即可。

于 2015-05-22T14:27:57.493 回答