Apple Developer Connection
高度な検索
Member Login ログイン | ご入会 ADC連絡先

Safari FAQ

アップルは、Safariの設計時に標準に準拠したアプローチを採用しました。つまりSafariをサポートすることは、比較的簡単で手間がかからないということです。ほとんどのデベロッパがW3Cのガイドラインに従うことに賛同してくださっているため、そのページは、ブラウザ固有のHTMLを必要とせずに「そのままで動作」します。Safariは、最新のブラウザで想定される機能と、いくつかの特有の機能を備えています。それらと、いくつかのSafari開発のヒントを理解することで、Webページは皆さんやユーザが期待するとおりに忠実に動作することが保証されます。下記のスクリプトのソースコードは、このページの<head>要素内に含まれています。それらをすべて表示するには、下記のスクリプトダンプのBookmarkletを使用してください。



Safari開発に関するFAQ

  1. Safariや他のMacブラウザの言語設定を調べるにはどうすればよいでしょうか?
  2. Safariのユーザエージェント文字列を教えてください。
  3. SafariはDHTMLをサポートしていますか?
  4. オブジェクトにアクセスするためのメソッドはどのように決めたらよいのでしょうか?
  5. 自分のページ(およびcookies)がSafariにキャッシュされるのを防ぐにはどうすればよいのでしょうか?
  6. JavaScriptを使ってcookiesの有無をテストするにはどうすればよいのでしょうか?
  7. Favicon(アドレスバー上の小さなアイコン)を追加するにはどうすればよいのでしょうか?
  8. Safariがアプレットの実行に使用しているJavaのバージョンを教えてください。
  9. Javaが使用可能かどうかを調べるにはどうすればよいのでしょうか?
  10. Safariはどのようにしてサーバのタイムアウトを処理しているのですか?
  11. Safariがサポートしているプラグインの種類を教えてください。
  12. Safariプラグインはどこに置くべきでしょうか?
  13. 自分のページがSafariで動作することを保証するにはどうすればよいのでしょうか?
  14. SafariでJavaScriptをデバッグするにはどうすればよいのでしょうか?
  15. Safariのバグをレポートするにはどうすればよいのでしょうか?
  16. SafariでサポートされているCSSプロパティを教えてください。
  17. ポップアップウインドウが表示されないのはなぜでしょうか?
  18. SafariはLive Connectをサポートしていますか?
  19. SafariはXMLHttpRequestオブジェクトをサポートしていますか?
  20. Safariはツールチップをサポートしていますか?
  21. SafariはXSLTをサポートしていますか?
  22. RSSフィードがあることをSafariにどのように伝えたらよいのでしょうか?
  23. .NETベースおよびASPXベースのサイトでSafariは動作しますか?
  24. SafariはFrame、Frameset、iFrameをサポートしていますか?
  25. インテルベースのMacintoshで実行するSafariではどのような違いがありますか?


1. Safariや他のMacブラウザの言語設定を調べるにはどうすればよいでしょうか?

GeckoベースのブラウザであるSafariはnavigator.languageプロパティをサポートし、Internet Explorer 5はnavigator.userLanguageをサポートしています。次の関数は、ブラウザのデフォルトの言語をアラートボックスに返します。

	function showLanguage(){
	  var languageinfo = navigator.language ? navigator.language : navigator.userLanguage; 
	  alert ("And the Language is: " + languageinfo); 
	}

この関数の動作を次に示します:

先頭に戻る 

2. Safariのユーザエージェント文字列を教えてください。

PPCプロセッサで動作する完全なSafariユーザエージェント文字列は次の通りです。

	Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-us) AppleWebKit/XX (KHTML, like Gecko) Safari/YY

インテルプロセッサでは次の通りです。

	Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en-us) AppleWebKit/XX (KHTML, like Gecko) Safari/YY

どちらの場合も、"XX"はSafariによって使用されているWebテクノロジーフレームワークのビルドバージョン、"YY"はSafariアプリケーションのビルドバージョンです。

サイトにアクセスしているクライアントの正確なブラウザとバージョンを特定する必要がある場合は、文字列中のAppleWebKit/XXの部分を使用します。Safariに組み込まれているレンダリングおよびjavaスクリプトエンジンであるWebKitは、誰でも利用でき、他のアプリケーションに組み込むことができます。

SafariとWebKitのビルドバージョンの履歴情報のリストに示されているように、どちらのバージョン番号にもマイナーバージョンとサブバージョン番号が含まれていることが考えられます

例:AppleWebKit/125.5.5AppleWebKit/125.3AppleWebKit/125

また、Safariで使用されているレンダリングエンジンはNetscapeと非常によく似た動作をするため、SafariのJavaScriptエンジンはnavigator.appNameを"Netscape"として報告することを覚えておいてください。その他のNavigatorの値は以下のものが含まれます。

navigator.appCodeName = "Mozilla"navigator.appName = "Netscape"
navigator.appVersion = "5.0"navigator.platform = "MacPPC" or "Intel"
navigator.product = "Gecko"navigator.productSub = "20030107"
navigator.vendor = "Apple Computer, Inc." 

JavaScriptオブジェクトの、お使いのブラウザの値を表示してみてください: navigator.

先頭に戻る 

3. SafariはDHTMLをサポートしていますか?

Safariは、JavaScriptを介してページ上のほとんどの要素にアクセスできる、W3C DOM-2を通じてDHTMLをサポートしています。詳細については、アップルインターネットデベロッパ向けの、DOM-2の使用に関する2つのパートからなる記事、Part IおよびPart IIを参照してください。

DHTMLがサポートされているかをスクリプトを使用してテストする場合は、document.getElementByIdメソッドをチェックします。Mozilla、Internet Explorer 5+、その他最新の各種ブラウザもこれをサポートしています。

	if (document.getElementById)
	{
	 // ブラウザはW3C DOMをサポート
	}

古いブラウザは、別のDOMを通じてDHTMLをサポートします。Internet Explorer 4は、document.allをコンテナオブジェクトとして使用するDOMをサポートし、Netscape 4はdocument.layersを使用するDOMをサポートしていました。これらのDOMのいずれかがブラウザで利用可能かどうかをテストするには、次のようなコードを使用するとよいでしょう。

	if (document.getElementById || document.all || document.layers)
	{
	 //ブラウザはDHTMLを処理できる
	}

次のように表示されます:

先頭に戻る 

4. オブジェクトにアクセスするためのメソッドはどのように決めたらよいのでしょうか?

ブラウザの機能をテストするにはオブジェクト検出が最適な方法です。上記の例は、オブジェクト検出の簡単な例であり、オブジェクト(document.getElementById)の有無によってスクリプトのアクションを決めるというものです。このインターネットデベロッパ向けの記事で、オブジェクト検出のさらに詳しい説明と、ブラウザ検出に比べてこのアプローチがいかに柔軟で堅牢であるかを解説しています。

先頭に戻る 

5. 自分のページ(およびcookies)がSafariにキャッシュされるのを防ぐにはどうすればよいのでしょうか?

Safariのパフォーマンスの大部分は、コンテンツのキャッシュを効率よく使用することで達成されています。cookiesを書き出すページも含め、キャッシュされるのを避けたいページがある場合は、ページを提供するときに次のヘッダを確実に記述しておくようにします。

	// PHP の例 - ページの先頭に含める
	<? php
		header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); // 過去の日付
		header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); // 常に変更される
		header("Cache-Control: no-store, no-cache, must-revalidate, max-age=0"); // HTTP/1.1
		header("Cache-Control: post-check=0, pre-check=0", false);
		header("Pragma: no-cache"); // HTTP/1.0
	?>
	// JSP の例 - ページコンテンツを記述する前に呼び出す
	response.setHeader("Cache-Control","no-cache"); // HTTP 1.1
	response.setHeader("Pragma","no-cache"); // HTTP 1.0
	response.setDateHeader ("Expires", 0); // プロキシサーバ上のキャッシュも同様に防ぐ

