当前位置: 首页 > 面试题库 >

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

史涵育
2023-03-14
问题内容

是否可以在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>

问题答案:

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

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



 类似资料:
  • 问题内容: 我想执行一些命令,但不想将它们存储在命令历史记录中。这样,没人能在文件中搜索它。 有什么办法可以这样执行bash命令吗? 问题答案: 用空格开始命令,该命令不会包含在历史记录中。 请注意,这确实需要设置环境变量。 检查以下命令是否返回或 要添加缺少的环境变量,可以将以下行添加到bash配置文件中。例如 重新提供配置文件后,将不会将带有空格前缀的命令写入

  • 读取播放历史信息 调用地址 http://api.bilibili.cn/history 返回 返回值字段 字段类型 字段说明 results int 返回的记录总数目 list object 返回数据 返回字段 “list” 子项 返回值字段 字段类型 字段说明 aid int 视频编号 typeid int 视频分类ID typename string 视频分类名称 title string

  • 历史记录 控制台维护 Elasticsearch 成功执行的最后500个请求列表。点击窗口右上角的时钟图标即可查看历史记录。这个图标会打开历史记录面板,您可以在其中查看历史请求。您也可以在这里选择一个请求,它将被添加到编辑器中当前光标所在的位置。 图 9. 历史记录面板

  • 3.3.1.1. 同步的文件历史记录 微力同步记录对文件的添加,修改、删除的操作记录,通过历史记录列表可查看时间时间及发生设备,如下: 事件时间,显示添加、修改、删除等操作发生的时间; 文件时间,显示该文件的最后修改时间; 操作类型,显示此次针对该文件所进行的操作的类型; 发生设备,显示进行此操作的设备名称; 目录,显示该文件所属同步目录; 清空历史记录,点击后可清除所有记录,此操作仅清除记录而已

  • 问题内容: 有没有一种方法可以使用raw_input而不在读取行历史记录中留下符号,从而在制表符完成时不显示它? 问题答案: 你可以使一个函数像 并调用该函数而不是raw_input。您可能不需要负1,具体取决于您从何处调用它。

  • 入口: 在路线规划右上角,有历史记录入口,无论“单路线规划”、“多路线规划”的结果,都会自动进行记录,点击进入该界面 在“路线规划”模块下展开二级模块“历史记录”,可以点击进入 历史记录列表 支持按照时间搜索记录 支持单个删除记录 支持一键删除全部记录 支持点击查看规划历史详情 历史详情 记录规划人、规划时间、规划结果 结果详情界面回放、支持点击查看