Re: TEXTAREA と 外部jsファイル
すぎたです。
既に解決されているようなので、混乱させる元になるかという気が
しないでもないのですが、データの読み込みというのも面白そう
なので、いくつか作ってみました。
# 以前、どなたか例示されていたと思うのですが、Google の
# fj.comp.lang.javascript が Swen 以来死んだ状態なので・・・
環境
IE5.5sp2 (5.50.4807.2300)
Mozilla Firebird 0.7+ Gecko/20031002
| IE Gecko
-------------+----+-------
1) reload OK OK
2) open-js OK OK(なぜエラーが発生するかよくわからず)
3) open-html OK OK(なぜエラーが発生するかよくわからず)
4) frame OK OK(reload時のみ security error)
5) iframe OK OK(reload時のみ security error)
6) script OK NG
7) innerHTML NG NG(なので、ソース無しです)
# IE の方は、とくエラーは発生しません。
# DOM に関しては、試していないです。
共通
=== a.js ===
var aaa = new Array(1, 2, 3);
=== b.js ===
var aaa = new Array(4, 5, 6);
1) reload
=== reload.html ===
<head>
<script>
function parseInput(href,sep1,sep2,sep3) {
if (href == undefined) href = "";
if (sep1 == undefined) sep1 = "?";
if (sep2 == undefined) sep2 = "&";
if (sep3 == undefined) sep3 = "=";
var url = href.split(sep1);
var args = new Array(); // local scope
args[0] = url[0];
if (url.length >= 2) {
var opts = url[1].split(sep2);
for (var i=0; i < opts.length; i++) {
var e = opts[i].split(sep3);
args[e[0]] = (e[1] == undefined ? true : unescape(e[1]));
}
}
if (parseInput.debug) {
var s = "";
for (var i in args)
s += i + ":" + args[i] + "\n";
alert(s);
}
return args;
}
var args = parseInput(location.href); // global scope
function reload(fname) {
location.href = args[0] + "?data=" + fname;
}
function disp(data) {
var txt = document.getElementById("txt");
txt.value = data[0];
}
function init() {
disp(aaa);
}
</script>
</head>
<body onload="init()">
<script>
var fname = (args['data'] ? args['data'] : "a.js");
document.writeln("<script src='" + fname + "'></\script>");
</script>
<textarea id="txt">
</textarea>
<hr>
<input type="button" value="a" onclick="reload('a.js')">
<input type="button" value="b" onclick="reload('b.js')">
<hr>
</body>
2) open-js
=== open-js.html ===
<head>
<script>
function load_data(fname) {
var w = open("about:blank","data","width=400,height=50");
w.document.open();
w.document.writeln("<p>just a moment.</p>");
w.document.writeln("<script src='" + fname + "'></\script>");
w.document.writeln("<script>");
w.document.writeln("opener.load_finish(self, aaa);");
w.document.writeln("</\script>");
w.document.close();
}
function load_finish(w,data) {
disp(data);
w.close();
}
function disp(data) {
var txt = document.getElementById("txt");
txt.value = data[0];
}
function init() {
load_data('a.js');
}
</script>
</head>
<body onload="init()">
<textarea id="txt">
</textarea>
<hr>
<input type="button" value="a" onclick="load_data('a.js')">
<input type="button" value="b" onclick="load_data('b.js')">
<hr>
</body>
3) open-html
=== open-html.html ===
<head>
<script>
function load_data(fname) {
open(fname,"data","width=400,height=50");
}
function load_finish(w,data) {
disp(data);
w.close();
}
function disp(data) {
var txt = document.getElementById("txt");
txt.value = data[0];
}
function init() {
load_data("a.html");
}
</script>
</head>
<body onload="init()">
<textarea id="txt">
</textarea>
<hr>
<input type="button" value="a" onclick="load_data('a.html')">
<input type="button" value="b" onclick="load_data('b.html')">
<hr>
</body>
=== a.html ===
<head>
<script>
var aaa = new Array(1, 2, 3);
function finish() {
opener.load_finish(self, aaa);
}
</script>
</head>
<body onload="finish()">
<p>just a moment.</p>
</body>
=== b.html ===
<head>
<script>
var aaa = new Array(4, 5, 6);
function finish() {
opener.load_finish(self, aaa);
}
</script>
</head>
<body onload="finish()">
<p>just a moment.</p>
</body>
4) frame
=== frame.html ===
<frameset cols="100%,*" frameborder="no">
<frame name="main" src="frame-main.html">
<frame name="data" src="about:blank">
</frameset>
=== frame-main.html ===
<head>
<script>
function load_data(fname) {
top.data.document.open();
top.data.document.writeln("<script src='" + fname + "'></\script>");
top.data.document.close();
setTimeout("disp(top.data.aaa)", 0);
}
function disp(data) {
var txt = document.getElementById("txt");
txt.value = data[0];
}
function init() {
load_data('a.js');
}
</script>
</head>
<body onload="init()">
<textarea id="txt">
</textarea>
<hr>
<input type="button" value="a" onclick="load_data('a.js')">
<input type="button" value="b" onclick="load_data('b.js')">
<hr>
</body>
5) iframe
<head>
<script>
function load_data(fname) {
data.document.open();
data.document.writeln("<script src='" + fname + "'></\script>");
data.document.close();
setTimeout("disp(data.aaa)", 0);
}
function disp(data) { // local scope
var txt = document.getElementById("txt");
txt.value = data[0];
}
function init() {
load_data('a.js');
}
</script>
</head>
<body onload="init()">
<textarea id="txt">
</textarea>
<hr>
<input type="button" value="a" onclick="load_data('a.js')">
<input type="button" value="b" onclick="load_data('b.js')">
<hr>
<iframe name="data" style="height:0; display:none"></iframe>
<!-- どちらでも可
<iframe name="data"
style="height:0; left:0; top:0; position:absolute; visibility:hidden">
</iframe>
-->
</body>
6) script
<head>
<script>
function load_data(fname) {
var data = document.getElementById("data");
data.src = fname;
setTimeout("disp(aaa)", 0);
}
function disp(data) { // local scope
var txt = document.getElementById("txt");
txt.value = data[0];
}
function init() {
load_data('a.js');
}
</script>
</head>
<body onload="init()">
<textarea id="txt">
</textarea>
<hr>
<input type="button" value="a" onclick="load_data('a.js')">
<input type="button" value="b" onclick="load_data('b.js')">
<hr>
<script id="data" src="a.js"></script>
</body>
# 書いてる途中でちょっと編集したので、間違ってたらご容赦ください。
ちょっと関係ないですが、Gecko で、フレーム内で iframe を利用し、
onload で document.write() を利用して初期化しようとすると、
document.close() しているにもかかわらず、読み込みが終了しない
という現象が発生していました。
button 等の onclick か、フレームでなく直接開いた場合の初期化
の場合は問題なかったです。
--
杉田
sugi-nws@bk.iij4u.or.jp
Fnews-brouse 1.9(20180406) -- by Mizuno, MWE <mwe@ccsf.jp>
GnuPG Key ID = ECC8A735
GnuPG Key fingerprint = 9BE6 B9E9 55A5 A499 CD51 946E 9BDC 7870 ECC8 A735