SafariのBack/Forwardキャッシュ(訪れた人がブラウザの「戻る」ボタンや「進む」ボタンを押した時点から蓄積されるキャッシュ)も、ページにフレームを含めることによって阻止することができます。フレームベースのページは、Back/Forwardキャッシュには保存されず、非フレームベースのページも下に示す不可視のiframeを追加することによって同じように動作します。

	<iframe style="height:0px;width:0px;visibility:hidden" src="about:blank">
		this frame prevents back forward cache
	</iframe>

先頭に戻る 

6. JavaScriptを使ってcookiesの有無をテストするにはどうすればよいのでしょうか?

Safariには、cookieの書き込みを、ユーザが選択した(「ナビゲートした」)ページだけに限定するという旧来からのcookieポリシーが導入されています。このデフォルトの旧来からのポリシーにより、cookiesを書き込もうとするフレームベースのサイトが混乱し、失敗することがあります。何らかのバグが原因でcookiesが書き込まれないと仮定する前に、Safariの環境設定を確認してください。ユーザの設定であることも考えられます。

次の関数は、cookieの設定と、cookieの有無のテストを行います。

	function testCookies() { 
	 var exp = new Date(); 
	 exp.setTime(exp.getTime() + 1800000); 
	 // 最初にテストのcookieを書き込む 
	 setCookie("cookies", "cookies", exp, false, false, false); 
	 if (document.cookie.indexOf('cookies') != -1) { 
	   alert("Got Cookies!"); 
	 } 
	 else { 
		alert("No Cookies!"); 
	 } 
	 // テストのcookieをここで削除 
	  exp = new Date(); 
	  exp.setTime(exp.getTime() - 1800000); 
	  setCookie("cookies", "cookies", exp, false, false, false); 
	 }
	
	function setCookie(name, value, expires, path, domain, secure) { 
	 var curCookie = name + "=" + escape(value) + 
		((expires) ? "; expires=" + expires.toGMTString() : "") + 
		((path) ? "; path=" + path : "") + 
		((domain) ? "; domain=" + domain : "") + 
		((secure) ? "; secure" : ""); 
	 document.cookie = curCookie; 
	}

試してみてください:

先頭に戻る 

7. Favicon(アドレスバー上の小さなアイコン)を追加するにはどうすればよいのでしょうか?

<head>タグ内に次の行を追加すると、サイトにFaviconを追加できます。

	<link rel="icon" href="favicon.ico" type="image/x-icon" />
	<link rel="shortcut icon" href="favicon.ico" type="image/x-icon" />

Faviconの作成方法を学習したい場合は、こちらのチュートリアルに目を通してください。

先頭に戻る 

8. Safariがアプレットの実行に使用しているJavaのバージョンを教えてください。

Safariは、Mac OS Xに含まれている最新バージョンのJavaを使用しています。Javaのアップデートは、「ソフトウェアダウンロード」を通じて定期的に入手するか、またはJavaテクノロジーのページからダウンロードして入手できます。テクニカルノートの「Identifying Java on Mac OS X」に、アプレットを実行している特定のJavaのバージョンを識別する方法が説明されています。

「Javaプラグイン設定」アプリケーション(アプリケーション/ユーティリティ/Java/)を使用すると、Safariでアプレットの実行中にJavaコンソールが表示され、SafariのデフォルトのJVMが選択されます。

先頭に戻る 

9. Javaが使用可能かどうかを調べるにはどうすればよいのでしょうか?

SafariはJavaアプレットをサポートしていますが、ユーザによってはその使用を無効にしたい場合があります。navigator変数のjavaEnabled()関数を使用して、Javaが使用可能かどうかを調べることができます。

この関数の動作を次に示します:

先頭に戻る 

10. Safariはどのようにしてサーバのタイムアウトを処理しているのですか?

