小编典典

在iframe中形成POST而不影响历史记录

ajax

是否可以在iframe中提交表单而不影响浏览器的历史记录?

我已经实现了发送跨域POST请求。它使用Javascript在iframe中创建和提交表单。它可以工作,但是每个请求都会在浏览器的历史记录中添加一个项目。

有人知道解决这个问题的方法吗?我尝试使用innerHTML和createElement创建iframe。到目前为止,我还没有发现任何差异。

PS-我很想使用XMLHtttpRequest(“ Ajax”),但它不支持跨域发送数据。我很想使用GET而不是post,但是我需要发送超过2k的数据。

这是我的代码的一个版本。我已经尝试了许多变体并进行了全面搜索,但是我似乎找不到一个不会影响浏览器历史的解决方案。我相信这是不可能的-任何人都可以确认吗?

<html>

<head>
  <script type="text/javascript">
    function submit(params) {

      var div = document.createElement('div');
      div.innerHTML = '<iframe height="50" width="50"></iframe>';
      document.body.appendChild(div);

      var iframe = div.firstChild;
      var iframeDocument = iframe.contentDocument || iframe.contentWindow.document;
      iframeDocument.open();
      iframeDocument.close();

      var form = iframeDocument.createElement('form');
      iframeDocument.body.appendChild(form);
      form.setAttribute('action', 'http://some-other-domain.com/submit-here');
      form.setAttribute('method', 'POST');

      for (param in params) {
        var field = iframeDocument.createElement('input');
        field.setAttribute('type', 'hidden');
        field.setAttribute('name', param);
        field.setAttribute('value', params[param]);
        form.appendChild(field);
      }
      form.submit();
    }

    window.onload = function() {
      document.getElementById('button').onclick = function() {
        submit({
          'x' : 'Some Value',
          'y' : 'Another Value',
          'z' : new Date().getTime()
        });
      }
    }
  </script>
</head>

<body>
  <h1>Example of using Javascript to POST across domains...</h1>
  <input id="button" type="button" value="click to send">
</body>

</html>

阅读 291

收藏
2020-07-26

共1个答案

小编典典

使用JS添加src托管在您的站点(第三方托管的脚本需要向其发送数据的域)上的IFRAME是否起作用?此IFRAME可能包含用于向您的/它的XMLHttpRequest发出请求的Javascript。域。至于从第三方站点获取实际数据到该IFRAME的方法,请尝试:http : //softwareas.com/cross-domain-
communication-with-iframes。这是一个非常聪明的解决方案,涉及在IFRAME
URL的末尾更改片段标识符(#something),然后您可以通过IFRAME中的JS进行读取。

这也是一个猜测,但是,如果您将上述过去的SO解决方案解决类似的历史记录问题(使用location.replace),希望可以让您在不中断历史记录堆栈的情况下进行更改锚点的操作。

2020-07-26