2016-12-19 2 views
0

은,이 같은 createElementNS를 사용하여 새로운 요소를 생성 : I 네임 스페이스 번째 인수 접두사 않고 만든 하나 생성 요소 사이의 차이를 이해 할 수접두사가있는 createElementNS와 그렇지 않은 createElementNS의 차이점은 무엇입니까? XHTML과 홈 페이지에 링크 된 JS에서

const NS = 'http://my.site/xmlns'; 
const el1 = document.createElementNS(NS, 'custom'); 
const el2 = document.createElementNS(NS, 'p:custom'); 

그것. 예를 들어, 이러한 CSS 규칙 모두 요소에 동일한 효과가 있습니다 document.getElementsByTagNameNS(NS, 'p:custom')HtmlCollection를 반환하는 반면,

@namespace p url('http://my.site/xmlns'); 
p|custom { background: yellow; } 

다음, document.getElementsByTagNameNS(NS, 'custom')의 통화가 HtmlCollection와 두 요소를 반환를, 무엇을 나에게 이상한 것 같다.

그래서 네임 스페이스 접두어가있는 요소와 그렇지 않은 요소를 만드는 것의 차이점은 무엇입니까?

답변

1

document.createElementNS()에는 정규화 된 태그 이름이 필요합니다. p:custom은 정규화 된 태그 이름이므로 document.createElementNS(NS, 'p:custom')이 더 정확합니다. 나는 이유가 의심되는 이유는 이유가 있기 때문에 document.createElementNS(NS, 'custom') 작품입니다.

document.getElementsByTagNameNS() 다른 한편으로는 두 번째 매개 변수가 로컬 태그 이름이 될 것으로 예상합니다. custom은 로컬 태그 이름입니다. 당신의 요소가 네임 스페이스되기 때문에

(custom 네임 스페이스가없는 경우, 그것은. 또한 자격을 갖춘 이름)과 p:custom이 없기 때문에 자신의 자격을 갖춘 이름은 로컬 이름 custom입니다 p:custom 없다, 그래서 document.getElementsByTagNameNS(NS, 'p:custom') 반환 아무것도 그들의 로컬 이름.

+0

첫 번째 인수에 지정된 네임 스페이스가 문서의 앞부분에 네임 스페이스 접두어로 선언 된 경우 정규화 된 이름 (QName)이 반드시'createElementNS()'의 네임 스페이스 접두사로 정규화 될 필요는 없습니다. https://developer.mozilla.org/en-US/docs/Web/API/Document/createElementNS –

+0

@Scott Marcus : 아, 근데 왜? 명세 나 MDN 모두 명시 적으로 진술되어 있지 않으므로 내가 빠진 것이 있어야합니다. – BoltClock

+0

네, 들리는데요. MDN 페이지는 표현 된 QName없이 사용되고 있지만 동일한 네임 스페이스가 문서에서 이미 선언 된 (접두사가있는) 것으로 표시합니다. 따라서 네임 스페이스를 지정하는 경우 접두어로 이미 선언되었습니다. 사용자가 지정하는 새 요소는 암시 적으로 올바른 QName을가집니다. –

관련 문제