Mac OS X 10.3.6以前のシステムでは、Safariは、HTTPリクエストに対するレスポンスを受け取らない場合や、サーバのデータ送信が停止した場合に60秒でタイムアウトとなります。Mac OS X 10.3.6以降では、Safariは、レスポンスのタイムアウト値を1年に設定することで、60秒の制限を事実上削除しています。サーバ側で処理を完了させるには十分な時間でしょう。

先頭に戻る 

11. Safariがサポートしているプラグインの種類を教えてください。

Safariのすべてのバージョンで、Netscapeスタイルのプラグインをサポートしています。Safari 1.3以降では、NetscapeスタイルのプラグインとCocoaプラグインをサポートしています。クロスプラットフォームではありませんが、Cocoaプラグインは簡単に作成でき、お使いのプラグインはCocoaのフレームワークのすべてを活用できます。

Cocoaプラグインの作成に関する詳細については、「Web Kit Plug-In Programming Topic」を参照し、Xcodeに含まれているWeb Kitサンプルのディレクトリにあるサンプルプラグインを試してみてください。

Safari向けのNetscapeスタイルプラグインの作成に関する詳細については、Mac OS X用のブラウザプラグインに関するアップルのテクニカルノート、およびNetscapeの正式な『プラグインガイド』を参照してください。非常にシンプルなサンプルプラグインがありますが、プロジェクトを自身でビルドするには、Netscapeの適切なヘッダファイル「npapi.h」が必要です。

インテルベースのプロセッサへの移行に伴い、デベロッパは、Carbon、Cocoa、またはBSD APIで記述されたプラグインに対して常にUniversal Binariyを作成する必要があります。Universal Binary作成の詳細については、『Universal Binaryプログラミングガイド』を参照してください。

先頭に戻る 

12. Safariプラグインはどこに置くべきでしょうか?

Web Kitなど、用意したプラグインをSafariのすべてのユーザが確実に利用できるように、ブラウザプラグインは「/ライブラリ/Internet Plug-Ins/」ディレクトリに置く必要があります。

先頭に戻る 

13. 自分のページがSafariで動作することを保証するにはどうすればよいのでしょうか?

Safariは、W3仕様に準拠したHTMLをレンダリングします。WebベースのW3 HTML Validatorを通じて、自分のページがW3仕様に準拠しているかどうかを確認できます。この検証プログラムをファイアウォールの内側で実行する場合は、ここに示されている手順に従って確認してください。

ページにDTDを定義し、検証に合格すると、次のように表示されます。

有効なHTML 4.01でした!

さらに、BookmarkletFavletは、ページの作成時にすぐに使えるようにしておくと非常に役に立つツールです。次に示すリンクをSafariのブックマークバーにドラッグしてブックマークとして保存しておくと、デバッグのときに役に立ちます。

JavaScript関連
スクリプトのダンプ - 現在のページにある、または現在のページにリンクしているすべてのJavaScriptを、新しいウインドウに表示します。document.all、document.layersなど、サポートされていないDOM呼び出しを探す場合に使用します。
任意のスクリプトの実行 - 現在のページ内でJavaScriptを実行できる、入力ダイアログを表示します。
レイアウト関連
テーブルの表示 - すべてのテーブル、行、列の周囲に境界線を表示します。これは、テーブルが正しく書式設定されているかどうかを調べる場合に非常に便利です。
DIV境界線の表示 - 現在のページのすべてのDIV要素の周囲に境界線を表示します。
DIV境界線とそのIDの表示 - 現在のページのすべてのDIV要素のIDと周囲の境界線を表示します。
検証
現在のページのHTMLの検証 - 現在のURLをHTML検証のためにW3に送信します。URLはファイアウォールの外側で表示可能でなければなりません。
現在のページのCSSの検証 - 現在のURLをCSS検証のためにW3に送信します。URLはファイアウォールの外側で表示可能でなければなりません。
現在のページのリンク(HREF)の検証 - 現在のURLをリンク検証のためにW3に送信します。URLはファイアウォールの外側で表示可能でなければなりません。

先頭に戻る 

