简体   繁体   English

如何为iFrame按钮单击调用window onunload事件,父页面和iFrame位于不同的域中

[英]how to call window onunload event for iFrame button click where parent page and iFrame resides in different domain

I have button which opens an iFrame (which reside in domain say 'xyz') the iFrame loads the page which resides in another domain (say 'lmn') 我有一个打开iFrame的按钮(位于域中的'xyz') ,iFrame会加载另一个域中的页面(比如'lmn')

$("#templateSelectionFrame").get(0).contentWindow.location.href = url;

url is from another domain (I communicate in different domain with Jquery 'POSTMESSAGE') url来自另一个域(我在不同的域中使用Jquery'POSTMESSAGE'进行通信)

when user clicks cancel button from iFrame i need to close the iFrame but before that it is necessary to show the page leaving message (ie. stay on page / leave page - this is alreday called on window.onbeforeunload ). 当用户点击iFrame的取消按钮时,我需要关闭iFrame,但在此之前需要显示页面留言(即留在页面/离开页面 - 这是在window.onbeforeunload调用的)。

var warnNavigateAway = true;

window.onbeforeunload = confirmBrowseAway;

// Called then user leave window without saving content.
function confirmBrowseAway() {
    if (warnNavigateAway) {
        return "If you leave this page, your work will be lost ...";
    }
}

function documentSaved() {
   warnNavigateAway = false;
}

function documentDirty() {
   warnNavigateAway = true;
}


<div id="bottomBar">
   <button class="cancelBtn" onclick="GoBack()">Cancel</button>
</div>

how do i call the same page leaving message so that i can close the iFrame when user clicks leave page message. 我如何调用留下消息的同一页面,以便我可以在用户点击离开页面消息时关闭iFrame。

function GoBack() 
{
   var operationType = '<%: (Model.OperationType)%>';
   if (operationType == "Create")
   {
      window.history.back();
   }
   else {     
      $.postMessage(
         'closeIFrame',
         parentUrl,
         parent
      );
   }
}

(navigation: cancel button -> page leave message -> if(stay on page then 'nothing to do') if(leave page then ) -> close the iFrame) (导航:取消按钮 - >页面留言 - >如果(留在页面然后'无事可做')if(离开页面) - >关闭iFrame)

Pure javascript 纯粹的javascript

As it seems you have control of the code in both domains - despite them being on different hosts - you should be able to use the following from within the iframe: 由于您似乎可以控制两个域中的代码 - 尽管它们位于不同的主机上 - 您应该能够在iframe中使用以下内容:

var warnNavigateAway = true;

var confirmBrowseAway = function(){
  /// if warn is enabled, then ask the user. otherwise assume "browse away"
  var v = ( 
    warnNavigateAway
    ? 
    /// use the built-in confirm dialog to notify the user, this will also 
    /// halt execution - meaning the page close is prevented until an 
    /// answer is given.
    confirm('If you leave this page, your work will be lost ...')
    :
    true
  );
  if ( v ) {
    /// disable the warn just in case our deleting of the 
    /// iframe triggers the onunload
    warnNavigateAway = false;
  }
  return v;
}

/// i've kept the use of "onevent" handlers as in your example, but you 
/// should use addEventListener and attachEvent in the same way as I have  
/// for the second part of the code in the outer frame.

/// apply as a listener in case the user navigates without using the button
window.onbeforeunload = confirmBrowseAway;
/// apply the same method for the onclick of the button
document.getElementById('cancelButton').onclick = function(){
  if ( confirmBrowseAway() ) {
    window.parent.postMessage('close_iframe', 'http://xyz/');
  }
}

and the following in the host frame: 以及主机框架中的以下内容:

var messageListener = function(e){
  if ( e.origin !== "http://lmn/" ) {
    return;
  }
  if ( e.data == 'close_iframe' ) {
    /// however you prefer to close your iframe
    document.getElementById('myIframe').style.display = 'none';
    /// or removal...
    document.getElementById('myIframe').parentNode.removeChild(
      document.getElementById('myIframe')
    );
  }
};

if ( window.addEventListener ) {
  window.addEventListener("message", messageListener, false);
}
else if( window.attachEvent ) {
  window.attachEvent("onmessage", messageListener);
}

(The above code has been manually typed, errors may be possible, it is meant as an illustrative example) (上面的代码已经手动输入,可能有错误,这是一个说明性的例子)

With the above you'll need modify your markup slightly, for the iframe and for the button. 有了上述内容,您需要稍微修改标记,iframe和按钮。

<button id="cancelButton" class="cancelBtn">Cancel</button>

and

<iframe id="myIframe" ... />

jQuery jQuery的

Because I failed to spot you were using jQuery here is a jQuery version :) 因为我没有发现你在使用jQuery这里是一个jQuery版本:)

iframe: IFRAME:

var warnNavigateAway = true;

var confirmBrowseAway = function(){
  /// if warn is enabled, then ask the user. otherwise assume "browse away"
  var v = ( 
    warnNavigateAway
    ? 
    /// use the built-in confirm dialog to notify the user, this will also 
    /// halt execution - meaning the page close is prevented until an 
    /// answer is given.
    confirm('If you leave this page, your work will be lost ...')
    :
    true
  );
  if ( v ) {
    /// disable the warn just in case our deleting of the 
    /// iframe triggers the onunload
    warnNavigateAway = false;
  }
  return v;
}

$(window).bind('beforeunload', confirmBrowseAway);
$('.cancelBtn').bind('click', function(){
  if ( confirmBrowseAway() ) {
    $.postMessage( 'close_iframe', 'http://xyz/' ) 
  }
});

in the host: 在主持人:

$.receiveMessage(
  function(e){
    if ( e.data == 'close_iframe' ) {
      /// however you prefer to close your iframe
      $('.myIframe').hide();
      /// or removal...
      $('.myIframe').remove();
    }
  },
  "http://lmn/"
);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM