JavaScript で AJAX 呼び出しを行うときに、HTTP 要求ヘッダーを非常に簡単に設定できることを理解しています。
ただし、スクリプトを使用して iframe をページに挿入するときに、カスタム HTTP 要求ヘッダーを設定することもできますか?
<iframe src="someURL"> <!-- is there any place to set headers in this? -->
JavaScript で AJAX 呼び出しを行うときに、HTTP 要求ヘッダーを非常に簡単に設定できることを理解しています。
ただし、スクリプトを使用して iframe をページに挿入するときに、カスタム HTTP 要求ヘッダーを設定することもできますか?
<iframe src="someURL"> <!-- is there any place to set headers in this? -->
必要なヘッダーを設定して、javascript でリクエストを行うことができます。次に、iframe の にURL.createObjectURL()
適したものを取得できます。src
var xhr = new XMLHttpRequest();
xhr.open('GET', 'page.html');
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 :(');
}
}
}
応答の MIME タイプは保持されます。したがって、html 応答を取得すると、html が iframe に表示されます。PDF を要求した場合、ブラウザーの PDF ビューアーが iframe に対して起動します。
これが長期間有効なクライアント側アプリの一部である場合は、URL.revokeObjectURL()
メモリ リークを回避するために使用することをお勧めします。
オブジェクト URL も非常に興味深いものです。それらは形式blob:https://your.domain/1e8def13-3817-4eab-ad8a-160923995170
です。実際にそれらを新しいタブで開いて応答を確認できます。それらを作成したコンテキストが閉じられると、それらは破棄されます。
完全な例は次のとおりです: https://github.com/courajs/pdf-poc
いいえ、できません。iframe
ただし、ソースをある種のプリロード スクリプトに設定することもできます。これは、AJAX を使用して、必要なすべてのヘッダーを含む実際のページを取得します。
@FellowMD の回答は createObjectURL の減価償却により最新のブラウザーでは機能しないため、同じアプローチを使用しましたが、iframe srcDoc 属性を使用しました。
以下のReactの例を見つけてください(やり過ぎだと思います):
import React, {useEffect, useState} from 'react';
function App() {
const [content, setContent] = useState('');
useEffect(() => {
// Fetch the content using the method of your choice
const fetchedContent = '<h1>Some HTML</h1>';
setContent(fetchedContent);
}, []);
return (
<div className="App">
<iframe sandbox id="inlineFrameExample"
title="Inline Frame Example"
width="300"
height="200"
srcDoc={content}>
</iframe>
</div>
);
}
export default App;
Srcdoc は現在、ほとんどのブラウザーでサポートされています。Edge の実装が少し遅れたようです: https://caniuse.com/#feat=iframe-srcdoc