从不同的 window(不是 child)重新加载 iframe - javascript

Reload iframe from different window (not child) - javascript

我想知道如何从弹出窗口刷新 iframe window。

当从主页调用弹出窗口(添加记录)时我可以做到这一点,但我无法弄清楚从 iframe 中调用的弹出窗口(编辑记录)。

除了驻留在 iframe 中之外,调用编辑弹出窗口的按钮是 Caspio 数据页面,并且在页面加载期间从 javascript 构建。所有页面都位于同一域中。

请考虑以下场景。 (为简单起见,我删除了 类、标题和其他不相关的项目)

主页:

<div id="vehicles">
    <div class="frmHeader">
        <h2>Vehicles</h2>
        <a onclick="popupWindow('addVehicle.html')"></a><!-- ADD vehicle -->
        <a onclick="ifrRefresh('ifrVehicle')"></a>
    </div>
    <iframe src="lic/vehicle.html" name="ifrVehicle" id="ifrVehicle"></iframe>
</div>

iframe 内容html 文件:

<div id="ifrContentVehicle" class="ifrContent killHeader">
    <script src="/scripts/e1.js"></script>
    <script>try{f_cbload("***","http:");}catch(v_e){;}</script>
</div>

加载后的 iframe 内容:

<div id="ifrContentVehicle" class="ifrContent killHeader">
    <form id="caspioform">
    <div>
    <table name="cbTable">
    <tbody>
    <tr>
    <td>
        <a onclick="popupWindow('editVehicle.html?VehicleID=*')"></a><!--EDITv-->
    ...

添加车辆:

<script>
    window.onunload = refreshParent;
    function refreshParent() {
        window.opener.ifrVehicle.location.reload();
    }
</script>

这可以刷新我名为 ifrVehicle 的 iframe。但是,我无法让它与“编辑”弹出窗口一起使用。

任何帮助将不胜感激!

一个简单的选择是使用 window 焦点事件和一个布尔变量来跟踪弹出窗口是否已打开。
显然,这只会在弹出窗口关闭后刷新 iframe。
请参阅以下示例:Jsfiddle

HTML:

<button id="open" type="button">Click to open pop-up</button>

Js:

var frameOpened = false;
$(window).on('focus', function() {
    if (frameOpened === true) {
        frameOpened = false;
        $('body').append('<p>Refresh iframe now</p>');
    }
});
$('#open').on('click', function() {
    var popup = window.open("", "popupWindow", "width=600, height=400");
    $(popup.document.body).html("Close the window when ready.");
    frameOpened = true;
});

不依赖焦点事件的替代方法是使用本地存储。
这将允许您在后台触发刷新,而无需关闭弹出窗口。显然,这将在没有本地存储的浏览器上中断。
请参阅以下示例:Jsfiddle

HTML:

<button id="open" type="button">Click to open pop-up</button>

Js:

if (Storage !== void 0) {
    Storage.refreshIframe = void 0;
    var checkForRefresh = function() {
        if (Storage.refreshIframe === true) {
            Storage.refreshIframe = void 0;
            $('body').append('<p>Refresh iframe now</p>');
        }
    };
    $(window).on('focus', function() {
        checkForRefresh();
    });
    setInterval(function() {
        checkForRefresh();
    }, 1000);
    $('#open').on('click', function() {
        var popup = window.open("", "popupWindow", "width=600, height=400");
        var $p = $(popup.document.body);
        $p.append('<button id="refresh" type="button">Refresh iframe</button>');
        $p.find('#refresh').on('click', function() {
            Storage.refreshIframe = true;
        });
    });
}

我在这里找到了适合我的可能解决方案 -> 。

命名主 window:

window.open('url','windowName');

弹出窗口关闭时按名称引用它。

window.onunload = refreshWindowByName;
function refreshWindowByName() {
    window.open('javascript:window.iframeName.location.reload()','windowName');
}