2011-01-20 2 views
0

시행 착오를 거쳐 <script> 태그가 포함 된 템플릿 파일에서 템플릿 엔진이 실패합니다. 이것은 분명히 큰 문제이지만, 왜 그것이 실패하고 있는지 알 수는 없습니다.페이지를 렌더링 할 수 없거나 DOMDocumentFragment가 <script> 태그 또는 무언가로 깨졌습니다.

매우 특이한 방식으로 실패합니다. <script> 태그가 주석 처리 된 상태에서 페이지가 정상적으로로드되지만 <script> 태그가 주석 처리되지 않은 상태에서 페이지가로드되고 소스보기을 실행하면 브라우저에 아무 것도 렌더링되지 않더라도 전체 페이지가로드 된 것으로 표시됩니다. 방화범 입력 DOM 검사기는 머리 태그와 빈 몸체를 표시합니다.

낯선 부분 (적어도 나는이 스크립트 태그가 외부 파일을 목표로한다고 생각합니다.) CDATA 섹션 외부에 페이지 내 스크립팅이 있다면 예기치 않은 결과를 이해할 수있었습니다.

사용 된 코드를 게시 하겠지만 매우 길기 때문에 어디에서 시작할 것인지 알 수 없습니다. 사실 문제가있는 경우 문제가있는 곳입니다.

즉, 내 템플릿 엔진은 DOMDocument 개체 하나를 만든 다음 템플릿 부분을 관리하기 위해 DOMDocumentFragment 개체를 만듭니다. 첫 번째 구문 분석 반복은 일반적으로 전체 템플릿 파일을 조각으로로드 한 다음 특정 태그를 찾는 특정 매개 변수를 기반으로 트리 아래로 작업합니다.

TL : DR : PHP DOM 클래스가 스크립트 태그로 인해 페이지를 제대로 만들지 못하는 이유를 알고 있습니까? 내가 <![CDATA[ ... ]]> 태그 안에 그것들을 동봉하면 아무것도하지 않습니다. 태그를 제거하거나 주석 처리 할 때만 브라우저에 이로드됩니다.

+1

최소한의 코드 재생산을 해줄 수 있습니까? –

+0

주전원 도관을 회로 "B"로 다시 연결합니다. 또는 역 위상 조정을 시도하십시오. – Pointy

+0

이것은 문제와 관련이있을지라도 직접 질문에 대답하지 않습니다. 당신은 serverside (PHP)와 clientside (html, css, javascript)가 무엇인지 완전히 명확하지 않은 것 같습니다. 나는 당신이이 문제의 가능한 원인으로 html 소스 전체를 보았음에도 불구하고 PHP를 언급하기 때문에 이것을 말하고있다. 웹 개발자로서의 구별을 이해하는 것은 매우 중요합니다. 그것은 당신에게 끝이없는 혼란을 야기 할 것입니다. 해결책이 나오기 전에 고객 측에서 문제를 찾아야합니다. – goat

답변

2

스크립트 태그의 내용이 CDATA 블록으로 묶여 있습니까? 그렇지 않은 경우 DOM은 내용을 파싱하여 실패합니다. 모든 스크립트 코드가 CDATA 블록으로 래핑되고 DOM 파서가 CDATA 블록을 출력하도록 구성되었는지 확인하십시오. 그렇지 않으면 출력에 빈 스크립트 태그가 포함됩니다.

최대한 스크립트 코드를 가능한 한 퍼팅하고 자체 파일에 배치하여 <script src="/path/to/script.js"></script> 마크 업으로 연결하는 것이 좋습니다. 이렇게하면 DOM 파싱 문제를 피할 수 있으며 브라우저가 코드를 한 번만로드하면되고 이후 페이지 뷰에 캐시를 유지할 수 있다는 추가적인 이점이 있습니다.

+0

** @ Gordon **; 예, 스크립트가 이미 외부화되었습니다. 이것은 'DOM' 객체 구문 분석을 중단 할 스크립트가 없기 때문에 혼란 스럽습니다. 적절한 속성을 가진 빈 스크립트 태그 일뿐입니다. PHP의'DOM' 구현과 XSD에 대해 많은 것을 배웠습니다. – Dan

+0

스크립트 태그를 삭제하거나 주석을 달면 어떻게 될까요? 문서가 올바르게 구문 분석 되는지요? HTML (XHTML)의 XML 직렬화를 사용한다면 DOMDocument 대신 PHP의 XML 구문 분석 라이브러리를 사용해 볼 수도 있습니다. – GordonM

관련 문제