HOME>WEBプログラム覚書>出来ると思ったけど出来なかったJavascriptコード

出来ると思ったけど出来なかったJavascriptコード

「innerText」はFirefoxで利用できないようなので、try~catchで分岐させようと思ったけどダメだった。

Javascriptエラーテスト

サンプルコード

Javascript

  1. onload = function()
  2. {
  3.     // エラーにならない
  4.     try {
  5.         var t = document.getElementById("SampleText").childNodes[0].innerText;
  6.     }
  7.     catch(e) {
  8.         var t = document.getElementById("SampleText").childNodes[1].textContent;
  9.     }
  10.  
  11.     var bt1 = document.getElementById("Alert1");
  12.     bt1.onclick = function() {
  13.         alert(t);
  14.     }
  15.  
  16.     // エラーになる
  17.     try {
  18.         var t2 = document.getElementById("DummySampleText").childNodes[0].innerText;
  19.     }
  20.     catch(e) {
  21.         /* IEがここで死ぬんで回避
  22.         var t2 = document.getElementById("SampleText").childNodes[1].textContent;
  23.         */
  24.         var t2 = "Javascriptテスト";
  25.     }
  26.  
  27.     var bt2 = document.getElementById("Alert2");
  28.     bt2.onclick = function() {
  29.         alert(t2);
  30.     }
  31.  
  32.     // エラーにならない
  33.     try {
  34.         var t3 = document.getElementById("DummySampleText");
  35.     }
  36.     catch(e) {
  37.         var t3 = document.getElementById("SampleText").childNodes[1].textContent;
  38.     }
  39.  
  40.     var bt3 = document.getElementById("Alert3");
  41.     bt3.onclick = function() {
  42.         alert(t3);
  43.     }
  44. }
  45.  
  46.  

HTML

  1. <div id="SampleText">
  2.     <p>Javascript のテスト</p>
  3. </div>
  4. <input type="button" value="ボタン1" id="Alert" />
  5. <input type="button" value="ボタン2" id="Alert2" />
  6. <input type="button" value="ボタン3" id="Alert3" />
  7.  

実行結果

Javascript のテスト

  • オブジェクトの存在しないプロパティ(?)の参照はエラーとならない。
  • 存在しないオブジェクトの参照はエラー。
  • オブジェクトの取得失敗はエラーとならない。

ブラウザ判定による分岐

結局try~catchでは分岐できないので、何がしかの分岐処理を実装する必要がある。

Javascript

  1. if (t == "undefined") {
  2.    var t = document.getElementById("SampleText").childNodes[1].textContent;
  3. }
  4.  

一番簡単だけど、いまいち汎用性に乏しいのでいいブラウザ判定ないかと見てみたら jQueryのブラウザ判定がすっきりしてていい感じだったので採用。

jQueryのブラウザ判定部分を利用したサンプル

Javascript

  1. onload = function()
  2. {
  3.     // jQuery ブラウザ判定部分を拝借
  4.     var userAgent = navigator.userAgent.toLowerCase();
  5.     var browser = {
  6.         version: (userAgent.match( /.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/ ) || [])[1],
  7.         safari: /webkit/.test( userAgent ),
  8.         opera: /opera/.test( userAgent ),
  9.         msie: /msie/.test( userAgent ) &amp;&amp; !/opera/.test( userAgent ),
  10.         mozilla: /mozilla/.test( userAgent ) &amp;&amp; !/(compatible|webkit)/.test( userAgent )
  11.     };
  12.  
  13.     if (browser.msie) {
  14.         var t4 = document.getElementById("SampleText").childNodes[0].innerText;
  15.     } else {
  16.         var t4 = document.getElementById("SampleText").childNodes[1].textContent;
  17.     }
  18.     var bt4 = document.getElementById("Alert4");
  19.     bt4.onclick = function() {
  20.         alert(t4);
  21.     }
  22. }
  23.  

実行結果

勉強のためライブラリを利用しないようにしてたけど、 やっぱり便利だすどす。ってことで今さらながらjQuery使っていきますかねー。

投稿日 2008年6月27日 20:22
カテゴリ JavaScript
タグ jQuery | エラーコード
トラックバック URL http://www.kantenna.com/cgi-bin/mt504/mt-tb.cgi/1129

コメント

自分はブックマークレットしか作れませんが、IEとFirefox両対応にするため研究してました。
最初は単にundefined(=void 0)の検出で済ませました。
Javascript:var S,X=document.body;if((S=X.innerText)===void 0){S=X.textContent;}alert(S);

しかし、毎回エラーもどきを出して調べる手法が気になったので、in演算子を使いました。
Javascript:var S,X=document.body,F='innerText'in X;S=F?X.innerText:X.textContent;alert(S);

当初はブラウザ判別も考えましたが、どこかに「ブラウザ判別に頼るとバージョン違い等でハマるから、個々の使いたい機能の有無を判定し分岐させよ」ということが書かれていて、なるほどと思いました。

コメントする
Name
Email Address
URL