本文へジャンプ

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む


お客様が developerWorks に初めてサインインすると、プロフィールが作成されます。プロフィールで選択した情報は公開されますが、いつでもその情報を編集できます。お客様の姓名(非表示設定にしていない限り)とディスプレイ・ネームは、投稿するコンテンツと一緒に表示されます。

送信されたすべての情報は安全です。

  • 閉じる [x]

developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む


送信されたすべての情報は安全です。

  • 閉じる [x]

Web アプリケーションを複数のブラウザーに適応させる

ブラウザーおよびブラウザー設定の違いに対処するためのヒント

Hong Guang (hongg@cn.ibm.com), Software Engineer, IBM, Intel, Microsoft,HP
Guang Hong は、IBM China Development Lab に勤務するソフトウェア・エンジニアです。Eclipse ベースの Web アプリケーションに取り組んでいる彼は、さまざまなブラウザーでの Web アプリケーション採用で豊富な経験を積んでいます。

概要: Web ページの動作は、ブラウザーの種類、あるいはブラウザーの設定によって変わってきます。この記事では、すべての環境で Web アプリケーションの順応性を向上させるために役立つヒントを紹介します。

日付:  2006年 11月 21日
レベル:  中級 この記事の原文:  英語
アクティビティー: 3087 ビュー
お気軽にご意見・ご感想をお寄せください: 


言語設定や JavaScript サポートなど、さまざまな Web ブラウザーの特性によって、Web アプリケーションの動作はブラウザーごとに異なってきます。このようなブラウザー間での不統一性は、アプリケーションの見映えを損ねるだけではなく、アプリケーションが中断する原因になることも珍しくありません。この記事では、これらの問題を解決するためのヒントの数々を紹介します。

各種のブラウザーに対処する

Web ページがどこででも動作するわけではないのは、主にブラウザーの種類によってサポートされる標準が異なるためです。この問題を克服する最善の方法は共通の属性とメソッドだけを使うことですが、それには特殊なコードを作成しなければならない場合もあります。

innerText 属性を実装する

オブジェクトの開始タグと終了タグで囲まれたテキストを設定または取得するにはinnerText 属性を使用しますが、これは Microsoft® Windows® Internet Explorer® でのみ定義されている属性です。この属性は一般的に使用されているものの、標準属性ではありません。代わりに innerHTML を使うこともできますが、innerText と同じというわけにはいきません。innerText 属性は、子ノードのテキストを直接取得するなどの特殊な機能があるため、簡潔なコードを書くのに役立ちます。また、既存のページが innerText を使用している場合もあります。そのような既存のページでより多くのブラウザーをサポートできるようにするには、innerText 属性を自分自身で実装することによって対処します。例えば、Mozilla ベースのブラウザーにこの属性を実装するには、リスト 1 の方法があります。


リスト 1. Mozilla ベースのブラウザー用に innerText を実装する方法
                

HTMLElement.prototype.__defineGetter__ 
(
   "innerText",function()
   //define a getter method to get the value of innerText, 
   //so you can read it now! 
   {
      var textRange = this.ownerDocument.createRange();
      //Using range to retrieve the content of the object
      textRange.selectNodeContents(this);
      //only get the content of the object node
      return textRange.toString();
      // give innerText the value of the node content
   }
);

スクロール値とウィンドウ・サイズを取得する

ほとんどの Web アプリケーションには、ウィンドウ・サイズやスクロールの値など、形状に関する値が必要ですが、ブラウザーはこれらの値を異なる属性に保管している場合があります。属性によっては、名前は同じでも意味が異なるといったこともあります。そのため、独自の変数を作成して属性値を表すほうが有効です。リスト 2 に、ほとんどのメジャーなブラウザーで固有の属性を作成する方法を示します。


リスト 2. 汎用変数を固有の属性として定義して形状の値を表す方法
                

var scrollLeft,scrollTop;
// scrollLeft: The distance between the horizontal scrollbar 
// with the left edge of the frame.
// scrollTop:  The distance between the vertical scrollbar
// with the top edge of the frame. 

// Get the scroll value from different browsers.
// Determine the browser type first. 
// And then get the value from the particular property.		
if (window.pageYOffset){  
	scrollTop = window.pageYOffset 
} else if(document.documentElement && document.documentElement.scrollTop){ 
	scrollTop = document.documentElement.scrollTop; 
} else if(document.body){ 
	scrollTop = document.body.scrollTop; 
} 

if(window.pageXOffset){ 
	scrollLeft=window.pageXOffset 
} else if(document.documentElement && document.documentElement.scrollLeft){ 
	scrollLeft=document.documentElement.scrollLeft; 
} else if(document.body){ 
	scrollLeft=document.body.scrollLeft; 
}


var windowWidth,windowHeight; // frame width & height

