二つのセレクトリストについて質問があります。



0   名前: たかし : 2007/05/12(土) 23:11  ID:qx5eHtoH sub-s.
初めて投稿させていただきます たかし と申します。
早速の質問ですが二つのセレクトリストを作り検索をかけましたところ親カテゴリが邪魔をしてしまい上手く検索さす事が出来ません。
HTMLには

<HTML>
<HEAD>
<TITLE></TITLE>
<script type="text/javascript" src="Select2.js"></script>
<script type="text/javascript">
<!--

window.onload=function (){
for(var i=0; i<data.length; i++){
document.FORM2.word1.options[i] = new Option(data[i][0],data[i][0]);
}
setSubMenu(0);
};

function setSubMenu(no){
document.FORM2.word2.length=0;
for(var i=1; i<data[no].length; i++){
document.FORM2.word2.options[i-1] = new Option(data[no][i].key,data[no][i].value);
}
}
// -->
</script>
</head>
<body>
<form name="FORM2">
<SELECT name="word1" value="&amp;" onchange="setSubMenu(this.selectedIndex)">
</SELECT>
<SELECT name="word2" value="&amp;">
</SELECT>
<INPUT type="hidden" name="mode" value="search"><INPUT type="hidden" name="page" value="1"><INPUT type="hidden" name="sort" value="mark"><INPUT type="hidden" name="engine" value="pre"><INPUT type="hidden" name="kn" value="1180"><INPUT type="submit" value=" 検 索 "></form>
</body>
</HTML>

と書きまして
外部ファイルにはこのように書きました。


data = [
// [メイン分類,サブ分類並び,…],
["行政",
{key:"官公庁",value:"50_01",word:"1"},
{key:"公共機関",value:"50_02",word:"2"},
{key:"公共施設",value:"50_03",word:"3"},
{key:"文化施設",value:"50_04",word:"4"},
{key:"その他",value:"50_99",word:"5"}],
["テーマパーク",
{key:"テーマパーク",value:"51_01",word:"6"},
{key:"遊園地",value:"51_02",word:"7"},
{key:"動物園",value:"51_03",word:"8"},
{key:"水族館",value:"51_04",word:"9"},
{key:"植物園",value:"51_05",word:"10"},
{key:"その他",value:"51_99",word:"11"}],
["芸術 文化",
{key:"歴史建造物",value:"52_01",word:"12"},
{key:"歴史街道",value:"52_02",word:"13"},
{key:"城 城跡",value:"52_03",word:"14"},
{key:"遺跡",value:"52_04",word:"15"},
{key:"庭園",value:"52_05",word:"16"},
{key:"寺 神社 教会",value:"52_06",word:"17"},
{key:"その他",value:"52_99",word:"18"}]
];

親カテゴリを指定しても検索結果に反映させないようにするにはどのようにすればよいのでしょうか?
すみませんがご教授のほどよろしくお願いします。

1   名前: 匿名 : 2007/05/12(土) 23:11  ID:Gje/L/NE sub-RV
ここで言う検索とは、具体的にどのような事ですか?提示された内容からはそれがわかりません。
「検索」ボタンを押してformの内容をどこかに送り、検索をさせて、結果を表示する
ということでしょうか?
このソースだとformタグのaction属性が指定されていないので自分自身が呼ばれる
だけで検索できませんね。

> 親カテゴリを指定しても検索結果に反映させないようにするにはどのようにすればよいのでしょうか?
> すみませんがご教授のほどよろしくお願いします。
これも具体的に書いてもらわないと意味が分りません。

2   名前: たかし : 2007/05/12(土) 23:11  ID:qx5eHtoH sub-s.
匿名さま、お返事ありがとうございます。
また言葉足らずの説明で申し訳ありませんでした。
>「検索」ボタンを押してformの内容をどこかに送り、検索をさせて、結果を表示する
ということでしょうか?
そうです、「検索」ボタンを押してサイト内にあるリンクサイトを表示させたいと思っております。

また、word1、word2の両方が検索対象になってしまってるみたいで正確な検索がおこなえません・・
例えば、「テーマパーク」「遊園地」と選んで検索ボタンを押してみますと検索結果のページに
「テーマパーク 51_02」と表示されてしまいます。
51_02だけを検索結果のページで表示出来ないものでしょうか?
下手な説明で申し訳ないのですがご教授のほどよろしくお願いします。

