Developer Connection

Member Login 登录 | 不是会员? 联系 ADC 高级搜索

ADC 首页 > 互联网和 Web > Safari 的常见开发问题

Safari FAQ

苹果在设计Safari时使用的是基于标准的方法,这意味着您可以简单和毫不费力地实现Safari的支持。大部分的开发者都乐于遵循W3C的指导原则,使自己的页面“正好可以运行”,而不必书写专门针对浏览器的HTML代码。Safari除了有您期望的现代浏览器的功能之外,还有一些独到之处。理解这些独到之处,加上一些Safari的开发技巧,就可以确保您的页面完全按照您和您的用户所期望的方式工作。下文中的脚本源码包含在本页面的<head>元素中,使用下文中的宕出 Scripts Bookmarklet 可以看到全部的源码。




Safari 的开发者 FAQ

  1. 如何才能检测Safari和其它Mac浏览器的语言设定?
  2. Safari的用户代理字符串是什么?
  3. Safari支持DHTML吗?
  4. 如何确定访问对象的方法?
  5. 如何避免页面(和cookies)在Safari中被缓存?
  6. 如何用JavaScript测试cookies?
  7. 如何增加一个Favicon(在地址条上的小图标)?
  8. Safari使用什么版本的Java来运行Applet?
  9. 如何确定Java是否存在?
  10. Safari如何处理服务器超时?
  11. Safari支持什么类型的插件?
  12. Safari的插件应该驻留在哪里?
  13. 如何确保我的页面可以在Safari上工作?
  14. Safari可以支持什么CSS元素?
  15. 如何在Safari中调试JavaScript?
  16. 为什么我的弹出式窗口不出现?
  17. Safari支持Live Connect(活连接技术)吗?
  18. Safari支持XMLHttpRequest对象吗?
  19. Safari支持Tool-Tip吗?



1. 如何才能检测 Safari 和其它 Mac 浏览器的语言设定?

Safari,Chimera,和Mozilla都支持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 的用户代理字符串是什么?

完整的 Safari 用户代理字符串是:


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

.其中XX是Safari使用的苹果web技术的版本号,YY是Safari这个应用程序的版本。

如果您需要准确识别访问您的网站的浏览器和客户版本,则请使用字符串中的AppleWebKit/XX部分。AppleWebKit是Safari中内嵌的页面渲染和JavaScript e的引擎,所有的Mac OS X开发者都可以使用,也可以嵌入到其它应用程序中。

请记住,由于Safari使用的渲染引擎在很大程度类似于Netscape,所以Safari的JavaScript引擎会在navigator.appName属性中返回“Netscape”。其它漫游器(Navigator)的值还有:

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

显示您的浏览器的漫游器值。

返回顶部

3. Safari支持DHTML吗?

Safari通过W3C DOM-2来支持DHTML,使用户可以通过JavaScript对页面上几乎所有的元素进行访问。如果您希望进一步学习,请查看苹果的英特网开发者网站上关于如何使用DOM-2的两部分系列:第I部分, 第II部分.

当您需要在脚本中测试DHTML支持时,请检查document.getElementById方法的值,Mozilla,Internet Explorer 5+,和其它现代浏览器都支持这个方法:


	if (document.getElementById)
	{
	 // browser supports W3C DOM
	}

请注意,一些老版本的浏览器通过其它的DOM来支持DHTML。Internet Explorer 4支持的DOM用document.all作为容器对象,而Netscape 4支持的DOM则使用document.layers作为容器对象。如果要测试一个浏览器是否支持这些DOM,可以用下面的代码:


	if (document.getElementById || document.all || document.layers)
	{
	 //browser can handle DHTML
	}

这段代码运行的结果:

返回顶部

4. 如何确定访问对象的方法?

对象检测是测试浏览器能力的最好方法。先前的实例提供了一个对象检测的简单例子:即根据对象是否存在(document.getElementById)来确定脚本的动作。这篇英特网开发者文章给出了对象检测方面的一些其它细节,并说明这种方法为何比根据浏览器的不同进行操作的方法更加灵活和强壮。

返回顶部

5. 如何避免页面(和cookies)在Safari中被缓存?

Safari通过有效地使用内容缓存来获得很多性能的提升。如果您有希望避免被缓存的页面,包括那些写出cookie的内容,则请在生成页面的时候输出下面的页面头部信息:


	// PHP example - include at the top of your pages
	<? php
		header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); // Date in the past
		header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); // always modified
		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
	?>

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?

