オンクリックイベントを使わずにイベント処理をする方法

このQ&Aのポイント
  • オンクリックイベントを使用せずに、特定の要素をクリックすると表示/非表示を切り替えるイベント処理を実装する方法について説明します。
  • 現在のコードに問題があり、IEで動作しないため、書き直す必要があります。
  • 制約があるため、class属性を使用して特定の要素を選択することが必要です。
回答を見る
  • ベストアンサー

onclickを使わずにイベント処理をする方法について。

onclickを使わずにイベント処理をする方法について。 【<h1>をクリックすると同じ<div>を親に持つ<p>が表示/非表示】 されるようにしたいのですが、IEで動作せず、困っています。 下記は現在のコードです。 -------------------------------------------------------------------------- var divs = document.getElementsByTagName('div'); var listener = function(ev){ if(/(?:^|\s)text(?:$|\s)/.test(ev.target.className)){ var next = ev.target.nextSibling.nextSibling; if(next.style.display != "none"){ next.style.display = "none"; }else{ next.style.removeProperty("display"); } } }; if (document.addEventListener) { document.addEventListener('click', listener, false);// IE以外 } else { document.attachEvent("onclick", listener);// IE } -------------------------------------------------------------------------- <div> <h1 class="text">見出し</h1> <p>本文</p> </div> <div> <h1 class="text">見出し</h1> <p>本文</p> </div> <div> <h1 class="text">見出し</h1> <p>本文</p> </div> -------------------------------------------------------------------------- ev.target.classNameあたりが怪しく… window.event.srcElement.classNameに変更してみましたが動作しませんでした。 html側の制約があり、出来れば上記のようなclassのみのhtmlで、 更にわがままを言うと <div class="text"> <h1>見出し</h1> <p>本文</p> </div> のようにdivにclassを振った形で実現したいです。 なお、現在のコードは複数のサンプルコードを参考に試行錯誤したものですので 不要なコードが混ざっているかもしれません。 動作確認環境はIE7、IE8、Firefox、Safari(Windows)です。 納期が迫り大変困っています。アドバイスを頂けますと嬉しいです。 宜しくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • think49
  • ベストアンサー率59% (285/482)
回答No.11

>> #9 yuu_xさん なるほど…。スタイルシートのルールを書き換えればいいんですね! 質問者さんの動作確認環境はIE7以上だから、兄弟セレクタが使える、と。 (全角空白を半角空白に置換してください) <script type="text/javascript"><!-- (function(){  var styleSheets = this.document.styleSheets;  var lastStyleSheet = styleSheets[styleSheets.length - 1];  try{   lastStyleSheet.insertRule('.text + p { display: none; }', lastStyleSheet.cssRules.length);  } catch(e){   lastStyleSheet.addRule('.text + p', 'display: none;', -1);  } })(); //--></script> stylesheet.insertRule - MDC https://developer.mozilla.org/En/DOM/Stylesheet.insertRule document.styleSheets https://developer.mozilla.org/ja/DOM/document.styleSheets CSSStyleSheet Prototype (style) http://msdn.microsoft.com/en-us/library/dd347054%28v=VS.85%29.aspx addRule Method (styleSheet, CSSStyleSheet Constructor) http://msdn.microsoft.com/ja-jp/library/aa358796%28v=VS.85%29.aspx Javascript cssRules - とみぞーノート http://wiki.bit-hive.com/tomizoo/pg/Javascript%20cssRules # 最後に質問者さんにアドバイス。 質問当初に知らないことがあるのは別にいいんですが、回答をもらってそこかしこにある知らないキーワードをGoogle検索してみたり、MDCの資料に目を通したり、Firebugで検証したり…、といろいろやった方が自分のためになると思います。 それから再質問すれば、質問が具体的になって回答も寄せられやすくなると思いますよ。 実際、私も調べながら回答しています。(このスレッドが立つ前から、ここに書いたことを全部知っていたわけではありません)

agonigiri
質問者

お礼

think49様、ありがとうございます。 仰る通りです。結果を急いでしまいました。 情報不足の中、何度も相談しお手数をおかけしました。 MDCやFirebugという言葉も知りませんでした。。!本当に勉強になります。 期日にも余裕が出たので、ひとつひとつ分からない点をじっくり勉強したいと思います。 今回はこれにて締め切らせていただきます。 有難うございました!

その他の回答 (10)

  • think49
  • ベストアンサー率59% (285/482)
回答No.10

#4,5,7,8 です。 以下、#8の補足より引用。 > 以前のご回答と今回のご回答を両方参考にすれば実現可能でしょうか? ヒントは十分に出ていると思います。

agonigiri
質問者

お礼

了解です!

  • yuu_x
  • ベストアンサー率52% (106/202)
回答No.9

... click が抜けとる。いぁ、しょーもないことで、連投して申し訳ない。 [javascript] /*@cc_on@*/ document./*@if(1)attachEvent('on'+@else@*/addEventListener(/*@end@*/'click', function(ev) { var t = ev./*@if(1)srcElement@else@*/target/*@end@*/; if (t.tagName === 'H1' && /(?:^|\s)text(?:\s|$)/.test(t.parentNode.className)) { while ((t = t.nextSibling) && t.tagName !== 'P'); t && (t.style.display = t.style.display === 'block' ? 'none' : 'block'); } }, false); document.write('\u003Cstyle type="text/css"\u003E.text p{display:none;}\u003C/style\u003E'); [/javascript] > 初期に本文を非表示にしたいのでしたら、JavaScriptで display:none; にするのが賢いと思います。 ん~、、、これね、、、該当要素をぐるぐる回すのも嫌だから、分かりきってる場合は、上でいいよ。 特定クラスに限定するなら、スタイルシートを書き換えるのが筋だけど、結局ぐるぐる回さなきゃならない。しかも判定が面倒。StyleSheet API にも、querySelector がほしい。

agonigiri
質問者

お礼

いえいえ、丁寧に有難うございます。 私の方こそ質問を続けてばかりで申し訳ないです。 document.writeでcssを書く方法もありましたね・・! bodyタグはいじれないし、onloadをどう書くか…でまたはまってしまっていました;;

  • think49
  • ベストアンサー率59% (285/482)
回答No.8

#4,5,7です。 以下、#5の補足より引用。 > 外部cssでdisplay:noneにしてしまうとjavaScriptで上書き出来ないようです。 > yuu_x様の外部css参照を使えば、実現出来るのでしょうか。 #3でyuu_xさんが紹介された getComputedStyle(currentStyle) は #5 のコードでも使われています。 しかし、そんなこととは関係なく、JavaScriptでしか使われない display:none; を外部CSSで指定するのは好ましくないと思います。 以下、いわゆる「アコーディオンメニュー」を実装する場合で「初期に内容を表示したくない」という前提で書きますが。 下記コードを試してみてください。(全角空白を半角空白に置換してください) ------- <style type="text/css"><!-- p {  display: none; } --></style> <script type="text/javascript"><!-- function test(event){  var target = event.target || event.srcElement;  var p = target.parentNode.getElementsByTagName('p').item(0);  p.style.display = (p.style.display === 'none') ? 'block': 'none'; } //--></script> </head> <body> <div> <h1 class="text" onclick="test(event);">見出し</h1> <p>本文</p> </div> ------- これはアコーディオンメニューのサンプルとして、よく見られるコードです。 期待通りに動作してくれているように見えますが、スタイルシート、JavaScriptの両方が有効でないと動きません。 CSSが有効でJavaScriptが無効なブラウザで閲覧したとすると、アコーディオンは正しく働かず、「JavaScriptを有効にしない限りは本文を表示できない」という事態になります。 ですので、初期に本文を非表示にしたいのでしたら、JavaScriptで display:none; にするのが賢いと思います。 ------- <script type="text/javascript"><!-- function test(event){  var target = event.target || event.srcElement;  var p = target.parentNode.getElementsByTagName('p').item(0);  p.style.display = (p.style.display === 'none') ? 'block': 'none'; } function init(event){  var doc = event.target || document;  var text = doc.querySelectorAll('.text'); // for Gecko/Webkit/Opera/IE8 (IE7以下は動作しません)  var p;  for(var i=0,l=text.length; i<l; i++){   p = text[i].parentNode.getElementsByTagName('p').item(0);   p.style.display = 'none';  } } //--></script> </head> <body onload="init(event);"> <div> <h1 class="text" onclick="test(event);">見出し</h1> <p>本文</p> </div> ------- JavaScriptが無効であれば、アコーディオンが働かず、全ての内容が表示されます。 JavaScriptが有効であれば、アコーディオンが働き、初期の本文は非表示になります。

agonigiri
質問者

お礼

think49様更なるご回答ありがとうございます。 >#3でyuu_xさんが紹介された getComputedStyle(currentStyle) は #5 のコードでも使われています。 なるほど!チェック不足でした。 >JavaScriptでしか使われない display:none; を外部CSSで指定するのは好ましくないと思います。 >「JavaScriptを有効にしない限りは本文を表示できない」 はい、特に後者はユーザを限定してしまう点で今回の制作条件からアウトになってしまいます。 h1にonclickをつけずに実装するには、 以前のご回答と今回のご回答を両方参考にすれば実現可能でしょうか?

  • think49
  • ベストアンサー率59% (285/482)
回答No.7

#4,5 です。 「cssTextをreplaceする」って手もありますね。 これなら全てのスタイルを削除しなくてすみますし、実装依存なコードではないので、最悪catchで拾えます。 <script type="text/javascript"> <!-- document./*@cc_on @if(@_jscript_version <= 5.8) attachEvent('on' + @else @*/addEventListener(/*@end @*/ 'click', function(event){  var h1 = event.target || event.srcElement;  var p, style;  if(h1.nodeName !=='H1' || (' '+h1.className+' ').indexOf(' text ') === -1){ return false; }  p = h1.parentNode.getElementsByTagName('p').item(0);  if(p.style.display !== 'none'){   p.style.display = 'none';  } else {   try{ // for Gecko/Webkit/Opera    p.style.removeProperty('display');   } catch(e) { // for IE    p.style.cssText = p.style.cssText.replace(/(^|[ ;])display *: *none(?: *;|$)/i, '$1');   }  } }, false); //--> </script> >> #6 yuu_xさん > IE の場合、属性名 ではなく、プロパティ名を使ってるから、きっとそのせいだろうね。 多分、そうですね…。 自分から書いておいて何ですが、element.style.removeAttribute() はやっぱりお勧めしがたいコードに思えてきました。 問題はIEがWeb標準に準拠し始めているってことだと思います。 例えば、IE9から addEventListener() に対応しますが、同じ流れで「removeAttribute() の対象がプロパティ」というバグ(仕様?)も修正されるかもしれません。 すると、こういう可能性もありえます。 // IE9がやってくる try{  child.style.removeProperty('display'); // IE9は removeProperty() に対応しないので、catchへ } catch(e) {  child.style.removeAttribute('display'); // removeAttribute() の対象が属性ではないので、シンタックスエラー! } IE9が中途半端な実装をしなければ起こりえないことではありますが…。

agonigiri
質問者

お礼

IE9まで考えないといけないなんて… cssだけでなくJavaScriptも…! 生半可な知識でJavaScript書けないですね。後々怖いです。

  • yuu_x
  • ベストアンサー率52% (106/202)
回答No.6

なんてこった。まだあった。 [javascript] while (t && t.nodeType !== 1) t = t.nextSibling; t && (t.style.display = t.style.display === 'block' ? 'none' : 'block'); } [/javascript] ↓ [javascript] while ((t = nextSibling) && t.nodeType !== 1); t && (t.style.display = t.style.display === 'block' ? 'none' : 'block'); } [/javascript] > なぜか element.style.removeAttribute('display') が有効なIEの仕様 IE の場合、属性名 ではなく、プロパティ名を使ってるから、きっとそのせいだろうね。 IE の場合、無理に標準化するより、まったく別に書いたほうが、と思っている今日この頃。 2度同じものを書かなきゃいけないのは手間だけど、欠点はそれくらいで、利点のが大きい気がする。