14. SafariでJavaScriptをデバッグするにはどうすればよいのでしょうか?

Safariの「Debug」メニューを使用して、JavaScriptエラーのログを記録できます。「Debug」メニューを表示するには、「ターミナル」ウインドウを開き、次のように入力します。

	
	defaults write com.apple.Safari IncludeDebugMenu 1

Safariを起動し直し、「Debug」メニューの「Log Javascript Exceptions」メニュー項目をチェックします。Safari 1.3以降では、 「Show JavaScript Console」メニュー項目を選択すると、「JavaScript Consol」ウインドウが開いてJavaScript例外が表示されます。バージョン1.3以前のSafariの場合は、JavaScript例外は「コンソール」アプリケーション(/アプリケーション/ユーティリティ/コンソール)に表示されます。

Safari 1.3以降では、JavaScriptでwindow.console.log()を使用することにより、任意の情報を明示的に記録する関数(Objective-CのNSLog()に似た関数)がサポートされます。すべてのメッセージが「JavaScript Console」ウインドウに送られ、JavaScript例外と容易に区別がつくように濃い緑色できれいに表示されます。

	
	if(window.console) {
		window.console.log("I think therefore I code!");
	} 
	else {
		alert("I think therefore I code!");
	}

Safari 1.3以降を使用する場合は、 「JavaScript Console」を開き、ここをクリックして動作を確認してください。

先頭に戻る 

15. Safariのバグをレポートするにはどうすればよいのでしょうか?

Safariのバグを見つけた場合は知らせてください。バグの記録方法に関する基本事項を確認してください。また、バグレポートで最も重要な点は、問題を明確に示す、簡単に再現できる事例であることです。サイトや製品に関係なく再現可能なバグは、修正ははるかに容易です。

SafariでのWebベースアプリケーションやオンラインサービスの動作を保証することを目指しており、どこから始めたらよいか分からない場合は、デベロッパとしてサインアップして、アップルの「safaricertification」までお問い合わせください。

先頭に戻る 

16. SafariでサポートされているCSSプロパティを教えてください。

Safariは、ほぼ完全にCSS仕様を実装するように設計されています。しかし、いくつかのCSSプロパティは使用できず、部分的にしか実装されていないものもあります。Safariで動作しないと思われるCSSをサイトで使用している場合は、サニティチェックとしてこちらのリストを確認してください。

先頭に戻る 

17. ポップアップウインドウが表示されないのはなぜでしょうか?

Safariは、多くのサイトで広告に使用されている、ユーザの集中力の妨げになるようなポップアップウインドウを抑えるために、ポップアップウインドウブロッカーを実装しています。ポップアップブロッカーは、マウスクリックやキー押下など、ユーザのアクションによって開くものを除き、すべてのポップアップを遮断します。<script>タグ、onLoadハンドラ、onUnloadハンドラ、タイマーから直接開くポップアップはブロックされます。

QA時には、「Block Pop-Up Windows(ポップアップウインドウを開かない)」オプションを選択して、ユーザがよく使用するこの機能が実際に使用されたときに、機能性が損なわれないことを確認してください。

先頭に戻る 

18. SafariはLive Connectをサポートしていますか?

サポートしています。- Safari 1.2の実装では、最も要望の高いLive Connect、すなわち、同じページ上でのJavaアプレットとJavaScript間の通信機能をサポートしています。その動作をこちらで確認するか、サンプルをダウンロードして自身で作成してください。

Safariの実装では、Safariバージョン1.3以降において、CocoaおよびNetscapeスタイルのプラグインと、JavaScript間の通信をサポートしています。

Back to Top 

19. SafariはXMLHttpRequestオブジェクトをサポートしていますか?

サポートしています。- Safari 1.2の実装はMozillaのモデルに従っており、DOMParserを必要とするもの以外は、Mozilla.orgにあるMozillaのサンプルを正常に実行します。xmlhttprequestオブジェクトにフェッチされるコンテンツは、たいていはXMLですが、あらゆる種類のテキストデータを含むことができ、表示可能なWebページ上のドキュメントコンテンツと同じDOM呼び出しを通じて参照されます。

