<formのselectでリンクさせるには?(再び)

[上に] [前に] [次に]
Doug ross [E-Mail] 2000/03/15(水) 12:12:33
以前、同じ質問がされていたのですが、
下のスクリプトを実行させようとするとMACのネスケでエラーが出てしまうのですが
対処方法はないのでしょうか????
ネスケのversionは4.05です。

<SCRIPT LANGUAGE="JavaScript">
<!--
function navi() {
location=foos.slcturl.options[foos.slcturl.selectedIndex].value;
}
//-->
</SCRIPT>

<FORM NAME="foos">
<SELECT onChange="navi()" NAME="slcturl">
<OPTION>
<OPTION VALUE="./url0.html">0
<OPTION VALUE="./url1.html">1
<OPTION VALUE="./url2.html">2
</SELECT>
</FORM>

無責任官庁 2000/03/15(水) 13:15:01
これはMACに限った話では無いですね。

location=foos.slcturl.options[foos.slcturl.selectedIndex].value;
→location.href=document.foos.slcturl.options[document.foos.slcturl.selectedIndex].value;

文法ミス&無闇な省略が敗因でしょう。
ちゃんと文法通りに記述していけば問題無いものだと思います。
(私のネスケは、これでなおりました)
document,window 等はよく省略する方がいますが、
“省略しても動作する”根拠がある場合だけにしておいた方がいいと思います。
(IE は、これでも動作するの?)

本来オブジェクト名は省略すべきでないものなので、
ちゃんと「どのオブジェクトの」「どのプロパティ」という風に
記述する事をオススメします。

あなたのスクリプトの場合、"foos"がどのオブジェクトに所属するもの
なのかが判定できないのでエラーになってます。
window なのか、document なのか、それとも…?
location にプロパティが記述されていないのもエラーの一つですね。

zizz... [HomePage] 2000/03/15(水) 14:09:39
> document,window 等はよく省略する方がいますが、
> “省略しても動作する”根拠がある場合だけにしておいた方がいいと思います。
> (IE は、これでも動作するの?)
MSIEは変なので知りませんが、
windowは省略できて、documentは省略できません。

> location にプロパティが記述されていないのもエラーの一つですね。
Window オブジェクトの location プロパティーに代入すると、
内部的に location.href に代入します。
よって省略可能です。

Doug ross [E-Mail] 2000/03/15(水) 14:21:23
まず、無責任官庁さん、zizz...さん有り難うございます。

早速ご指摘いただいた通りに直してみたところ
直ったかなと思ったのですが、
SELECTボックスの右側に現れるスクロールバーで
スクロールさせようとすると、やはりエラーが出てしまうみたいです。
どうしたら良いのでしょう。
やはり、MACのネスケver.4.05のみでエラーが出ます。

無責任官庁 2000/03/15(水) 14:23:13
> 内部的に location.href に代入します。よって省略可能です。

失礼しました。いまいち根拠の無い発言でした。

私は他の言語の方が歴が長いので、省略できるできないでは無く、
オブジェクト・プロパティは「当然書くべきもの」という思いが
あるからか、ちょっと考えがかたよってしまいました。

無責任官庁 2000/03/15(水) 14:28:31
> スクロールさせようとすると、やはりエラーが出てしまうみたいです。

どのようなエラーか、わかりませんか?

あと見たところでおかしそうな所は・・・
<option> の終了タグ、</option> が無いとか。

スクロールするだけで onChange が動いてる可能性とかあるんでしょうか。
Macは持ってないので分かりません…

Doug ross [E-Mail] 2000/03/15(水) 14:43:08
すみません、エラーの内容を添えるのを忘れていました。

JavaScript Error:
file:/Macintosh%20HD/%8Ed%8E%96/%83%7D%83%8A%83%93%83t%81%5B%83Y/html/index.html,
line 8:

document.foos.slcturl.options[document.foos.slcturl.selectedIndex] has no properties.

というエラーなのですが・・・・

Doug ross [E-Mail] 2000/03/15(水) 14:46:10
たびたびスミマセン。
8行目は以下のようになっています。

<HTML>
<HEAD>
<TITLE></TITLE>

<SCRIPT LANGUAGE="JavaScript">
<!--
function navi() {
location.href=document.foos.slcturl.options[document.foos.slcturl.selectedIndex].value;
}
//-->
</SCRIPT>

フシギバナ 2000/03/15(水) 15:16:19
今度は、ほんとうに Mac,ネスケのversionは4.05のケース特有みたい...。
WIN95,ネスケ4.5 IE4で再現せず。

無責任官庁 2000/03/15(水) 15:32:07
スクロールしただけ、ですよね。
やはりonChangeが動作しているようですねぇ。(そういうもんなんだろうか?)

function navi() {
idx = document.foos.slcturl.selectedIndex;
if(idx > 0){
  location.href = document.foos.slcturl.options[idx].value;
}
}

ちょうど options の一つ目は選択項目では無いので、
こんな風にしてみてはどうでしょうか。
あと、<OPTION>ごとに、その終了タグも入れてみて。

Doug ross [E-Mail] 2000/03/15(水) 16:16:10
[[解決]]
解決です。ありがとうございます。
無責任官庁さん、zizz...さん、フシギバナさん
ほんとうにありがとうございます。

ちなみに、options の一つ目にリンクは不可能ですか???

でも、解決です。

zizz... [HomePage] 2000/03/15(水) 21:20:24
> 私は他の言語の方が歴が長いので、省略できるできないでは無く、
> オブジェクト・プロパティは「当然書くべきもの」という思いが
> あるからか、ちょっと考えがかたよってしまいました。

JavaScriptの場合、Native codeではプロパティーはだたの変数ではなくgetter, setterの処理を隠蔽したものです。
(JavaScript 1.5では JavaScriptで書いたコードでもgetter, setterの処理を自分で書けるようになっています)

window.location プロパティーの場合、getしたときは
特に処理を指定していないので、Location オブジェクトを返します。
これを暗黙の型変換で文字列に変換すると
window.location.href の値を返してきます。(実は少し違うけど)
setしたときは window.location.href に代入する関数が呼ばれます。
Location オブジェクトを代入で変更されたら困るし、ReadOnlyにするとわかりにくいと
開発者が考えたのではないかと私は推測しています。

Window オブジェクトはGlobalObjectです。
その window プロパティー (と self プロパティー) は自分自身を返します。
だから window.window.window.window.location と location は同じです。

省略可能と言えば省略可能なのですが、それなりに理由があります。

無責任官庁 [E-Mail] 2000/03/15(水) 23:04:31
> プロパティーはだたの変数ではなくgetter, setterの処理を隠蔽したものです。

実は以前、zizz...さんのサイトを見に行ったとき、getter,setterの利用価値というか、
意味がいまいち分からなかったのですが…
ここまでの話と、この説明でやっと理解しました。
丁寧な説明、ありがとうございました。

#でも私はやっぱり、オブジェクト、メソッド、プロパティの名称は
#明確に分けてあった方のがわかりやすいなぁ…
#自動判定は便利だけど、裏で何やってるか分からないってモノに
#一抹の不安を感じる年頃なんです(謎)

> ちなみに、options の一つ目にリンクは不可能ですか???

可能と言えば可能かもしれませんけども、onChangeでは拾えない
と思うので、ちょっと大変じゃないかと思います。
optionsの一つ目には“以下の中から選択してください”とか書いて
おくってのが一番無難じゃないかと。

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