Я думаю, что придумал решение вашей проблемы. Он включает использование MutationObserver API, чтобы обнаружить изменения в DOM iFrame.
MutationObserver предоставляет разработчикам способ реагировать на изменения в DOM . Он предназначен для замены событий мутаций, определенных в спецификацией событий DOM3.
Я также использовал window.postMessage API уведомить родительскую страницу, когда MutationObserver
обнаружил события DOM, таким образом, чтобы родитель, чтобы ответить.
Я создал простой пример ниже. Обратите внимание, что я использовал *
для происхождения, но рекомендуется проверить происхождение по соображениям безопасности. Также обратите внимание, что Chrome не разрешает кадры обращаться к другим фреймам в локальной файловой системе, но он будет работать на веб-сервере или вы можете протестировать локально с помощью FireFox, который не имеет этого ограничения.
iframe.html
<head>
<meta charset="utf-8">
</head>
<body>
<script>
var observer = new MutationObserver(function(mutations) {
mutations.forEach(function(mutation) {
if (mutation.type == 'childList') {
if (mutation.addedNodes.length >= 1) {
if (mutation.addedNodes[0].nodeName != '#text') {
window.parent.postMessage("DOMChanged", "*");
}
} else if (mutation.removedNodes.length >= 1) {
window.parent.postMessage("DOMChanged", "*");
}
} else if (mutation.type == 'attributes') {
window.parent.postMessage("DOMChanged", "*");
}
});
});
var observerConfig = {
attributes: true,
childList: true,
characterData: true
};
// listen to all changes to body and child nodes
var targetNode = document.body;
observer.observe(targetNode, observerConfig);
</script>
</body>
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
</head>
<body>
<div>
<input type="submit" value="Update iFrame" onclick="updateiFrameDOM()" />
</div>
<iframe src="iframe.html" id="iframeResult"></iframe>
<script>
function updateiFrameDOM() {
var ifr = document.getElementById("iframeResult");
var ifrw = (ifr.contentWindow) ? ifr.contentWindow : (ifr.contentDocument.document) ? ifr.contentDocument.document : ifr.contentDocument;
var div = document.createElement("div");
var text = document.createTextNode("Hello");
div.appendChild(text);
var body = ifrw.document.getElementsByTagName("body")[0];
body.appendChild(div);
}
// Create IE + others compatible event handler
var eventMethod = window.addEventListener ? "addEventListener" : "attachEvent";
var eventer = window[eventMethod];
var messageEvent = eventMethod == "attachEvent" ? "onmessage" : "message";
// Listen to message from child window
eventer(messageEvent, function(e) {
console.log(e.data);
}, false);
</script>
</body>
</html>
Некоторые дополнительные источники я использовал:
Respond to DOM Changes with Mutation Observers
window.postMessage Tip: Child-To-Parent Communication
Я надеюсь, что это поможет вам.
Это может быть лучший ответ: [http://stackoverflow.com/a/14570614/1790154](http://stackoverflow.com/a/14570614/1790154). –