3   名前: 匿名 : 2007/05/12(土) 23:11  ID:Gje/L/NE sub-RV
> また、word1、word2の両方が検索対象になってしまってるみたいで正確な検索がおこなえません・・
話題がJavaScriptから離れてしまいそうですが、とりあえず・・

検索側が何で出来ているのか分らないのですが
検索側でリクエストに含まれるword1を無視すれば良いだけですよね。
そうできない理由があるのですか?

word1の情報を送らないようにすることはJavaScriptで可能です。
submitをbuttonにしてonClickで処理するようにした上で
その中でdocument.FORM2.word1.disabled=trueのように
ディセーブルにすればsubmitでその情報は送られません。

でも検索側で不要な物は無視するのが普通です。

4   名前: 匿名 : 2007/05/12(土) 23:11  ID:4ucdpzWk sub-Ds
普通にIT関係で【検索】といった場合には、たとえば、質問者の意図を汲んで理解
すると、ファイル検索用プログラムを連想します。ファイルの作成日、ファイル名、
バージョン、あるいは、そのドキュメント内の文字列などを組み合わせた複合条件
検索を可能にすることもできます。該当項目を見つけてから該当ファイルの一覧を
表示したりですね。しかし、そうではないような・・・

用語というのは、とくに技術系の場合は定義があります。わかりやすい自分のこと
ばで説明したほうが伝わりやすいです。通ぶって(かどうかは知りませんが)、
JavaScriptを縮めてJavaといったりするのはよく見かけることです。しかし、意味
がまったく違うんです。



5   名前: たかし : 2007/05/12(土) 23:11  ID:vdyK/eLf sub-Nn
匿名さま、またのお返事ありがとうございます。
>検索側でリクエストに含まれるword1を無視すれば良いだけですよね。
そうできない理由があるのですか?
はい。JavaScript初心者なものでword1を無視するやり方が解らなかったもので。。
また、匿名さまが書いている
>word1の情報を送らないようにすることはJavaScriptで可能です。
submitをbuttonにしてonClickで処理するようにした上で
その中でdocument.FORM2.word1.disabled=trueのように
ディセーブルにすればsubmitでその情報は送られません。
ですがもう少し詳しく教えていただけないでしょうか?
お手数とは思いますが宜しくお願いします。

6   名前: 匿名 : 2007/05/12(土) 23:11  ID:Gje/L/NE sub-RV
> JavaScript初心者なものでword1を無視するやり方が解らなかったもので。。

JavaScriptで検索を行っているのですか?
問題が無ければ検索及び結果表示のソースを見せていただけますか
word1を使っているのに無視するやり方が分らないというのは矛盾していると思います。

>word1の情報を送らないようにすることはJavaScriptで可能です。
が、普通はこのようなことは行いません。
表示するときにword1の情報が表示されるということは、その情報を
使っているということなので、word1を送らないことによって弊害が
出ることも考えられます・・

とりあえずJavaScriptでword1を送らないようにするには次のようにします。
// これを追加
function searchClick() {
	document.FORM2.word1.disabled = true;
	document.FORM2.submit();
}
<INPUT type="submit" value=" 検 索 ">
を以下のように修正。
<INPUT type="button" value=" 検 索 " onClick="searchClick()">


別な方法もあります、word1の名前を変えることです。
document.FORM2.word1.options[i] = new Option(data[i][0],data[i][0]);

document.FORM2.wordXXX.options[i] = new Option(data[i][0],data[i][0]);


<SELECT name="word1" value="&amp;" onchange="setSubMenu(this.selectedIndex)">

<SELECT name="wordXXX" value="&amp;" onchange="setSubMenu(this.selectedIndex)">


しかし、検索側で対処しなければ根本的な解決にはならないでしょうね

7   名前: たかし : 2007/05/12(土) 23:11  [URL]  ID:vdyK/eLf sub-Nn
匿名さまお返事が遅くなりごめんなさい。
今、仕事が終わり匿名さまが教えてくれたやり方をしてみたところ表示さす事が出来ました。
http://www.tenpo.info/hokkaido.html
に在りますのでご確認いただけますでしょうか?
また、追加質問で申し訳ないのですが表示部分で無選択時に[行政][官公庁]と出てしまいますがこのように[-------][--------]を表示させる方法はありますでしょうか?

>問題が無ければ検索及び結果表示のソースを見せていただけますか
word1を使っているのに無視するやり方が分らないというのは矛盾していると思います。
本当無視するやり方が分らなく質問させてもらいました。
プログラムもサンプルソースに在ったものをword1、word2を付け加えて使ってます。

