2014-01-11 2 views
0

이것은 자바 스크립트 내의 버그입니까? http://jsfiddle.net/SommerEngineering/mr8sZ/인라인 JS, 함수 매개 변수에서 따옴표를 이스케이프 처리하는 방법은 무엇입니까?

<a href='javascript:test("test")'>Works</a><br/> 
<a href='javascript:test("test&quot;")'>Does not work</a> 

그것은 JS 문자열로 전환처럼 보이는 "&quot;을 다시 변환 한 후 다음 물론 잘못된 명령을 실행하려고합니다.

+3

JS와 전혀 관련이 없습니다. HTML 엔티티입니다. – Prinzhorn

답변

6

정확합니다. 당신이 작성한 것은 html이므로 html 엔티티 &quote;은 큰 따옴표 "으로 렌더링 된 다음 JavaScript로 실행됩니다. test("test"");은 유효한 자바 스크립트가 아니므로 오류가 발생합니다. test"을 함수에 전달하려면 다음과 같이 따옴표를 이스케이프합니다. test("test\"");

인라인 JavaScript는 좋은 연습이 아니며 직관적이지 않은 많은 문제가 있습니다. 다음 결과 중 일부를 읽어보십시오. Why is inline JS bad?

다음은 올바르게 수행하는 방법의 예입니다.

var a = document.getElementById('myElem'); 

a.addEventListener('click', function() { 
    test('test"'); 
}); 

요소 참조를 얻는 방법은 여러 가지가 있으며 클래스를 사용하고 루프 내에서 핸들러를 첨부 할 수 있습니다.

+0

그래, 그건 그럴듯 해. :) 고마워! – SommerEngineering

2

이것은 js 버그가 아니며 실제로 html 동작입니다. &quot;은 js 실행 전에 "으로 디코딩 된 HTML 엔터티입니다.

어쨌든 html로 js를 포함시키지 마십시오. 좋은 습관이 아닙니다. 귀하의 사례가 하나의 이유입니다.

2

이것은 버그가 아닙니다. 큰 따옴표는 HTML 속성에 작은 따옴표가 있기 때문에 작동합니다. 그러나, &quot; 엔티티가 HTML로 평가하기 때문에 자바 스크립트 엔진에 전달 된 데이터가된다

javascript:test("test"") 

당신이 따옴표를 탈출하려면

\
javascript:test("test\"") 

를 사용은 따옴표를 이스케이프합니다.

관련 문제