更改 iframe src 时如何设置自定义 http 标头?

IT技术 javascript iframe httprequest
2021-03-21 16:45:43

有没有办法在<iframe>使用javascript更改源(src)时将自定义http标头添加到由an完成的请求中

4个回答

您可以将具有自定义标头的 ajax 请求的结果设置为 iframe 的内容,如下所示:

$.ajax({
    type: "GET", 
    url: "https://app.icontact.com/icp/a/",
    contentType: "application/json",
    beforeSend: function(xhr, settings){
            xhr.setRequestHeader("some_custom_header", "foo");},
    success: function(data){
        $("#output_iframe_id").attr('src',"data:text/html;charset=utf-8," + escape(data))
    }
});

这是假设 iframe 指向跨域 src。如果一切都在同一个域中,那就更简单了。

编辑:也许试试这个变体。

$.ajax({
    type: "GET", 
    url: "https://app.icontact.com/icp/a/",
    contentType: "application/json",
    beforeSend: function(xhr, settings){
            xhr.setRequestHeader("some_custom_header", "foo");},
    success: function(data){
        $("#output_iframe_id").attr('src',"/")
        $("#output_iframe_id").contents().find('html').html(data); 
    }
});
这很奇怪,因为如果我在 chrome 中检查生成的 html 代码,将 url(没有 http 自定义标头)分配给 'src' 属性和执行 $("#output_iframe_id").contents().find('html ').html(数据); 但后者不执行 <head> 或外部文件上定义的 javascript 函数。但是它执行 document.onready() 函数。
2021-04-30 16:45:43
也许试一试
2021-05-06 16:45:43
非常感谢!顺便问一下,如果在同一个域中有什么区别?
2021-05-14 16:45:43
好多了!我在twigstechtips.blogspot.com.es/2011/02/ 上遇到了那个解决方案...... 有机会添加脚本块吗?因为这样做时不包括它们。谢谢!
2021-05-14 16:45:43
它不适用于 IE :-S。在 Chrome 和 Firefox 中工作,但不应用来自外部文件(在框架内引用)的 css 规则和脚本。
2021-05-17 16:45:43

您可以使用URL.createObjectURL(), 并将其设置为srciframe 的,而不是使用数据 URI 或将内容设置为字符串

var xhr = new XMLHttpRequest();

xhr.open('GET', 'some.pdf');
xhr.onreadystatechange = handler;
xhr.responseType = 'blob';
xhr.setRequestHeader('Authorization', 'Bearer ' + token);
xhr.send();

function handler() {
  if (this.readyState === this.DONE) {
    if (this.status === 200) {
      // this.response is a Blob, because we set responseType above
      var data_url = URL.createObjectURL(this.response);
      document.querySelector('#output-frame-id').src = data_url;
    } else {
      console.error('no pdf :(');
    }
  }
}

对象 URL 非常有趣。他们的形式blob:https://your.domain/1e8def13-3817-4eab-ad8a-160923995170您实际上可以在新选项卡中打开它们并查看响应,当创建它们的上下文关闭时,它们将被丢弃。

这是一个完整的例子:https : //github.com/courajs/pdf-poc

如果 URL 对象可用,这看起来是最好的答案。否则降级为接受的答案。
2021-05-01 16:45:43

我最终采用了此处其他答案提出的方法,即使用 ajax 获取 html 字符串,然后直接设置iFrame.

但是,我使用此答案中发布的方法来实际设置iFrame.

测试 - 成功:

  • Chrome 54(桌面)^
  • 火狐 49(桌面)^
  • IE 11(桌面)^
  • 模拟模式下的 IE 10(桌面)^
  • iOS 8 (ipad) 上的 Safari/Chrome
  • Android 6 上的 Chrome(nexus 手机)
  • Lumia 950 上的 Edge(Win 10 手机)

^ 确认内容中链接的 css 和 js 运行正确(其他未测试)

测试 - 不成功:

  • 模拟模式下的 IE 9(桌面)
  • iOS 7 (iPhone) 上的 Safari/Chrome

所以把它们放在一起给出了这样的东西(注意:我实际上并没有运行这个确切的代码):

$.ajax({
    type: "GET", 
    url: "https://yourdomain.com/gethtml",
    beforeSend: function(xhr) {
        xhr.setRequestHeader("yourheader", "value");
    },
    success: function(data) {
        var iframeDoc = document.querySelector('#myiframe').contentWindow.document;
        iframeDoc.open('text/html', 'replace');
        iframeDoc.write(data);
        iframeDoc.close();
    }
});

下面是设置这个 JS Bin 中iFrame内容的例子

编辑:这是 html 部分

<iframe id="myiframe" src="about:blank"></iframe>

编辑2:

由于某些未知原因,上述解决方案似乎不再适用于 Firefox (50.1.0)。使用此答案中的解决方案,我现在已更改为以下示例的代码,这似乎也更加健壮:

$.ajax({
    type: "GET", 
    url: "https://yourdomain.com/gethtml",
    beforeSend: function(xhr) {
        xhr.setRequestHeader("yourheader", "value");
    },
    success: function(data) {
        var iframe = document.getElementById('myiframe');
        iframe.contentWindow.contents = data;
        iframe.src = 'javascript:window["contents"]';
    }
});
@eatmypants 不确定你遇到了什么 - 我没有玩过 angular2,但我在 angular1 中使用了它。由于对服务器的调用是 ajax,因此您应该能够以任何其他 ajax 调用的方式解析您的 url。你编辑srciFrame吧?我只是将其保留为about:blank.
2021-04-22 16:45:43
不幸的是,如果您使用“应用内”相对路径加载一些内容,您可能会遇到问题。用 angular2 试了一下,遇到了路由问题“找不到路由”……还没有找到任何答案。
2021-04-27 16:45:43

以下代码有效。它是对Matthew Graves 提供代码的修改,修改为使用srcdoc属性来解决 CSS 和 JavaScript 引用未运行的问题。不幸的是,它仅适用于 Chrome。

 $.ajax({
        type: "GET", 
        url: "https://app.icontact.com/icp/a/",
        contentType: "application/json",
        beforeSend: function(xhr, settings){
                xhr.setRequestHeader("some_custom_header", "foo");},
        success: function(data){
            $("#output_iframe_id").attr('srcdoc',data)
        }
    });

编辑:最后,我通过将它们重新分配给 document.ready 函数上的 iframe 解决了脚本块跨浏览器的问题:

$(document).ready(function () {
    var doc = $(document);
    if (frames.length > 0) {
        doc = frames[0].document;
        $(doc).find('script').each(function () {
            var script = document.createElement("script");
            if ($(this).attr("type") != null) script.type = $(this).attr("type");
            if ($(this).attr("src") != null) script.src = $(this).attr("src");
            script.text = $(this).html();
            $(doc).find('head')[0].appendChild(script);
            $(this).remove();
        });
    }
});