In meinem Test, gegeben von 2 Dokumenten, A und B. In A-Dokument gibt es einen Iframe, die Iframe-Quelle ist B-Dokument. Meine Frage ist, wie man einen bestimmten Bereich der Variablen in einem B-Dokument modifiziert.
Hier ist mein Code: Ein Dokument
<html lang="en" ng-app="">
<head>
<meta charset="utf-8">
<title>Google Phone Gallery</title>
<script type='text/javascript' src="js/jquery-1.10.2.js"></script>
<script type='text/javascript' src="js/angular1.0.2.min.js"></script>
<script>
var g ;
function test($scope,$http,$compile)
{
$scope.tryget = function(){
var iframeContentWindow = $("#iframe")[0].contentWindow;
var iframeDOM = $("#iframe")[0].contentWindow.document;
var target = $(iframeDOM).find("#test2");
var iframeAngular = iframeContentWindow.angular;
var iframeScope = iframeAngular.element("#test2").scope();
iframeScope.parentcall();
iframeContentWindow.angular.element("#test2").scope().tempvalue = 66 ;
iframeScope.tempvalue = 66;
iframeContentWindow.tt = 22;
iframeScope.parentcall();
console.log(iframeScope.tempvalue);
console.log(angular.element("#cont").scope());
}
}
</script>
</head>
<body>
<div ng-controller="test">
<div id="cont" >
<button ng-click="tryget()">try</button>
</div>
</div>
<iframe src="test2.html" id="iframe"></iframe>
</body>
</html>
Mein B-Dokument:
<!doctype html>
<html lang="en" ng-app="">
<head>
<meta charset="utf-8">
<title>Google Phone Gallery</title>
<script type='text/javascript' src="js/jquery-1.10.2.js"></script>
<script type='text/javascript' src="js/angular1.0.2.min.js"></script>
<script>
var tt =11;
function test2($scope,$http,$compile)
{
console.log("test2 controller initialize");
$scope.tempvalue=0;
$scope.parentcall = function()
{
$scope.tempvalue = 99 ;
console.log($scope.tempvalue);
console.log(tt);
}
}
</script>
</head>
<body>
<div ng-controller="test2" id="test2">
<div id="cont" >
<button ng-click="parentcall()">get script</button>
</div>
{{tempvalue}}
</div>
</body>
</html>
Hinweis: Eigentlich gibt es eine Möglichkeit, dies zu tun. Ich empfinde es als einen Hack als einen richtigen Weg, um es zu erledigen: Das ist eine Schaltfläche in b Document und binde dann mit Angle-Klick. Danach klicken Sie auf eine Schaltfläche "Dokument Jquery".
Gehen Sie folgendermaßen vor, um in zwei Richtungen (übergeordnetes zu iFrame, iFrame zu übergeordnetes Element) zuzugreifen und zu kommunizieren, wenn beide in derselben Domäne sind und Zugriff auf den Winkelbereich haben:
* Sie brauchen kein Elternteil, um einen Verweis auf die angleJS-Bibliothek zu haben…
Untergeordneter iFrame von übergeordneten aufrufen
1.Geben Sie das untergeordnete iFrame-Element vom übergeordneten Element ab ( Link zur Antwort ):
document.getElementById ("myIframe"). contentWindow
2.Greifen Sie auf den Umfang des Elements zu:
document.getElementById ("myIframe"). contentWindow.angular.element ("# someDiv"). scope ()
3.Rufen Sie die Funktion oder Eigenschaft des Bereichs auf:
document.getElementById ("myIframe"). contentWindow.angular.element ("# someDiv"). scope (). someAngularFunction (data);
4.Call $ scope. $ Anwenden, nachdem die Logik der Funktion ausgeführt/die Eigenschaft aktualisiert wurde ( Link zu Mishkos Antwort ):
$ scope. $ apply (function () {});
Eltern von unterem iFrame anrufen
parent.someChildsFunction ();
Wird auch aktualisieren, wie es domänenübergreifend zu tun ist, wenn dies erforderlich ist.
Sie sollten in der Lage sein, den übergeordneten Bereich von iFrame abzurufen:
var parentScope = $window.parent.angular.element($window.frameElement).scope();
Dann können Sie die übergeordnete Methode aufrufen oder die übergeordnete Variable ändern (denken Sie jedoch daran, parentScope.$apply
zum Synchronisieren der Änderungen aufzurufen)
Getestet auf Winkel 1.3.4
Die beste Möglichkeit, mit dem Iframe zu kommunizieren, ist meiner Meinung nach window.top. Wenn Sie möchten, dass Ihr iframe den Gültigkeitsbereich Ihres übergeordneten Objekts erhält, können Sie window.scopeToShare = $scope;
in Ihrem Controller festlegen. Der Zugriff auf die iframe-Seite erfolgt unter window.top.scopeToShare
.
Wenn Sie möchten, dass Ihr Elternteil den iframe-Geltungsbereich erhält, können Sie verwenden
window.receiveScope = function(scope) {
scope.$on('event', function() {
/* Treat the event */
}
};
und innerhalb des iframe-Controller-Aufrufs window.top.giveRootScope($rootScope);
WARNUNG: Wenn Sie diesen Controller mehrmals verwenden, stellen Sie sicher, dass Sie eine zusätzliche ID verwenden, um den gewünschten Bereich zu identifizieren.
Dieser ist ziemlich einfach und funktioniert für mich:
im Controller-Code der iframe-Seite:
$window.parent.window.updatedata($scope.data);
im übergeordneten Seitencontrollercode:
window.updatedata = function (data) {
$scope.$apply(function () {
$scope.data = data
}
}