2009-12-15 11 views
0

아주 간단한 브라우저 탐지 스크립트를 실행하려고하는데 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 –

답변

4

변경 location="howdy.html"

location.href="howdy.html"에 또한, 브라우저 스니핑을하고 중지합니다. 자바 스크립트에서 기능 감지를 수행하여 장기간에 더 강력한 애플리케이션을 만들 수 있습니다.

+2

'window.location' 객체에 문자열을 할당하는 것은 유효합니다. http://is.gd/5o1hh – CMS

+0

CMS : * please * stop url에 is.gd를 사용합니다. 내 상태 표시 줄에 아프다.) –

+0

이것은 매력처럼 작동했습니다. 정말 고맙습니다. 브라우저 스니핑에 대해 정식으로 언급했습니다. –

0

이것은 측면 문제 일뿐 댓글에 너무 큽니다.

정규식을 보면, 저기에 뭔가 잘못되었다고 생각합니다. .*모든 내용이이고 정규 표현식은 기본적으로 greedy이므로 첫 번째 .*은 나머지 문자열 전체에서 일치하므로 Chrome 부분과 일치 할 수없고 오류가 발생합니다. 일부 엔진은 당신이 의미하는 바를 충분히 똑똑하게 이해할 수 있지만 여전히 단순화하여 /Chrome/으로 단순화합니다.

+0

그게 잘못입니다. 실제로 정규 표현식 언어 인 정규식 엔진 (일종의 절름발이 일뿐 아니라)은 정확하게 일치합니다. – McPherrinM

1

break을 루프 또는 스위치 외부에서 사용하는 것은 불법이므로 잘못된 장소에서 break 문을 사용하고 있습니다. 구문 오류가 발생합니다.

ECMA-262 사양. 참조 :

12.8 break 명세서

구문

BreakStatement :

break[아니오 여기 LineTerminator]Identifieropt;

다음 중 하나에 해당하는 경우 프로그램이 구문 잘못된 간주됩니다

의미 :

  • 이 프로그램은 중첩되지 않는 옵션 Identifier없이 break 문을 포함, 직접 또는 간접적으로 (함수 경계를 넘지 않음) IterationStatement 또는 SwitchStatement 내에 있어야합니다.

  • 이 프로그램은 옵션 Identifier는 바깥 쪽의 레이블 세트에 나타나지 않습니다 Identifier, (그러나 교차 기능 경계) Statementbreak 문이 포함되어 있습니다.

+0

분명히 그렇지 않았습니다. WTF? OP 코드가 구문 오류가 아닌 * 아는 경우 있습니까? –

+0

아니, 어떤 경우인지 모르겠다 ... '중단'**해야합니다 ** 루프 또는 레이블이있는 문 안에 ... – CMS

+0

JFTR, 추가 ES 참조 ... :) – CMS

0

나, 난 내가 여러 브라우저에서 코드를 테스트있을 때 나는 오류에 태그를이 코드를 로그인 한 사용이

if(!/Chrome/.test(navigator.userAgent)) 
    location.href="howdy.html"; 
0

같이 할 것입니다.

IE, Safari, Firefox, Opera, Chrome에서 내가 테스트 한 브라우저의 브라우저 이름과 버전이 표시됩니다. 하지만 네비게이터라고 부릅니다. 네비게이터가 말하는대로 그것이 전부입니다.

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; 
})(); 
관련 문제