gpt4 book ai didi

AngularJS 向 iframe 发送消息

转载 作者:行者123 更新时间:2023-12-04 20:42:02 26 4
gpt4 key购买 nike

我正在寻找一种方法来获取 iframe contentWindow 对象并在用户执行某些操作后向其发布消息。我当前的解决方案对 angular 根本不满意(尤其是从 Controller 访问 DOM)。

我创建了一个 plunker 来演示这个问题:
http://plnkr.co/edit/aXh4jydWGWfK3QQD4edd

执行 postMessage 是一种更有 Angular 的方式吗?

Controller :

app.controller('Main', function($scope) {
$scope.click = function() {
var iframe = document.getElementById("inner").contentWindow;

iframe.postMessage("Hello iframe", '*');
}
});

html:
  <body ng-controller="Main">
<button ng-click="click()">send message</button>

<iframe id="inner" src="inner.html"/>
</body>

最佳答案

我意识到您的问题此时已经一年多了,但我最近有类似的需求,所以我想我会发布我的解决方案。最初我发布了类似您的内容,但正如您指出的那样,这感觉不是很“有 Angular ”。它也不容易测试,我认为它也不是很“Angular ”。

相反,我重构了我的代码以实现 iframe作为指令。然后我$broadcast()来自我的应用程序 Controller 的事件并让指令监听它们。这段代码可能可以改进很多,但感觉更“Angular”并且避免直接接触 DOM。

'use strict';

angular.module('app')
.directive('angularIframe', ['$rootScope', function($rootScope) {

return {
restrict: 'E',
replace: true,
template: '<iframe id="game" src="/iframe/index.html" width="100%" height="100%" frameboarder="0" scrolling="no"></iframe>',
link: function(scope, elem) {

var off = $rootScope.$on('app.postmessage', function(ev, data, targetOrigin) {

var str = JSON.stringify(data);
targetOrigin = targetOrigin || '*';
elem[0].contentWindow.postMessage(str, targetOrigin);

});

// See: http://stackoverflow.com/a/14898795/608884
elem.on('$destroy', function() {
off();
});

}
};
}]);

然后你可以通过添加 <game></game> 来使用这个指令。在您的应用程序中的某个地方。

在 Controller 中,您现在可以广播 app.postmessage事件以及一些要调用的数据 postMessage()iframe :
var myData = { foo: 'bar' };
$rootScope.$broadcast('app.postmessage', myData);

关于AngularJS 向 iframe 发送消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24515702/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com