8   名前: 匿名 : 2007/05/12(土) 23:11  ID:Gje/L/NE sub-RV
なるほどCGIで検索しているのですね、了解しました。

> 無選択時に[行政][官公庁]と出てしまいますがこのように[-------][--------]を

Select2.jsの先頭部分に以下のように2行挿入すれば大丈夫だと思います。
data = [
// [メイン分類,サブ分類並び,…],
["-------",
{key:"--------",value:"",word:""}],
["行政",

この修正が何を意味しているかなどは勉強してください。

老婆心ながら、HTTPの基本的な事を理解された上で、お使いのCGIの仕様や
パラメータの設定方法などを確認して、要求仕様を満たすためにformから
何を渡すべきかをもう一度ご確認されることをお奨めいたします。
そうしないと、とりあえず動いていますが問題が発生した場合など
対応できなくなると思います。

9   名前: 匿名 : 2007/05/12(土) 23:11  ID:BD0Er6nW sub-Cz
と言うか、検索上不要なデータを入力させるということは、そもそもフォームの設計が間違ってる。

もし、どうしてもフォーム送信しないコントロールが必要なら、そのコントロールには name 属性を与えないようにする。name がなくても id があれば、要素の識別は可能。

10   名前: たかし : 2007/05/12(土) 23:11  ID:V9BIPw9J sub-Nn
匿名さま返事が遅くなりましてすみませんでした。
匿名さまの教えていただいた通り無事表示させる事が出来ました。
が、
>と言うか、検索上不要なデータを入力させるということは、そもそもフォームの設計が間違ってる。

もし、どうしてもフォーム送信しないコントロールが必要なら、そのコントロールには name 属性を与えないようにする。name がなくても id があれば、要素の識別は可能。

とはいったいどおゆうことなのでしょうか?
もし匿名さまがよろしければ教えていただけないでしょうか?

11   名前: 匿名 : 2007/05/12(土) 23:11  ID:BD0Er6nW sub-Cz
>>10
HTML フォームは、サーバ側が必要とするデータを入力させ、「name=value」形式で送信するためのもの。>>8 が言うように、どんなデータのペアが必要なのかは、CGI スクリプトによって決まっています。だから原則、サーバ側が必要としないデータの入力コントロールを、気軽にホイホイ置いて良いものではありません(本件がそうというわけではなく、そういうケースが非常に多いということ)

例えば >>0 のように、たかだか 2 階層のグループ分けならば、まず optgroup 要素の利用を考えるべき。わざわざスクリプトなんぞ使う必要はありません。
<select name="word2">
  <optgroup label="行政">
    <option value="50_01">官公庁</option>
    <option value="50_02">公共機関</option>
  </optgroup>
  <optgroup label="テーマパーク">
    <option value="51_01">テーマパーク</option>
    <option value="51_02">遊園地</option>
  </optgroup>
  <optgroup label="芸術・文化">
    <option value="51_01">歴史建造物</option>
    <option value="51_02">歴史街道</option>
  </optgroup>
</select>

もし、項目数が 100 以上あって選択しづらいということなら、2 つの方向性があります。1 つはサーバ側のデータ処理の見直しですが、今は考えません。もう 1 つは、本件のようにスクリプト制御。いくつか方法が考えられます。

・探しやすくするインタフェースの用意。
参考:select 要素をインクリメンタルサーチするブックマークレット
http://yusuke.homeip.net/diary/2007/05/08/1178596172277.html

・本件のような、擬似的な絞り込み。
私なら、>>0 のようなスクリプト完全依存の方法は採らず、上記の optgroup 要素を活かす形を考えます(そうしておけば、非スクリプト環境にも対応できる)が、今は置いておきます。とにかく、>>0 をベースに何とかしようとするならば:
<select name="word1"> → <select id="word1">
window.onload = function () {
    var node = document.getElementById ('word1');
    for (var i = 0, I = data.length; i < data.I; i++) {
        node.options[i] = new Option (data[i][0], data[i][0]);  // not DOM-standard
    }
    setSubMenu (0);
};

こうすれば、最初の select 要素はコントロール名(name 属性)を持たないので、値がサーバに送信さることはありません。

あるいは、もし何らかの事情で「一時的に送信したくない」ということであれば、>>6 のように disabled を動的に与えても良いでしょう。

だが繰り返しますが、特別な理由がない限り、サーバに送信したくない入力コントロールをフォーム内に置くというのは、フォームデザインのミスと考えて下さい(私は >>6 の仰ることに同意です)。

12   名前: 匿名 : 2007/05/12(土) 23:11  ID:BD0Er6nW sub-Cz
>>11
Typo 訂正:
for (var i = 0, I = data.length; i < I; i++) {

スレッドは >>10 で終了していると思うので、以下はあくまで蛇足。

> 私なら、>>0 のようなスクリプト完全依存の方法は採らず、上記の optgroup 要素を活かす形を考えます

偉そうなことを言ってしまったので、例を出してみる。以下は、optgourp 要素でグループ化された select 要素を、>>0 のような 2 段連動に変換します。また、非スクリプト環境でも、問題なく送信できます。

面倒なので Firefox と Opera(JavaScript 1.6 + DOM Level 2)のみ。IE 対応のものは、似たようなものをここに何度か書いたので必要なら探して下さい。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<title>TEST</title>
<style type="text/css">

[disabled] { display: none; }

</style>
<script type="application/javascript">

addEventListener ('load', function (event) {
    var select = document.forms[0].elements['word2'];
    var newSelect = document.createElement ('select');
    
    Array.forEach (select.getElementsByTagName ('optgroup'), function (optgroup) {
        var option;
        
        option = optgroup.insertBefore (document.createElement ('option'), optgroup.firstChild);
        option.appendChild (document.createTextNode ('-'));
        
        option = newSelect.appendChild (option.cloneNode (false));
        option.appendChild (document.createTextNode (optgroup.label));
        option.value = optgroup.label;
    } );
    
    newSelect.addEventListener ('change', {
        relatedSelect : select,
        handleEvent : function (event) {
            var label = event.target.value;
            
            Array.forEach (this.relatedSelect.getElementsByTagName ('optgroup'), function (optgroup) {
                if (optgroup.label == label) {
                    optgroup.disabled = false;
                    this.relatedSelect.selectedIndex = optgroup.getElementsByTagName ('option')[0].index;
                } else {
                    optgroup.disabled = true;
                }
            }, this);
            
            rs = label = null;
        }
    }, false);
    
    select.parentNode.insertBefore (newSelect, select);
    newSelect.selectedIndex = 0;
    
    var event = document.createEvent ('HTMLEvents');
    event.initEvent ('change', true, false);
    newSelect.dispatchEvent (event);
    
    select = newSelect = event = null;
}, false);

</script>

<form action="#">
  <p>
    <select name="word2">
      <optgroup label="行政">
        <option value="50_01">官公庁</option>
        <option value="50_02">公共機関</option>
        <option value="50_03">公共施設</option>
        <option value="50_04">文化施設</option>
        <option value="50_99">その他</option>
      </optgroup>
      <optgroup label="テーマパーク">
        <option value="51_01">テーマパーク</option>
        <option value="51_02">遊園地</option>
        <option value="51_03">動物園</option>
        <option value="51_04">水族館</option>
        <option value="51_05">植物園</option>
        <option value="51_99">その他</option>
      </optgroup>
      <optgroup label="芸術・文化">
        <option value="52_01">歴史建造物</option>
        <option value="52_02">歴史街道</option>
        <option value="52_03">城・城跡</option>
        <option value="52_04">遺跡</option>
        <option value="52_05">庭園</option>
        <option value="52_06">寺・神社・教会</option>
        <option value="52_99">その他</option>
      </optgroup>
    </select>
    <input type="submit" value="SUBMIT">
  </p>
</form>

13   名前: 匿名 : 2007/05/12(土) 23:11  ID:BD0Er6nW sub-Cz
うわ、またやっちまった。

>>12
> rs = label = null;

38 行目のこれ、テスト時の名残だから不要。たびたびごめんなさい。

14   名前: たかし : 2007/05/12(土) 23:11  ID:V9BIPw9J sub-Nn
匿名さま、お返事が遅くなりました。
教えていただいたoptgourp要素は最初に考えたのですが項目数が今現在で90以上あり更に追加したい項目もありますもので
連動させて選択させれたらとコチラにやってきました。
匿名さまが言われた
>1 つはサーバ側のデータ処理の見直しですが、今は考えません。
はすごく気になりますが・・・

匿名さま、今回の件は本当に勉強させていただきありがとうございました。
また、私みたいな右も左も解らないような初心者相手に親身になって回答していただき本当に嬉しいです。
お忙しいとは思いますがまた良い案などがあればご教授お願いします。


一覧へ戻る