IEで子ウインドウから親ウインドウへのタグの追加
【やりたいこと】
1.親ウインドウからポップアップで子ウインドウを出して、その子ウインドウ内でチェックしたものを親ウインドウの<select>タグに<option>タグとして付け加えること。
2.同じくhiddenタグでチェックしたもののvalueを持たせたいということ。
とあるサイトを参考に、firefoxではこの挙動ができました。
ただ、IEだと親ウインドウに何も反映されなくて困っています。
以下ソース(一部)です。
--親html--
<head>
<script type="text/javascript">
<!--
var w = window;
function openWin(url) {
if ((w == window) || w.closed) {
w = open(url, "_blank", "width=800,height=600,scrollbars=yes");
} else {
w.focus();
}
return(false);
}
// -->
</script>
</head>
<body>
<select id="selectArea" size="5" name="search_area" class="list_box">
(ここに1.)
</select>
<div id="search_area">
(ここに2.)
</div>
<input type="button" onClick="return openWin('checkbox.php')" value="チェックをつける">
</body>
--子html--
<input type="checkbox" name="department" value="c1" onclick="BoxCheckChild(this)">
<input type="checkbox" value="t1" onclick="BoxCheckChild(this)">
<input type="checkbox" value="s1" onclick="BoxCheckChild(this)">
子htmlでは、onclickでチェックしたチェックボックスに対して処理をしています。
--javascript--
function appendOptionLast(str, value){//親ウインドウに<option>として追加(1.)
var elOptNew = window.opener.document.createElement('option');
elOptNew.text = str;
elOptNew.value = value;
var elSel = window.opener.document.getElementById('selectArea');
var nstr = "<option value=aaa>test</option>"
try {
elSel.add(elOptNew, null);
} catch(ex) {
elSel.add(elOptNew)
}
function make_hidden(value){//hiddenタグ作成、追加(2.)
var q = document.createElement('input');
q.type = 'hidden';
value = value.slice(1);
if(type == "c"){
q.name = 'department[]';
}else if(type == "t"){
q.name = 'theme[]';
}else if(type == "s"){
q.name = 'index[]';
}
q.value = value;
window.opener.document.getElementById("search_area").appendChild(q);
}
となっています。
ソース、説明ともにわかり辛いかもしれませんが、どなたかわかる方いたら助けてもらえるとありがたいです。
No.1ベストアンサー
- 回答日時:
IEでは子Windowから親へappendChild出来ないみたいですね。
innnerHTMLは出来るみたいなのでそちらを使えば出来ました。
あなたのBoxCheckChild()の中身が解らないので、なんともいえませんが
value.slice(1)ってのは変な気がします。
子htmlのjavascript部分を改造してみました。
--子html--
<body>
c1<input type="checkbox" name="department" value="c1" onclick="BoxCheckChild(this)">
t1<input type="checkbox" value="t1" onclick="BoxCheckChild(this)">
s1<input type="checkbox" value="s1" onclick="BoxCheckChild(this)">
</body>
--script----(全角空白は半角空白へ)
function BoxCheckChild(elm){
if(elm.checked==true){
appendOptionLast(elm.value,elm.value);
make_hidden(elm.value);
}
}
function appendOptionLast(str, value){
var elOptNew = window.opener.document.createElement('option');
elOptNew.text = str;
elOptNew.value = value;
var elSel = window.opener.document.getElementById('selectArea');
var nstr = "<option value=aaa>test</option>"
try {
elSel.add(elOptNew, null);
} catch(ex) {
elSel.add(elOptNew)
}
}
function make_hidden(value){
var input;
type = value.slice(0,1);
if(type == "c"){
input='<input type="hidden" name="department[]" value="'+value+'">';
}else if(type == "t"){
input='<input type="hidden" name="theme[]" value="'+value+'">';
}else if(type == "s"){
input='<input type="hidden" name="index[]" value="'+value+'">';
}
window.opener.document.getElementById("search_area").innerHTML+=input;
}
No.2
- 回答日時:
Node は必ず、自分を生成してくれた 1 個の Document と結び付いています。
Node は Document の文脈で「生きて」おり、Node に変更が加えられるや直ちに Document に通知されて、関連する他の Node などをアップデートします。ゆえに、異なる Document に属する Node を取り込むときは Document::importNode を通さねばなりません。
var q = document.createElement('input');
q = window.opener.document.importNode(q, true); // ※
window.opener.document.getElementById("search_area").appendChild(q);
あるいは、最初から必要な Document 上で Node を生成すれば良い。
var q = window.opener.document.createElement('input'); // ※
window.opener.document.getElementById("search_area").appendChild(q);
歴史的理由により、Firefox などでは importNode を通さずとも異なる Document に属する Node を取り込めてしまいますが、DOM 規定上は正しくありません。MDC のリファレンスにも importNode を通すよう注意書きがあります。
---
ここで、もう一つの問題があります。IE が importNode を持っていないことです。
やりようはいくつかありますが、この場合は No.1 の言うように innerHTML を使うのが無難です。と言うのは、IE7 以下では、一度生成し終えたフォームコントロールの name 属性は変更できない(表面上は変わっても内部的に変更されていない)という不具合があるからです。
> q.name = 'department[]';
> q.name = 'theme[]';
> q.name = 'index[]';
上記は IE7 以下で反映されていないはずです。これの回避策もいくつかありますが、importNode 問題を考慮しつつ innerHTML を通すのが、手っ取り早いでしょう(ただ、innerHTML を += で連結すると場合によっては大変なことになるので、工夫して下さい)。
---
ついでですが、
> elOptNew.text = str;
DOM2-HTML 規定に目を通せばお分かりのように、HTMLOptionElement::text は読取専用です。text を書き換えられるのは、古い JavaScript 1.1 の Option オブジェクトの仕様です。もっとも、DOM-HTML5 は後者に合わせて仕様変更しましたが。
参考URL:https://developer.mozilla.org/ja/DOM/document.im …
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- JavaScript プログラムがうまく動きませんレビューお願いします 1 2022/07/10 05:08
- JavaScript コードレビューをお願いします。 1 2022/07/16 05:38
- JavaScript 以前の質問だと、どの条件でも配列が表示されてしまいます。 1 2022/07/09 11:40
- JavaScript ①入力フォーム→②確認表示画面→③送信完了画面のコードを書いているのです、 入力フォームから受け取っ 2 2022/05/10 16:45
- JavaScript javascript作成してます。ラジオボタンで判定するコードを書いてます。 1 2023/07/18 11:03
- JavaScript セレクトボックスで配列を呼び出したい。 1 2022/07/08 20:14
- JavaScript セレクトボックスを2つ選択してメッセージなどを表示するには。~運賃検索プログラムを完成させたい~ 1 2022/07/22 11:10
- JavaScript 1日1回引けるJavaScriptおみくじについて 1 2022/12/12 22:28
- PHP 入力した部分を表示させたまま(保持)するにはどうすれば良いでしょうか? 1 2023/01/25 11:14
- JavaScript javascriptのちょっとした動作不良(原因は突き止めたのですが) 1 2023/06/15 19:58
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
value内に変数を入れたい
-
%の計算の仕方
-
クリックの度に加算していくには?
-
3桁区切りのカンマをつけたい...
-
セレクトボックスの初期選択状...
-
VB.NET DateTimeの型について
-
演算対象の数字と演算子を入力...
-
javascriptにてHTMLのhiddenエ...
-
ダミーフォームの内容を送信用...
-
hiddenのvalueの値を変えたい
-
jsで、配列内の文章を改行する...
-
クイズ作成:15個の問題から5個...
-
javaで name=id[?] を指定...
-
ホームページビルダーのスクリ...
-
ループで連続したフォームの値...
-
関数名などの固有名詞(?)を...
-
sessionStorageを調べています。
-
HTML ローカルストレージへの保存
-
自動的に連番生成したURLにリン...
-
複数のsubmitボタンで押された...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
hiddenのvalueの値を変えたい
-
value内に変数を入れたい
-
引数に数値、文字列の混在
-
複数のsubmitボタンで押された...
-
VB.NET DateTimeの型について
-
3桁区切りのカンマをつけたい...
-
javascriptでhiddenに二次元配...
-
フォームで入力した値を別のフ...
-
setIntervalの間隔を途中で変更...
-
jsで、配列内の文章を改行する...
-
Pythonで会員サイトの自動ログ...
-
selectboxのoptionタグのvalue...
-
テキストボックスに入力された...
-
フォーカスすると初期値が消去...
-
ラジオボタンと連動して文字列...
-
セレクトボックスの初期選択状...
-
sessionStorageを調べています。
-
VBAをJavaScriptに変換したいです
-
ダミーフォームの内容を送信用...
-
javascriptで複数の計算を同時...
おすすめ情報