if(window.innerWidth){ 
	windowWidth=window.innerWidth; 
} else if(document.documentElement && document.documentElement.clientWidth){ 
	windowWidth=document.documentElement.clientWidth; 
} else if(document.body){ 
	windowWidth=document.body.offsetWidth; 
} 

if(window.innerHeight){ 
	windowHeight=window.innerHeight; 
} else if(document.documentElement && document.documentElement.clientHeight){ 
	windowHeight=document.documentElement.clientHeight; 
} else if(document.body){ 
	windowHeight=document.body.clientHeight; 
}

双方向言語でのウィンドウの原点

アラビア語やヘブライ語などの一部の言語は、右から左の方向で読まれる双方向言語として知られています。現在のブラウザーは、コンテンツを右から左に表示する機能をサポートしています。ただし、ページを右から左に表示する場合、Internet Explorer ではウィンドウに別の原点を定義します。この原点はキャンバスの左隅ではなく、表示部分の左隅に位置します。つまり、ページの一部が負の x 値を持つため、ページの一部の要素が誤った位置に表示されるということです。図1 に、Internet Explorer でページが左から右に表示される場合の原点の位置を示します。


図1. ページが左から右に表示された場合の Internet Explorer 内の原点
ページが左から右に表示された場合の Internet Explorer 内の原点

Internet Explorer でページを右から左に表示する場合には、例えば要素の位置を原点のオフセットで調整するなど、演算を変更しなければならないことに注意してください。

ツリー表示リストを複数行にする

ツリー表示リストを表示するには、<ul> タグと <li> タグを使用します。ですが、Mozilla ベースのブラウザーでは <li> タグ内に別の要素を組み込むことが許可されていないため、単純なリスト項目しか使えません。この問題を解決するには、テーブルを利用してツリー表示リストを作成します。LI の代わりに TABLE を使って項目を実装すると、複合項目を使用できるようになります。

ただし、TABLE に複数の列がある場合には、再び問題に突き当たります。マウスでウィンドウのサイズを変更すると、ページは図2 のように表示されます。


図2. サイズを変更する前のウィンドウで、グリッドを基準に揃えられた列
サイズを変更する前のウィンドウで、グリッドを基準に揃えられた列

図3 に、フレームのサイズを変更するとページがどのようになるかを示します。この場合、列はグリッドに合わせて表示されなくなります。


図3. サイズを変更した後のウィンドウで、グリッドを基準に揃えられていない列
サイズを変更した後のウィンドウで、グリッドを基準に揃えられていない列

ツリー表示のテーブルで TD に幅を割り当てることもできますが、それではあまり上手くいきません。TD の幅はその最大サイズを意味するだけなので、ウィンドウのサイズを変更すると、ブラウザーが表示コンテンツの量を増やすために TD をサイズ変更してしまうからです。整然とした表示を実現するには別の手段、DIV が必要になります (この記事では、DIV、TABLE、TD は DOM ツリー内のノードを表しますが、もちろん HTML タグとして扱うこともできます)。

残念ながら、DIV も同様の問題を引き起こすことにすぐ気付きます。DIV の幅は絶対値ではなく、むしろ最小幅であるためです。ウィンドウのサイズを変更すると、ブラウザーによっては DIV の幅も同じく変更してしまいます。それでは、TD と DIV を組み合わせるという手段はどうでしょう。TD に DIV をネストさせると、セルの最大サイズと最小サイズの両方が定義されることになります。これで、図4 に示すようにサイズは固定されます。


図4. DIV を利用して改善されたページの表示
DIV を利用して改善されたページの表示

複数言語に対処する

アプリケーションが複数の言語をサポートする場合は、同じテキストでも言語によってその長さが変わってくるため、ページの外観を損ねる可能性があることに注意してください。このような状況を改善するには、テキストを含む DIV を調整します。

適切なサイズを DIV に定義する

例えば、DIV を使ってポップアップ・メニューを描くとします。ただし、メニューに固定サイズを指定しないと、ページをスクロールするときに図5 のような問題が起こります。


図5. ページのスクロール・ダウンによってオーバーフローしたテキスト
ページのスクロール・ダウンによってオーバーフローしたテキスト

上記の図を見ておわかりのように、テキストはオーバーフローしています。DIV に固定サイズがない場合、Internet Explorer は自動的に表示部分のサイズを DIV に指定します。そのため、ページをスクロールして表示されていない部分を見ようとすると、DIV のサイズが足りないため、テキストがオーバーフローすることになります。この問題を解決するには、DIV に固定サイズを指定する必要があります。

ここで、サイズの対処方法を見つけ出さなければなりません。複数の言語をサポートする場合、DIV 内のテキスト長は一定ではないことから、サイズをハードコーディングすることは不可能です。テキストの長さを動的に取得してから DIV のサイズを設定しなければなりませんが、ここでテーブルが役に立ちます。テーブルのサイズは、その可視性に依存しないためです。リスト 3 に、DIV に適切な幅を指定する方法を示します。