XMLHttpRequestオブジェクトを使ってWebページとサーバ上のXMLデータを常時接続しておく方法を学習するには、この記事を参照してください。

先頭に戻る 

20. Safariはツールチップをサポートしていますか?

Safariは、'title'属性が設定されているページ内の要素の上にフローティングテキストを表示する機能をサポートしています。ブラウザによっては、'alt'属性が設定されている場合にこの「ツールチップ」を表示するものもありますが、'alt'属性は、視覚障害を持つ方のための画面読み取りアプリケーションに情報を提供するために作成されており、その目的のためだけに使用されています。下の画像の上にマウスを移動して、この機能の効果を確認してください。

This space reserved for Screen Reading applications only!

先頭に戻る 

21. SafariはXSLTをサポートしていますか?

Safari 1.3以降では、ロード時にXMLページのXSL変換をサポートしています。XSLTのサポートは、XMLページの先頭に埋め込まれた次のXSLページ処理命令に限られています。

	<?xml version="1.0" ?>
	<?xml-stylesheet type="text/xsl" href="your_transform_file_here.xsl" ?>

HTMLページ内の任意のXMLに適用するためにJavaScriptを通じてXSLTを使用することはできません。

先頭に戻る 

22. RSSフィードがあることをSafariにはどのように伝えたらよいのでしょうか?

Safari 2.0以降では、次のリンク要素を通じて、訪れたページやサイトがコンテンツのRSS配信を提供していることをユーザに示します。

<head>
	<link rel="alternate" type="application/rss+xml" title="RSS" href="/main/rss/hotnews/hotnews.rss">
	<link rel="alternate" type="application/rss+xml" title="RSS" href="/main/rss/hotnews/pr.rss">
</head>

Safariのデフォルトの環境設定は、ブックマークに追加されたRSSフィードを30分ごとに確認するように設定されており、条件付きのGETリクエストを使用して、Safari RSSが最後に確認してからフィードが変更されていることを示しているサーバからのみデータを取得できるようになっています。Safariのデフォルトの環境設定では、2週間フィードをキャッシュするように設定されています。

Back to Top 

23. .NETベースおよびASPXベースのサイトでSafariは動作しますか?

もちろんです。Safariは、マルチベンダブラウザ環境を対象にページの運用を行うすべてのWebサーバアーキテクチャをサポートしています。開発環境では、ブラウザに固有のプロダクトの生成につながるような、非標準の機能の使用は避けてください。

不適切な.NET / ASPXサーバ設定は、非互換性の原因になることがあります。たとえば、machine.configファイルには、ブラウザを検出するための<browserCaps>セクションが含まれていますが、この設定がIE以外のブラウザをサポートするようになっていない場合があります。その結果、デベロッパから不適切なサイズや位置の複数行のTextArea (<asp:TextBox></asp:TextBox>)について報告がありました。ASP.netデベロッパの方は、Mozilla/Firefox、Netscape、Opera、Safari、Konquerorに対応している、こちらの更新された<browserCaps>を確認する必要があります。

先頭に戻る 

24. SafariはFrame、Frameset、iFrameをサポートしていますか?

はい。Safariのどのバージョンも<frame>要素、<frameset>要素、<iFrame>要素をサポートしています。

先頭に戻る 

25. インテルベースのMacintoshで実行するSafariではどのような違いがありますか?

通常のWebページデベロッパの観点からは、違いはありません。HTML、CSS、Javaスクリプトを使って作成したWebサイトとWebアプリケーションはうまく動作します。

ブラウザプラグインを使用しているページの場合は、そのプラグインがすべてのMacintoshで動作するように作成されていることを確認してください。ブラウザプラグインはプラットフォームに固有であるため、プロセッサに関係なくすべてのMacintoshで動作させるためには、Universal Binaryとして配布する必要があります。

先頭に戻る 


更新: 2006-02-03