为什么这个脚本不能在Firefox中执行?

问题描述:

我试图运行一个非常简单的浏览器检测脚本,它在Safari和Chrome(在Mac上运行)中执行得很好,但在Firefox中根本不执行。我可以把它归结为最简单的形式,它仍然不会执行:为什么这个脚本不能在Firefox中执行?

<script type="text/javascript"> 
if (navigator.userAgent.match(/^.*Chrome.*$/)) {break;} 
else { 
location="howdy.html" 
} 
</script> 

这让我困惑了好几个小时。任何人有想法?谢谢!!

+1

我很惊讶它可以在任何浏览器中运行。 'break'用于循环和开关,而不是'if'语句(无论如何,你想要做什么?)。 https://developer.mozilla.org/En/Core_JavaScript_1.5_Guide/Loop_Statements/Break_Statement – 2009-12-15 04:17:55

变化location="howdy.html"location.href="howdy.html"

并且也停止做浏览器嗅探。在您的JavaScript中进行功能检测以长期制作更强大的应用程序。

+2

是否可以为'window.location'对象指定一个字符串http://is.gd/5o1hh – CMS 2009-12-15 04:22:15

+0

CMS:* please * stop对网址使用is.gd。这是我的状态栏疼痛;) – 2009-12-15 04:34:50

+0

这工作像一个魅力。非常感谢。并适当注意到浏览器嗅探。 – 2009-12-15 04:37:40

这只是一个侧面的问题,但它太大了评论。

看着你的正则表达式,我不得不认为那里有问题。 .*匹配所有内容,并且由于默认情况下正则表达式为贪婪,所以第一个.*将匹配整个字符串的其余部分,因此没有机会匹配Chrome部分并强制失败。有些引擎可能足够明智地理解你的意思,但我仍然将其简化为/Chrome/

+0

这是错误的。任何真正使用正则表达式语言的正则表达式引擎(不仅仅是做一些蹩脚的通配符)都会正确匹配。 – McPherrinM 2009-12-15 04:28:12

您在错误的地方使用了break声明,我相信您会收到语法错误,因为在循环或交换机外部使用break是非法的。

ECMA-262规格。参考:

12.8 break声明

语法

BreakStatement

break[无LineTerminator这里]Identifieropt;

语义

的程序被认为是语法不正确如果任一下列条件为真:

  • 程序包含break声明没有可选Identifier,这是不嵌套,直接或间接(但不跨越功能界限),在IterationStatementSwitchStatement内。

  • 程序包含break声明与可选Identifier,其中Identifier不会出现在标签中设置一个封闭的(但不跨越函数边界)Statement

+0

显然不是这样。 WTF?有没有你知道OP代码的位置*不是语法错误的情况? – 2009-12-15 04:54:23

+0

不,我不知道任何情况...''break''必须**在一个循环或标记语句中...... – CMS 2009-12-15 05:13:11

+0

JFTR,添加了ES参考... :) – CMS 2009-12-15 06:22:29

如果我,我会做这样的

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; 
})();