dポイントプレゼントキャンペーン実施中!

名字と名前に分けて、selectで比較するものを作りたいです。
名前は無視して「山田」という名字のみを比較する場合、
「あああ」という名字で「太郎」という名前を比較する場合
全部を無視して比較する場合など、で比較したいです。

名字を無視して名前のみを比較するものは使いません。
<dd><p>山田太郎</p></dd>というのを変えずに、
あまりコードを増やさずにやりたくて
htm.match(sn) && sm="指定なし"な感じにやってみたのですが、
上手にできません。この場合どんなものが役立つのでしょうか。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitio
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS" />
<title>サンプル</title>
</head>
<body>
<form action="#">
<fieldset>
<legend>名字</legend>
<select name="m" onchange="aaa(this.form)">
<option value="日本">日本</option>
<option value="山田">山田</option>
<option value="あああ">あああ</option>
<option value="い">い</option>
<option value="う">う</option>
<option value="え">え</option>
</select>
</fieldset>
<fieldset>
<legend>名前</legend>
<select name="n" onchange="aaa(this.form)">
<option value="太郎">太郎</option>
<option value="花子">花子</option>
<option value="ままま">ままま</option>
<option value="みみ">みみ</option>
<option value="む">む</option>
</select>
</fieldset>
</form>
<dl>
<dt>名前</dt>
<dd><p>日本太郎</p></dd>
</dl>
<dl>
<dt>名前</dt>
<dd><p>い花子</p></dd>
</dl>
<dl>
<dt>名前</dt>
<dd><p>山田太郎</p></dd>
</dl>
<script type="text/javascript">
function aaa(f){
var sn = f.n.value;
var sm = f.m.value;
var idID = document.getElementsByTagName('p');
var idLen = idID.length;
for(i=0; i<idLen; i++){
var htm = idID[i].innerHTML;
if(htm==sn+sm || htm.match(sn) && sm="指定なし" || sn="指定なし"){
alert("true");
}else{
alert("false");
}
}
}
</script>
</body>
</html>

A 回答 (2件)

var form = document.forms[0].elements;


var myouji = form['m'];
var namae = form['n'];
var P = document.getElementsByTagName ('p');


function aaa () {
 var cond0 = myouji.value ? new RegExp ('^' + myouji.value) : null;
 var cond1 = namae.value ? new RegExp (namae.value + '$') : null;
 var e, p, t;
 var i = 0;

 while (e = P[i++]) {
  p = e.parentNode.parentNode;
  t = e./*@cc_on @if(1) innerText @else@*/ textContent /*@end@*/;

  if (cond0) {
   if (cond0.test (t)) {
    if (cond1) {
     if (cond1.test (t)) {
      p.style.display = 'block';
     }
     else {
      p.style.display = 'none';
     }
     continue;
    }
    p.style.display = 'block';
   }
   else {
    p.style.display = 'none';
   }
  }
  else {
   p.style.display = 'block';
  }
 }
}

// できるなら、かくしつもんをとじてからにしてほしい
    • good
    • 0
この回答へのお礼

すみません、つい後回しにしてしまって…

正規表現を使うと上手にできるのですね。
スルーしていたのですがサンプルを参考に
この部分もちゃんと勉強したいと思います。
有難うございます。

お礼日時:2011/12/22 23:02

ご質問文を読んでも、どう比較したいのか理解できませんでした。


それなので、ヒントのみになります。(読解力がなくてすみません)


比較部分の
>if(htm==sn+sm || htm.match(sn) && sm="指定なし" || sn="指定なし"){

「sm="指定なし"」や「 sn="指定なし"」の部分はこのままだとエラーになると思われます。
もしこの式が意図通りなのなら、
 「(sm="指定なし")」 や 「(sn="指定なし")」としないと。
でも、常に定数なのでtrueと等価になるし、sm、snの値は2回目以降は置き換えられますが…
あるいは、「==」や「===」の意図ならそのように。

(A || B && C || D )の演算の順序を把握なさっていますか?
曖昧な場合は御確認のうえ、()でくくるなどで思う順にしてください。
https://dev.mozilla.jp/localmdc/localmdc_9970.html
http://ja.wikibooks.org/wiki/JavaScript/%E6%BC%9 …


あと、関係はありませんが、
 f.n.value などは f.elements["n"].value のほうが、安全かも。
 getElementsByTagName('p'); はとても大雑把に見えますが、問題ないのかな…
(ご提示の文書の範囲ではもちろん問題ありませんが…)
    • good
    • 0
この回答へのお礼

指摘して頂いたところをもう一度勉強し直してみます。
有難うございます。

お礼日時:2011/12/22 23:03

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!