window.open がうまくいかない。(IE5.01)

[上に] [前に] [次に]
中根 [E-Mail] [HomePage] 1999/12/30(木) 18:40:16
こんにちは、中根です。

以前、いくらWindowsユーザーしか見に来ないようなサイトでも
NNに対応すべきだと指摘され現在HPの再構築を行っています。

さて、デジカメでとった写真のアルバムのような物を作成しています。
サムネイルをクリックすると新しいウィンドウで大きいイメージが
出てくるようにしたいと思っています。

しかし、画像によって大きさが違うのでwindow.openをする部分を
関数化し、A HREFから呼び出そうと思います。

そこで、次のようなコードを書き、HEADにつけました。

function open(URL,x,y){
options="width="+x+",height="+y+","location=no,menubar=no,status=no,toolbar=no";
window.open(URL,"sub",options);
}

呼び出す部分は、<a href="javascript:open('XXXX.jpg',600,450)">
クリックしてもらう部分</a>

としました。ところが、クリックすると、ウィンドウは開きますが
ウィンドウの大きさが指定した大きさになっていません。
また、親ウィンドウのコンテンツの表示が消え、[Object]と
白い地にかかれています。

サッパリ分かりません。

JavaScriptはinnerHTMLを操作して文字を書き換えるものしか
書いたことがありません。
素材集のスクリプトを書き換えたことは結構あります。

Dr.RUGEYE [E-Mail] [HomePage] 1999/12/30(木) 19:54:20
function open(URL,x,y){
options="'width="+x+",height="+y+","location=no,menubar=no,status=no,toolbar=no'";
window.open(URL,'sub',options);
}

これで如何です?

オプションは "or' で括るのが正解かと‥‥‥思います。

#余談になりますが、
http://www.tohoho-web.com/wwwjsx32.htm
が参考になるかと思います。

Y.K 1999/12/31(金) 00:22:47
はじめまして。

見る限りですが、
options の行の 6番目の &quot; が余分なような気がしますが。
違ってたらすみません。

Y.K 1999/12/31(金) 00:25:02
あらら   " ←これです。汗

zizz... [HomePage] 1999/12/31(金) 10:14:10
function open(URL,x,y){
options="width="+x+",height="+y+",location=no,menubar=no,status=no,toolbar=no";
window.open(URL,'sub',options);
}

<a href="javascript:open('index.html',600,450)">
これで関数openの中にalertか何かを入れたら分かると思うが、
aのopenでopen関数が呼ばれているが、
そのなかのwindow.openでもopen関数が呼ばれている。
再帰的に呼び出していることになり、Netscape Navigator 4.7では、
「再帰的に呼び出しすぎ」でエラーが出た。

function open(URL,x,y){

function openWin(URL,x,y){
とでもすると解決する。

zizz... [HomePage] 1999/12/31(金) 11:36:32
上の説明では原因がさっぱりわからないので補足。

funtion Identifer (FormalParameterList) の
function keywordで関数を定義したとき、内部的には
Funtion Objectが呼び出され、Global ObjectのIdentiferという名前のプロパティーに代入されます。
つまりトップレベルの関数はGlobal Objectのメソッドです。

わかりやすいようにGlobal Objectを[Global Object]と書きます。
[Global Object].windowは[Global Object]自身を指している。
よってWindow ObjectはGlobal Objectと言える。

function foo() { statements; }
と記述した場合、[Global Object].foo と [Global Object].window.foo は同じものを指す。

という訳で、
function open(URL,x,y)
と書くと、window.openが指し示す値が上書きされてしまうのだと思います。

試しに、
function foo() { alert("hoge"); }
window.foo();
とすると警告ダイアログが表示されます。

ECMAScript Language Specification 2nd Editionを参考にしました。
間違っていたら指摘してください。

中根 [E-Mail] [HomePage] 1999/12/31(金) 18:38:02
こんにちは、中根です。

返答ありがとうございます。
とりあえず、スクリプトは動くようになりました。

ところが、開いたウィンドウ内で余白が出来るため
画像のドット数を、x,yに指定しても全ての部分が表示されません。

余白を0にする方法を教えてください。

ただ、画像ごとにHTMLを書きたくないので、スクリプトから
余白を設定したいです。

共通のHTMLを書いておいて、その画像部分だけを
スクリプトで書き換える(document.img.srcを書き換える)ことも考えたのですが
具体的なコードが思いつきません。

Dr.RUGEYE [E-Mail] [HomePage] 1999/12/31(金) 21:19:47
../199905/99050124.htm

これですか?

中根 [E-Mail] [HomePage] 1999/12/31(金) 23:14:42
こんにちは、中根です。

たしかに、HTMLを作っておいてそこで余白を制御するという手は
ありますが、それだと画像ごとにHTMLを書かないといけないので
なるべく避けたいです。

子ウィンドウ用の共通のHTMLを作っておき、
親ウィンドウからdocument.img.srcを書き換えることも
テストしてみましたが、画像によって大きさが違うため
使えませんでした。
(NNでは勝手に最初に出した画像の大きさにあわせて、後に
表示した画像が縮小・拡大されてしまう)

他にやりかたはありませんか?

Dr.RUGEYE [E-Mail] [HomePage] 2000/01/01(土) 00:43:59
JavaScriptでHTMLを書き出せば宜しいのでは?
これならインラインイメージの部分を差し替えるだけです。

中根 [E-Mail] [HomePage] 2000/01/02(日) 08:27:24
[[解決]]
こんにちは、中根です。

とりあえず、Dr.RUGEYEさんのやり方でやってみることにします。
ただ、そういうスクリプトは書いたことが無いので
うまくいかなかったら、また教えてください。

ありがとうございました。

中根 [E-Mail] [HomePage] 2000/01/04(火) 20:03:52
[[解決]]
こんにちは、中根です。

Dr.RUGEYEさんからソースを提供してもらいました。
ありがとうございました。

[上に] [前に] [次に]