agonigiri
質問者

お礼

yuu_x様沢山の回答ありがとうございます。 取り急ぎのお礼になりますが、後日全ての回答をもとに勉強させていただきます。

  • think49
  • ベストアンサー率59% (285/482)
回答No.5

#4です。 #4では(いわゆる)クロージャを取り上げましたが、クロージャに各々の要素のデフォルトスタイルを保持するのは難しそうなので、className に保持してみました。 以下、全角空白は半角空白にしてください。 <script type="text/javascript"> <!-- /*@cc_on @if(@_jscript_version <= 5.8) attachEvent('on' + @else @*/addEventListener(/*@end @*/ 'load', function(event){  var doc = event.target || document;  var text = doc.querySelectorAll('.text') || doc.getElementsByClassName('.text'); // IE6を踏まえるなら、この部分は getElemensByTagName() で得るなど適宜修正してください。  var p, defaultDisplay;  for(var i=0,l=text.length; i<l; i++){   p = text[i].parentNode.getElementsByTagName('p').item(0);   defaultDisplay = doc.defaultView ? doc.defaultView.getComputedStyle(p, '').display : p.currentStyle.display;   p.className += ' defaultDisplay_'+defaultDisplay;  } }, false); document./*@cc_on @if(@_jscript_version <= 5.8) attachEvent('on' + @else @*/addEventListener(/*@end @*/ 'click', function(event){  var h1 = event.target || event.srcElement;  var p, className;  if(h1.nodeName !=='H1' || (' '+h1.className+' ').indexOf(' text ') === -1){ return false; }  p = h1.parentNode.getElementsByTagName('p').item(0);  if(className = (' '+p.className+' ').match(/ defaultDisplay_(\w+) /)){   if(p.style.display !== 'none'){    p.style.display = 'none';   } else {    p.style.display = className[1];   }  } }, false); //--> </script>

