为什么这个脚本不能在Firefox中执行?
我试图运行一个非常简单的浏览器检测脚本,它在Safari和Chrome(在Mac上运行)中执行得很好,但在Firefox中根本不执行。我可以把它归结为最简单的形式,它仍然不会执行:为什么这个脚本不能在Firefox中执行?
<script type="text/javascript">
if (navigator.userAgent.match(/^.*Chrome.*$/)) {break;}
else {
location="howdy.html"
}
</script>
这让我困惑了好几个小时。任何人有想法?谢谢!!
变化location="howdy.html"
到location.href="howdy.html"
并且也停止做浏览器嗅探。在您的JavaScript中进行功能检测以长期制作更强大的应用程序。
是否可以为'window.location'对象指定一个字符串http://is.gd/5o1hh – CMS 2009-12-15 04:22:15
CMS:* please * stop对网址使用is.gd。这是我的状态栏疼痛;) – 2009-12-15 04:34:50
这工作像一个魅力。非常感谢。并适当注意到浏览器嗅探。 – 2009-12-15 04:37:40
这只是一个侧面的问题,但它太大了评论。
看着你的正则表达式,我不得不认为那里有问题。 .*
匹配所有内容,并且由于默认情况下正则表达式为贪婪,所以第一个.*
将匹配整个字符串的其余部分,因此没有机会匹配Chrome
部分并强制失败。有些引擎可能足够明智地理解你的意思,但我仍然将其简化为/Chrome/
。
这是错误的。任何真正使用正则表达式语言的正则表达式引擎(不仅仅是做一些蹩脚的通配符)都会正确匹配。 – McPherrinM 2009-12-15 04:28:12
您在错误的地方使用了break
声明,我相信您会收到语法错误,因为在循环或交换机外部使用break
是非法的。
ECMA-262规格。参考:
12.8 break
声明
语法
BreakStatement
:
break
[无LineTerminator
这里]Identifieropt
;
语义
的程序被认为是语法不正确如果任一下列条件为真:
程序包含
break
声明没有可选Identifier
,这是不嵌套,直接或间接(但不跨越功能界限),在IterationStatement
或SwitchStatement
内。程序包含
break
声明与可选Identifier
,其中Identifier
不会出现在标签中设置一个封闭的(但不跨越函数边界)Statement
。
如果我,我会做这样的
if(!/Chrome/.test(navigator.userAgent))
location.href="howdy.html";
我使用此代码标记错误登录后,我在多个浏览器测试代码。
它为我在IE,Safari,Firefox,Opera,Chrome上测试的浏览器获取浏览器名称和版本。但我把它称为navigator.sayswho,因为这就是 - 导航员说的是。
navigator.sayswho= (function(){
var N= navigator.appName, ua= navigator.userAgent, tem;
var M= ua.match(/(opera|chrome|safari|firefox|msie)\/?\s*(\.?\d+(\.\d+)*)/i);
if(M && (tem= ua.match(/version\/([\.\d]+)/i))!= null) M[2]= tem[1];
M= M? [M[1], M[2]]: [N, navigator.appVersion,'-?'];
return M;
})();
我很惊讶它可以在任何浏览器中运行。 'break'用于循环和开关,而不是'if'语句(无论如何,你想要做什么?)。 https://developer.mozilla.org/En/Core_JavaScript_1.5_Guide/Loop_Statements/Break_Statement – 2009-12-15 04:17:55