How to make postMessage applicable to all subdomains

痴心易碎 提交于 2019-12-10 12:31:04

问题


In window.postMessage second attribute specifies domain to which my message can be sent. Is there any way to specify that it is applicable to all subdomains.

Things tried:

iframe.contentWindow.postMessage('The message to send.','http://*.wordpress.com');
iframe.contentWindow.postMessage('The message to send.','http://wordpress.com');

回答1:


Nope, not possible.

The only scenario in which you can help yourself is if you know that the target iframe is from a known, finite set of origins (e.g. "http://a.wordpress.com", "http://b.wordpress.com" and "http://c.wordpress.com"). In this case, just make a postMessage request for each of the origins, since only one of those will succeed and the other ones will fail.




回答2:


It is possible without knowing all domains names. Just get a referrer URL and you actually get the origin from that:

var parentOrigin = document.referrer.match(/^.+:\/\/[^\/]+/)[0];

Now, the only thing is to check whether the URL matches the criteria (ends with wordpress.com) and if yes, allow the message to this specific domain.

Works only until the user navigates inside the iframe somewhere else: the referrer is changed. However, the referrer can be saved in an iframe's localStorage so you have a list of possible domains and can send the message to every domain from the list a proposed by Ivan Zuzak




回答3:


You could just parse and interrogate the src attribute of the iframe to determine if it belongs to the correct domain and set the targetOrigin accordingly.

yourIframe.onload = function() {
  var a = document.createElement('a');
  a.href = yourIframe.src;

  if (a.host.endsWith('yourdomain.com')) {
    var targetOrigin = a.protocol + '//' + a.host;

    yourIframe.contentWindow.postMessage(yourMessage, targetOrigin);
  }
};


来源:https://stackoverflow.com/questions/14443294/how-to-make-postmessage-applicable-to-all-subdomains

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!