agonigiri
質問者

お礼

丁寧に有難うございます。組み込んでみたところ、IEで表示/非表示することができました。 感動です!! 記入し忘れていましたが、<p>の内容は初期非表示にしたく、現在試行錯誤中です。 外部cssでdisplay:noneにしてしまうとjavaScriptで上書き出来ないようです。 yuu_x様の外部css参照を使えば、実現出来るのでしょうか。 あと1歩頑張ります。。。 厚かましいですがもしアドバイス頂けましたら嬉しいです。

  • think49
  • ベストアンサー率59% (285/482)
回答No.4

removeProperty() の代替策としては、 ・element.style.cssText=''; や element.removeProperty('display'); で上書きする ・clickを定義する前に、getComputedStyle(IEはcurrentStyle)でデフォルトのスタイルを読み込み、クロージャが保持する変数等に保持しておく ・なぜか element.style.removeAttribute('display') が有効なIEの仕様を利用する (実装依存) 以下、全角空白は半角空白にしてください。 <script type="text/javascript"> <!-- document./*@cc_on @if(@_jscript_version <= 5.8) attachEvent('on' + @else @*/addEventListener(/*@end @*/ 'click', function(event){  var h1 = event.target || event.srcElement;  var doc, child, childs;  if(h1.nodeName !=='H1' || (' '+h1.className+' ').indexOf(' text ') === -1){ return false; }  doc = h1.ownerDocument;  childs = h1.parentNode.childNodes;  for(var i=0,l=childs.length; i<l; i++){   child = childs[i];   if(child.nodeName === 'P'){    if(child.style.display !== 'none'){     child.style.display = 'none';    } else {     try{ // for Gecko/Webkit/Opera      child.style.removeProperty('display');     } catch(e) { // for IE      child.removeAttribute('style'); // ただし、styleが保持する全てのプロパティを全てを削除する //     child.style.cssText = ''; // 同上 //     child.style.removeAttribute('display'); // IEの仕様を利用した実装依存     }    }   }  } }, false); //--> </script> cssRule.cssText - MDC https://developer.mozilla.org/en/DOM/cssRule.cssText getComputedStyle - MDC https://developer.mozilla.org/ja/DOM/window.getComputedStyle currentStyle http://msdn.microsoft.com/ja-jp/library/ms535231%28VS.85%29.aspx 掲示板/スタイルシート質問板/テキストボックスのスタイル初期化 - TAG index Webサイト http://www.tagindex.com/cgi-lib/q3bbs/patio.cgi?mode=view&no=1373

agonigiri
質問者

お礼

回答ありがとうございます。 大変参考になります! クロージャという言葉、初めて聞きました。 JavaScript、奥が深いです。

  • yuu_x
  • ベストアンサー率52% (106/202)
回答No.3

抜けがあった。 [javascript] /*@cc_on@*/ document./*@if(1)attachEvent('on'+@else@*/addEventListener, function(ev) { var t = ev./*@if(1)srcElement@else@*/target/*@end@*/; if (t.tagName === 'H1' && t.parentNode.tagName === 'DIV' && /(?:^|\s)text(?:$|\s)/.test(t.parentNode.className)) { while (t && t.nodeType !== 1) t = t.nextSibling; t && (t.style.display = t.style.display === 'block' ? 'none' : 'block'); } }, false); [/javascript] > onclickを使わずに [CSS] .text > h1 + p { display : none; } .text:hover > h1 + p { display : block; } [/CSS] 結局 IE では、使えないけどね。 ついで。 [javascript] next.style.display === 'block' ? (next.style.display = 'none') : (next.style.display/*@if(1) = ''@else@*/.removeProperty('display')/*@end@*/; [/javascript] # removeProperty をちゃんと使ってるコードを久しぶりに見た気がする。 ちなみに、style プロパティはインラインスタイルを参照するので、外部 CSS の設定を取得する場合は、getComputedStyle(currentStyle)

agonigiri
質問者

お礼

cssで実現出来たら気持ちいいんですが、またIEの壁がありますね。。。;; 外部スタイルの参照、勉強になります!

  • yuu_x
  • ベストアンサー率52% (106/202)
回答No.2

IE は removeProperty 持ってないから、強引に書くしかないんでない。

agonigiri
質問者

お礼

有難うございます!IEで使えないコード、沢山あるのですね。

  • yuu_x
  • ベストアンサー率52% (106/202)
回答No.1

var listener = function(ev){ var t = ev./*@if(1)srcElement@else@*/target/*@end@*/; if (t.tagName === 'H1' && t.parentNode.tagName === 'DIV' && /(?:^|\s)text(?:$|\s)/.test(t.parentNode.className)) { while (t && t.nodeType !== 1) t = t.nextSibling; t && (t.style.display = t.style.display === 'none' ? 'block' : 'none'); } };

agonigiri
質問者

お礼

丁寧な回答ありがとうございます! 現在試行錯誤中です…。解決しましたら、改めてご回答させていただきます。

関連するQ&A

  • onclickを使わずにクリック元を特定したい

    onclickを使えばクリック元の位置を判断することができますが、 onclickばかりが並ぶのはよろしくないとききました。 そこで、イベントリスナーを使うことにしました。 しかし、onclickを使わずに位置を特定することができません。 サンプルではthis.targetで取得できないか試してみましたが t.style.backgroundColorでtの部分でエラーになります。 onclickを使わずにクリック元を特定する方法はないでしょうか。 <div id="id"> <div id="sample129" class="cn"> <div>~</div> <div>~</div> </div> <div id="sample128" class="cn"> <div>~</div> <div>~</div> </div> ~1まで続く~ <div id="sample1" class="cn"> <div>~</div> <div>~</div> </div> </div> <script type="text/javascript"> var dom = document.getElementById('id'); var cds = dom.childNodes; if(cds[1].className=="cn"){ cds[1].addEventListner('click',fg(this.target),false); } function fg(t) { t.style.backgroundColor = "#000000"; var url = "http://test/" + t.id + "/"; window.open(url); } </script>

  • 横並びのカラム内で画像の高さを基準にして合わせたい

    お疲れ様です。 横並びのアルバムについて質問です。columnボックスに見出し<h4>と画像、説明文の<p>が入っています。見出しの文字数と説明文の長さは一定ではないので、column内の要素の位置がそれぞれ違います。 これを画像の頭部分で高さを揃えることはcssだけで実現できるでしょうか。 見出しと説明文どちらかがなければcolumnにinline-blockを指定してあげればよいのですが。 お知恵を貸していただければと思います。 ※画像の大きさは一定です。 <div class="column4"> <div class="column"> <h4>■ダミーテキスト</h4> <div class="image"><img src=".img" alt=""></div> <div class="text"><p>ダミーテキストダミーテキストダミーテキストダミーテキストダミーテキストダミーテキスト</p></div> </div> <div class="column"> <h4>■ダミーテキスト</h4> <div class="image"><img src=".img" alt=""></div> <div class="text"><p>ダミーテキストダミーテキストダミーテキストダミーテキスト</p></div> </div> <div class="column"> <h4>■ダミーテキスト</h4> <div class="image"><img src=".img" alt=""></div> <div class="text"><p>ダミーテキストダミーテキストダミーテキストダミーテキスト</p></div> </div> <div class="column"> <h4>■ダミーテキストダミーテキストダミーテキストダミーテキストダミーテキストダミーテキストダミーテキストダミーテキスト</h4> <div class="image"><img src=".img" alt=""></div> <div class="text"><p>ダミーテキスト</p></div> </div> </div>

    • ベストアンサー
    • CSS
  • javascriptの記述について

    私は最近javascriptの勉強を始めたプログラム初心者です。 下記のjavascriptについてお聞きしたいです。 css *{ line-height: 1.5em; } #wrapper{ width: 380px; margin: 16px; } h1{ font-size: 20px; border: solid 2px orange; padding: 2px 4px; margin: 1em 0 0.5em 0; } h2{ background: lightblue; padding: 2px 4px; font-size: 12px; margin: 1em 0 0.5em 0; } p{ font-size: 12px; } .close{ display: none; } .open{}; <script type="text/javascript"> window.addEventListener( 'load', function(event){ var elem = document.getElementById('lnk_closeAll'); elem.addEventListener('click', closeAll, false); var elem = document.getElementById('lnk_openAll'); elem.addEventListener('click', openAll , false); //全見出しに設定 setEventToTitles(); } , false); //開閉関数 function openAll(event){ event.preventDefault(); changeAll(false); } function closeAll(event){ event.preventDefault(); changeAll(true); } //trueならすべて閉じる、falseならすべて展開 function changeAll(close){ var titles = document.getElementsByTagName('h2'); for(var i=0; i<titles.length; i++){ var parent = titles[i].parentNode; var topics = parent.getElementsByTagName('div'); for(var j=0; j<topics.length; j++){ if(close){ topics[0].className = 'close'; } else { topics[0].className = 'open'; } } } } //状態を反転する function setEventToTitles(){ var titles = document.getElementsByTagName('h2'); for(var i=0; i<titles.length; i++){ titles[i].addEventListener('click', toggleTopic, false); } } function toggleTopic(event){ var title = event.currentTarget; var parent = title.parentNode; var topics = parent.getElementsByTagName('div'); if(topics[0].className == 'close'){ topics[0].className = 'open'; } else { topics[0].className = 'close'; } } </script> </head> <body> <div id="wrapper"> <h1>よくある質問と回答</h1> <p> <a id="lnk_closeAll" href="#">すべて閉じる</a> <a id="lnk_openAll" href="#">すべて展開</a> </p> <div id="topic1"> <h2>電源ランプが赤く光り、しばらくすると製品が動かなくなります</h2> <div class="close"> <p>電源ランプが赤く光るのは内蔵バッテリーが消耗していることを示しています。 コンセントを接続して充電してください。</p> </div> </div> <div id="topic2"> <h2>ときどきブザーが鳴りますが、問題ないでしょうか?</h2> <div class="open"> <p>本製品の長時間利用により低温やけどを負うことがあります。 長時間使い続けていることをユーザーに伝えるため、 4時間15分32秒ごとにピッピッという警告音を鳴らすようにしております。</p> </div> </div> <div id="topic3"> <h2>製品を床に落としてしまいました。問題ないでしょうか?</h2> <div class="open"> <p>本製品は高さ1メートルからの落下テスト10万回をパスしております。 ただし、1メートル以上の高さから落下した場合は、 故障する可能性がありますので、お近くのサービスセンターにご相談ください。</p> </div> </div> </div> このプログラムは画像のようにすべて閉じるを押すと説明文が閉じ、 すべて開くを押すと説明文がすべて開きます。 わからない箇所は、 if(topics[0].className == 'close'){ topics[0].className = 'open'; } else { topics[0].className = 'close'; 箇所でどうしてtopics[i]ではなくtopics[0]なのでしょうか。 参考書には「NodeListオブジェクトとして返されますが、必要なのは最初の1つだけなので[0]で先頭要素にアクセスし classNameプロパティに[close]か[open]を設定する」と記載されています。 ですが、なぜ必要なのは最初の1つだけなのでしょうか? カウンタiを一つづつふやし、一つ筒divに[close]か[open]を設定しないのでしょうか。 試しにtopics[i]にすると動きません。。。 topics[0]だと動くのに。。。

  • createElementが一瞬で消えてしまいます

    <script type="text/javascript"> <!-- function check(){ if(document.loginform.user.value==""){ var element1=document.createElement("span"); element1.innerHTML="Usernameを入力してください。"; element1.className="error0"; var ojbody1=document.getElementById("titlerror1"); ojbody1.appendChild(element1); false; } if(document.loginform.pass.value==""){ var element2=document.createElement("span"); element2.innerHTML="Passwordを入力してください。"; element2.className="error0"; var ojbody2=document.getElementById("titlerror2"); / ojbody2.appendChild(element2); false; } } // --> </script> <title>ログインページ</title> </head> <body> <div id="error"><font color="red"><?=$error?></font></div> <div id="loginform"> <form id="loginform" name="loginform" action="index.php" method="post"> <fieldset> <p> <div class="titlerror" id="titlerror1"> <label for="user">User Name <span class="hankaku">(半角英数字)</span></label><br /> </div> <input type="text" name="user" value="" id="user" text-align="middle"> </p> <p> <div class="titlerror" id="titlerror2"> <label for="pass">Password <span class="hankaku">(半角英数字)</span></label><br /> </div> <input type="password" name="pass" value="" id="pass" > </p> <div id="submit"> <p class="submit"> <button type="submit" name="login" value="login" class="button" id="login" onclick="check()"><img src="submit.png" border="0" alt="login" /></button> </p> </div> </fieldset> </form> </div> </body> javascript初心者です。 これを実行するとつくられたタグが一瞬だけ表示して消えてしまいます。(CSSを付けると) 上記は表示すらしません。 どこが間違っているか、なぜそうなのかを教えていただけると助かります。 お願いします。

  • jsで次のELEMENT_NODEを見つけたい

    しごく単純な質問かもしれませんが、検索エンジン等で捜しても見つからなかったのでご教授頂けないでしょうか?(検索の仕方が悪いかもしれません。。。) たとえば以下の簡単なjavascriptがあるとします。 <body> <div id="test1">hogehogehoge</div> <div>fugafugafuga</div> <script type="text/javascript"> var obj = document.getElementById('test1'); console.log(obj.nextSibling); </script> </body> この場合、nextSiblingで取得した値は次のテキストノードになってしまいます。 決めうちであれば以下のようにやってみたらうまくいきましたが、 なんだかなぁ~って感じです。 <script type="text/javascript"> var obj = document.getElementById('test1'); console.log(obj.nextSibling.nextSibling); </script> jQueryで言うところのsiblings()のような使い方、またはソースをご教授いただけないでしょうか?(できれば説明文も添えて頂ければ助かります) 一応jQueryのソースを読もうとしましたが、まことに恥ずかしいのですが力不足でまるで読むことができませんでした。 以上よろしくお願いいたします。

  • javascriptにフェードインを追加したい。

    下記のjavascriptに、フェードイン効果を追加するにはどうすればいいでしょうか? 現在は、クリックで、テキストが切り替わる仕様になっているんですが、これにフェードイン、フェードアウトの機能を付け加えたいです。 また、切り替わった際に下記のようにCSSの.actveをclass=""に追加させたいのですが、 どうすれば可能でしょうか? 目的は、アクティブになったボタンの背景を変更したい為です。 <div class="button actve"><a href="#" onclick="checkd1();return ChDsp2('text1','textALL');">ボタン1</a></div> 【javascript】 function ChDsp2(strShow,classHidden){ var tags=document.getElementsByTagName("div"); for(var i=0;i<tags.length;i++){ if(tags[i].className.match('textALL')){ tags[i].className=tags[i].className.replace(/hide/,"").replace(/^\s+|\s+$/,""); if(tags[i]!=document.getElementById(strShow)) tags[i].className+=' hide'; } } return false; } function checkd1(){ document.FORM.CHECK1.checked=true document.FORM.CHECK2.checked=false document.FORM.CHECK3.checked=false } function checkd2(){ document.FORM.CHECK1.checked=false document.FORM.CHECK2.checked=true document.FORM.CHECK3.checked=false } function checkd3(){ document.FORM.CHECK1.checked=false document.FORM.CHECK2.checked=false document.FORM.CHECK3.checked=true } function change(c) { var f = c.checked, btn = c.form.elements['btn1']; btn.disabled = f?false:true; f = f?'sozai/button_2.jpg':'sozai/button_1.jpg'; btn.style.backgroundImage = 'url(' + f + ')'; } 【HTML】 <div class="button"><a href="#" onclick="checkd1();return ChDsp2('text1','textALL');">ボタン1</a></div> <div class="button"><a href="#" onclick="checkd2();return ChDsp2('text2','textALL');">ボタン2</a></div> <div class="button"><a href="#" onclick="checkd3();return ChDsp2('text3','textALL');">ボタン3</a></div> <div class="clear">&nbsp;</div> <div class="area"> <form name="FORM"> <div id="text1" class="textALL"> その1、ここは最初に表示されています。 </div> <div id="text2" class="textALL hide"> その2、ここはボタン2をクリックで表示されます。 </div> <div id="text3" class="textALL hide"> その2、ここはボタン3をクリックで表示されます。 </div> </form> </div> 上記は、以前頂いたプログラムをわかる範囲で改造したものなのですが、 限界を感じまして、どなたか教えて頂けたら助かります。 宜しくお願いします。

  • <h1>、<h2>と<p><div>の行間を狭くする方法

    お世話になります。 ホームページを作成する場合、見出し<h1>または<h2>の下に<p><div>で本文を記述すると、見出しと本文の間が空いてしまいます。 この間を狭く調整する方法を探しています。 よろしくお願いします。

  • slideToggleを複数のボタンで適用したい

    jQueryのslideToggleについての質問です。 以下のようなコードがあるとします。 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title>jQuery show/hide</title> <script type="text/javascript" src="../../jQuery/jquery.js"></script> <script type="text/javascript"> $(document).ready(function() { $('div.demo-show:eq(0)> div').hide(); $('div.demo-show:eq(0)> h3').click(function() { $(this).next().slideToggle('fast'); }); }); </script> </head> <body> <div class="demo-show"> <h3>「見出し1」</h3> <div>見出し1のコンテンツ...……<div class="class-name">コンテンツを閉じる</div></div> </div> </body> </html> 「見出し1」をクリックすると見出し1のコンテンツが表示されます。 もう一度「見出し1」をクリックすると見出し1のコンテンツが隠されます。 ・見出し1のコンテンツが表示されている状態で、「見出し1」をクリックする ・見出し1のコンテンツが表示されている状態で、「コンテンツを閉じる」をクリックする の2通りの場合で見出し1のコンテンツが隠されるようにしたいのですが、jqueryをどのように書き替えたらいいのでしょうか。 よろしくお願いします。

  • 下記のスクリプトを高速にする具体的な方法

    下記のスクリプトを高速にする具体的な方法 現在、特定のクラスを表示、非表示にしたいと 考えております。 下記のスクリプトだとIEでの動作が遅いので改善方法を模索しております。 どなたかご教授ください。 宜しくお願いいたします。 <script type="text/javascript"> var ids = new Array(); ids = ['default','aaa','bbb']; function change(site){ if(!document.getElementsByTagName){return;} var objs = document.getElementsByTagName('*'); var check = ids.join('|'); var re = new RegExp('(?:^|\\s)'+site+'(?:$|\\s)'); for(var i=0; i<objs.length; i++){ var obj = objs.item(i); if(re.test(obj.className)){ obj.style.display = ''; }else{ if(obj.className){ if(obj.className.match(check)){ obj.style.display = 'none'; }else{ obj.style.display = ''; } } } } } </script> <html> <select name="site_change" id="site_change" onchange="change(this.value)"> <option value="default">デフォルト</option> <option value="aaa">aaa</option> <option value="bbb">bbb</option> </select> <div class="aaa bbb">aaa bbb</div> <div class="aaa">aaa</div> </html>

  • JavascriptでInputClassの表示を変えるには

     以下のScriptを作りました。Tagの表示情報をScriptで変更したいのです。以下のdiv class="inC1"は変更されます。input class="inIPC2も変更したいのですが、どうもやり方が異なるようです。  申し訳ありませんがご教授願います。 <html> <head> <title>エレメントの表示</title> </head> <body> <script type="text/javascript"> function Disp_change() { var i = 0, div = document.getElementsByTagName("DIV"); while (div[i]) { if (div[i].className=="inC1") div[i].innerHTML = "change1"; i++; } } function Disp_change_Class() { var i = 0, div = document.getElementsByTagName("DIV"); while (div[i]) { if (div[i].className=="inIPC2") div[i].innerHTML = "change2"; i++; alert ("change2"); } } </script> <body> <div class="frameHead frameDetail"> <div class="inC1">連絡情報</div> <div class="clear"><hr /></div> <div class="inC2"> <input class="button3" type="button" name="fromUserList" value="" onclick="Disp_change()"> <input class="inIPC2">連絡情報</div> </div> <script type="text/javascript"> Disp_change(); Disp_change_Class(); }; </script> </script> </body> </html>  一応動きますので確認してみてくだされば幸いです。 以上、宜しく御願い致します。

    • ベストアンサー
    • Java

専門家に質問してみよう