下面的函数设定一个cookie,并测试是否存在:


	function testCookies() { 
	 var exp = new Date(); 
	 exp.setTime(exp.getTime() + 1800000); 
	 // first write a test cookie 
	 setCookie("cookies", "cookies", exp, false, false, false); 
	 if (document.cookie.indexOf('cookies') != -1) { 
	   alert("Got Cookies!"); 
	 } 
	 else { 
		alert("No Cookies!"); 
	 } 
	 // now delete the test 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来运行Applet?

Safari使用和Mac OS X一起发布的最新版本的Java(Java 1.4.2)。对Java的更新可以通过软件更新程序(software update)周期性地得到,或者从Java技术页面上下载。

返回顶部

9. 如何确定Java是否存在?

Safari支持Java Applet,然而一些用户可能更喜欢关闭Applet的使用。使用navigator变量的javaEnabled()函数可以确定Java功能是否可用。

这里是运行情况:

返回顶部

10. Safari如何处理服务器超时?

如果在60秒内没有接收到HTTP请求的响应,或者服务器数据传输停止60秒以上,Safari就会超时。

返回顶部

11. Safari支持什么类型的插件?

Safari使用Netscape风格的插件。如果需要如何为Safari书写插件的更多信息,请参见苹果关于Mac OS X上浏览器插件的技术说明和Netscape的权威资料插件指南

这里有一个很简单的插件实例,然而您需要从Netscape得到正确的“npapi.h”头文件,并自行编译。

返回顶部

12. Safari的插件应该驻留在哪里?

为了确保一个给定的插件对于所有Safari用户都是可用的 - 包括Web Kit,浏览器插件应该放在'/Library/Internet Plug-Ins/'目录下。

返回顶部

13. 如何确保我的页面可以在Safari上工作?

Safari渲染HTML方式遵循W3规范。您可以通过W3 HTML验证器来验证您的页面是否遵循W3规范。

请确保您的页面中定义了DTD,并且通过验证,这样您的页面就可以被正确显示了。

Valid HTML 4.01!

另外,Bookmarklets或者Favlets是极其有用的工具,可以为您在页面开发过程中提供方便。您可以把下面的连接拖拽到Safari的书签条(Bookmarks Bar),把它存储为一个书签(Bookmark),让它帮助您进行调试。

JavaScript相关
宕出脚本 - 显示一个新窗口,包含当前页面或者与当前页面相连接的所有JavaScript(不支持Framesets)。这个工具用来寻找不支持的DOM调用,如document.all,document.layers,等等...
执行任意脚本 - 显示一个输入对话框,使您可以在当前页面的上下文中执行JavaScript。
布局相关
显示表格 - 在所有的表格,行和列的周围显示边界。这个工具很有用,可以确定您的表格是否外形良好。
显示DIV边界 - 在当前页面的所有DIV元素周围显示边界。
显示DIV边界及其ID - D在当前页面的所有DIV元素周围显示ID和边界。
验证
验证当前页面的HTML - 把当前的URL发送到W3进行HTML验证。URL必须是在防火墙之外可访问的。
验证当前页面的CSS - 把当前的URL发送到W3进行CSS验证。URL必须是在防火墙之外可访问的。
验证当前页面的连接(HREF) - 把当前的URL发送到W3进行连接验证。URL必须是在防火墙之外可访问的。

返回顶部

14. Safari可以支持什么CSS元素?

Safari被设计为可以提供最完整的CSS规格的实现。然而也有一些CSS元素并不可用,或者只有部分实现。如果您的网站使用的CSS似乎不能在Safari上工作,则请查看这个列表来进行检查。

返回顶部

15. 如何在Safari中调试JavaScript?

为了帮助您用Safari来调试网站中JavaScript的交互,Safari提供了“调试”菜单,使您可以把JavaScript的错误记录打开,并输出到控制台上。如果要显示调试菜单,请打开Terminal窗口,键入:

	
	defaults write com.apple.Safari IncludeDebugMenu 1

启动Console程序(/Applications/Utilities/Console),启动Safari,并选中其Debug菜单上的“记录Javascript例外”。

返回顶部

16. 为什么我的弹出式窗口不出现?

Safari实现了一个弹出式窗口的阻断器,以便使弹出窗口的干扰最小化,很多站点用这种窗口来做广告。弹出式窗口将会过滤掉所有的弹出式窗口,除了那些由用户动作触发的以外,比如鼠标点击或者按压键盘。由脚本<script>标识,onLoad处理函数,onUnload h处理函数,或者定时器直接触发的弹出窗口将会被阻断。

在QA时请务必选择“阻断弹出窗口”选项,以保证您的用户在打开这个阻断功能时不会失去某些功能。

返回顶部

17. Safari支持Live Connect(活连接技术)吗?

是的! - Safari 1.2的实现支持了最为普遍的Live Connect技术 - 即支持在同一个页面上的Java Applet和JavaScript之间进行通讯。您可以查看起运行情况,或者下载实例,然后创建您自己的程序。

Safari的实现并不支持Netscape风格的插件和Javascript之间的通讯。

返回顶部

18. Safari支持XMLHttpRequest对象吗?

再次确认:是的! - Safari 1.2的实现遵循Mozilla模型,能够成功运行位于Mozilla.org站点上的Mozilla实例,那些要求DOMParser的除外。放进xmlhttprequest对象的内容通常是XML,然而它可以存放任何类型的文本数据,可以通过DOM调用来引用这些数据,这些DOM调用和访问可见web页面的文档内容的DOM调用一样。

阅读这篇文章可以学到如何使用XMLHttpRequest对象来使web页面和XML数据相连。

返回顶部

19. Safari支持Tool-Tip吗?

当页面元素的‘title’属性被设定时,Safari可以支持该页面元素上面的浮动文本的显示。然而一些浏览器在设定'alt'属性时也可以显示“tool-tip”,创建'alt'属性是为了为那些视觉效果不强的屏幕读取程序提供信息,并且仅用于此目的。您可以把鼠标移动到下面的图像上,察看实际的运行情况。

This space reserved for Screen Reading applications only!

返回顶部


Gray line