リスト 3. 含まれるテキストの幅によって DIV の値を設定する方法
                
var leftmenu = document.getElementById("leftmenu");
var divWidth = parseInt(document.getElementById("divtable").offsetWidth);
leftmenu.style.width = divWidth  +"px";


ブラウザーの設定の違いに対応する

問題は、ブラウザーや言語の違いだけでなく、ユーザーに起因することもあります。ユーザーがブラウザーに特殊な設定を行ったために問題が発生することは珍しくありません。例えば、JavaScript 機能を無効に設定すると、アプリケーションに問題を引き起こします。

JavaScript をサポートしないブラウザーをサポートする

ユーザーによっては、まだ古いバージョンのブラウザーを使っていたり、ブラウザーで JavaScript を無効に設定しているために Web ページが正しく表示されないことがあります。この問題に対処するには、<noscript> タグを使用できます。これは単に、このタグにテキストを追加して、ユーザーのブラウザーが JavaScript をサポートしていないこと、そしてページを正しく表示できないことをユーザーに伝えるというだけのことです。リスト 4 に、この場合に使用できるコードを示します。


リスト 4. ページが意図されたように表示されない理由をユーザーに通知する方法
                
<html>
	<head>
	<noscript>
		Your browser does not support JavaScript, 
		or you've disabled the JavaScript in your browser, 
		so you cannot view this page correctly.
	</noscript>
	</head>
</html>

ただし、この問題に対するソリューションとしてこれよりも有効なのは、JavaScript に依存しないバージョンの Web アプリケーションを用意することです。そうすることで、ユーザーが JavaScript サポートを有効にしているかどうかに関わらず、アプリケーションを使用できるようになります。ユーザーを非スクリプト・バージョンに誘導するには、リスト 5 のコードを使用します。


リスト 5. アプリケーションを非スクリプト・バージョンに転換する方法
                
<noscript>
	<meta HTTP-EQUIV="REFRESH" CONTENT="0;URL=noscriptversion.jsp?">
</noscript>


まとめ

この記事では、たくさんのヒントを提供しました。例えば、Mozilla ベースのブラウザーで innerText 属性を実装する方法、形状の値を表す変数を使用してすべてのブラウザーが値を使用できるようにする方法、そして Internet Explorer でページを右から左に表示する際に原点のオフセットによって要素の位置を調整する方法などです。さらに、ツリー表示リストを複数行にする方法、DIV 要素に適切なサイズを設定する方法、JavaScript をサポートしないブラウザーをサポートする方法についても説明しました。これらのヒントが日頃の作業に役立つことを願います。



参考文献

学ぶために

製品や技術を入手するために

議論するために

著者について

Guang Hong は、IBM China Development Lab に勤務するソフトウェア・エンジニアです。Eclipse ベースの Web アプリケーションに取り組んでいる彼は、さまざまなブラウザーでの Web アプリケーション採用で豊富な経験を積んでいます。

不正使用の報告のヘルプ

不正使用の報告

ありがとうございます。 このエントリーは、モデレーターの注目フラグが設定されました。


不正使用の報告のヘルプ

不正使用の報告

不正使用の報告の送信に失敗しました。


developerWorks: サイン・イン


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 利用条件

 


お客様が developerWorks に初めてサインインすると、プロフィールが作成されます。 プロフィールで選択した情報は公開されますが、いつでもその情報を編集できます。 お客様の姓名(非表示設定にしていない限り)とディスプレイ・ネームは、投稿するコンテンツと一緒に表示されます。

表示名をお選びください

developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

(半角英数字で3文字以上31文字以下にする必要があります)


「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 利用条件

 


この記事を評価する

コメント

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Web development, Java technology
ArticleID=237800
ArticleTitle=Web アプリケーションを複数のブラウザーに適応させる
publish-date=11212006
author1-email=hongg@cn.ibm.com
author1-email-cc=htc@us.ibm.com

タグ

Help
このタグで、My developerWorks のすべてのタイプのコンテンツを見つけるために検索フィールドを使用します。

スライダーバーを使用することで、より多く(少なく)タグを表示します。

人気のタグは、この特定のコンテンツ・ゾーン(例えば、Java テクノロジー、Linux や WebSphere など)に対するトップのタグを表示します。

マイ・タグは、この特定のコンテンツ・ゾーン(例えば、Java テクノロジー、Linux や WebSphere など)に対するお客様ご自身のタグを表示します。

このタグで、My developerWorks のすべてのタイプのコンテンツを見つけるために検索フィールドを使用します。人気のタグは、この特定のコンテンツ・ゾーン(例えば、Java テクノロジー、Linux や WebSphere など)に対するトップのタグを表示します。マイ・タグは、この特定のコンテンツ・ゾーン(例えば、Java テクノロジー、Linux や WebSphere など)に対するお客様ご自身のタグを表示します。