質問
どのようにデータをiframeに投稿しますか?
解決
<!> quot; post data <!> quot;の意味によって異なります。 target=""
タグでHTML <form />
属性を使用できるため、次のように簡単になります。
<form action="do_stuff.aspx" method="post" target="my_iframe">
<input type="submit" value="Do Stuff!" />
</form>
<!-- when the form is submitted, the server response will appear in this iframe -->
<iframe name="my_iframe" src="not_submitted_yet.aspx"></iframe>
それ以外の場合、またはより複雑なものを探している場合は、質問を編集して詳細を追加してください。
Internet Explorerには、Javascriptを使用してiframeなどを動的に作成する場合にのみ発生する既知のバグがあります(回避策はこちら)が、通常のHTMLマークアップを使用している場合は問題ありません。ターゲット属性とフレーム名は、巧妙な忍者のハックではありません。 HTML 4 StrictまたはXHTML 1 Strictでは非推奨(したがって検証されません)ですが、3.2以降はHTMLの一部であり、正式にはHTML5の一部であり、Netscape 3以降のほぼすべてのブラウザーで動作します。
この動作は、XHTML 1 Strict、XHTML 1 Transitional、HTML 4 Strict、および<!> quot; quirksモード<!> quot;で動作することを確認しました。 DOCTYPEを指定せずに、Internet Explorer 7.0.5730.13を使用してすべての場合に機能します。私のテストケースは、IIS 6のクラシックASPを使用した2つのファイルで構成されています。ここで完全に再現されているため、この動作を自分で確認できます。
default.asp
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC
"-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<title>Form Iframe Demo</title>
</head>
<body>
<form action="do_stuff.asp" method="post" target="my_frame">
<input type="text" name="someText" value="Some Text" />
<input type="submit" />
</form>
<iframe name="my_frame" src="do_stuff.asp">
</iframe>
</body>
</html>
do_stuff.asp
<%@Language="JScript"%><?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC
"-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<title>Form Iframe Demo</title>
</head>
<body>
<% if (Request.Form.Count) { %>
You typed: <%=Request.Form("someText").Item%>
<% } else { %>
(not submitted)
<% } %>
</body>
</html>
これらの例を正しく実行しないブラウザについて聞いてみたいと思います。
他のヒント
iframeは、htmlページ内に別のドキュメントを埋め込むために使用されます。
フォームがフォームページ内のiframeに送信される場合、タグのターゲット属性を使用して簡単に実現できます。
フォームのターゲット属性をiframeタグの名前に設定します。
<form action="action" method="post" target="output_frame">
<!-- input elements here -->
</form>
<iframe name="output_frame" src="" id="output_frame" width="XX" height="YY">
</iframe>
高度なiframeターゲットの使用
このプロパティは、ファイルをアップロードするためにフォームを送信することが必須となるファイルアップロードのような場合に、特にAjaxのようなエクスペリエンスを生成するためにも使用できます
iframeの幅と高さを0に設定し、ターゲットをiframeに設定してフォームを送信し、フォームを送信する前に読み込みダイアログを開くことができます。そのため、読み込みダイアログが開いた状態で、コントロールが入力フォームjspに残っているため、ajaxコントロールをモックします。
例
<script>
$( "#uploadDialog" ).dialog({ autoOpen: false, modal: true, closeOnEscape: false,
open: function(event, ui) { jQuery('.ui-dialog-titlebar-close').hide(); } });
function startUpload()
{
$("#uploadDialog").dialog("open");
}
function stopUpload()
{
$("#uploadDialog").dialog("close");
}
</script>
<div id="uploadDialog" title="Please Wait!!!">
<center>
<img src="/imagePath/loading.gif" width="100" height="100"/>
<br/>
Loading Details...
</center>
</div>
<FORM ENCTYPE="multipart/form-data" ACTION="Action" METHOD="POST" target="upload_target" onsubmit="startUpload()">
<!-- input file elements here-->
</FORM>
<iframe id="upload_target" name="upload_target" src="#" style="width:0;height:0;border:0px solid #fff;" onload="stopUpload()">
</iframe>
この関数は一時フォームを作成し、jQueryを使用してデータを送信します:
function postToIframe(data,url,target){
$('body').append('<form action="'+url+'" method="post" target="'+target+'" id="postToIframe"></form>');
$.each(data,function(n,v){
$('#postToIframe').append('<input type="hidden" name="'+n+'" value="'+v+'" />');
});
$('#postToIframe').submit().remove();
}
targetはターゲットiFrameの「名前」属性であり、データはJSオブジェクトです:
data={last_name:'Smith',first_name:'John'}
iframeの入力を変更する場合は、そのiframeからフォームを送信します。
...
var el = document.getElementById('targetFrame');
var doc, frame_win = getIframeWindow(el); // getIframeWindow is defined below
if (frame_win) {
doc = (window.contentDocument || window.document);
}
if (doc) {
doc.forms[0].someInputName.value = someValue;
...
doc.forms[0].submit();
}
...
通常、iframeのページが同じオリジンからのものである場合にのみこれを行うことができますが、Chromeをデバッグモードで起動して同じオリジンポリシーを無視し、任意のページでこれをテストできます。
function getIframeWindow(iframe_object) {
var doc;
if (iframe_object.contentWindow) {
return iframe_object.contentWindow;
}
if (iframe_object.window) {
return iframe_object.window;
}
if (!doc && iframe_object.contentDocument) {
doc = iframe_object.contentDocument;
}
if (!doc && iframe_object.document) {
doc = iframe_object.document;
}
if (doc && doc.defaultView) {
return doc.defaultView;
}
if (doc && doc.parentWindow) {
return doc.parentWindow;
}
return undefined;
}