>웹 프론트엔드 >JS 튜토리얼 >EXTJS_extjs에서 ACTIVEX 컨트롤을 사용하여 발생하는 충돌 문제에 대한 해결 방법

EXTJS_extjs에서 ACTIVEX 컨트롤을 사용하여 발생하는 충돌 문제에 대한 해결 방법

WBOY
WBOY원래의
2016-05-16 18:31:031183검색
문제
현재 프로젝트에서는 프런트 엔드 부분을 "One-Page" 개념을 기반으로 EXTJS를 사용하여 완전히 구축했습니다. 기본 컨테이너인 HTML을 제외하면 모두 JS 파일입니다(페이지는 JS 파일로 구현됩니다). 사용자가 페이지를 전환하면 이전 페이지 개체를 삭제한 다음 새 페이지 개체를 만들어 HTML로 표시합니다. 이 아키텍처를 기반으로 보고서 표시를 위한 ActiveX 컨트롤도 도입했습니다. 이 소개에서는 문제가 발생합니다. 보고서 컨트롤이 존재하는 페이지에 액세스하고 사용자가 페이지를 두 번 전환하는 한 IE는 충돌하고(FF에는 이 문제가 없음) 반복된 시도 후에는 작동하지 않습니다.
이유
리소스 방출을 염두에 두고 시스템을 설계했고, 파기 부분을 특별히 처리했으며, ActiveX가 없는 페이지에서는 문제가 없기 때문입니다. 따라서 문제는 IE가 JS에 포함된 ActiveX 컨트롤을 릴리스한다는 것입니다. 결국, HTML, JSP 또는 PHP 페이지로 구축된 기존 프런트 엔드에서는 ActiveX가 페이지에 속하며, 시스템이 연속적인 다시 그리기를 사용하는 동안 페이지가 언로드되면 해당 ActiveX가 삭제됩니다. 점프를 달성하기 위한 HTML 페이지는 시스템이 새로 고쳐지지 않고 언로드가 발생하지 않음을 의미하며 ActiveX는 자연스럽게 파괴되지 않아 브라우저가 중단됩니다.
해결책
이제 원인을 알았으니 해결 방법을 생각해 보겠습니다. IE는 ActiveX 컨트롤을 파괴하는 데 도움을 줄 수 없기 때문입니다. 그냥 스스로 할 수도 있습니다.
코드 복사 코드는 다음과 같습니다.

// @AcitveXObjectID: 검색할 노드 범위는 이 노드에서 삭제할 ActiveX를 검색하는 데 사용됩니다.
//@ContianerID: 삭제할 ActiveX 컨트롤의 ID입니다.
function ActiveXKiller(AcitveXObjectID,ContianerID){
var ce=document.getElementById(ContianerID);
if (ce){
var cce=ce.children
for(var i= 0;iif(cce[i].id==AcitveXObjectID){
ce.removeChild(cce[i])
}
}
}
}

이 방법은 ActiveX 컨트롤을 종료하는 데 사용됩니다. 원리도 간단합니다. Dom에서 주어진 ActiveX ID를 사용하여 주어진 노드 범위(일반적으로 ActiveX 컨트롤의 상위 노드 또는 컨테이너) 내에서 단계별로 검색하고, 발견되면 수동으로 제거하는 것입니다.
이 Killer를 사용하면 충돌을 피하기 위해 페이지를 다시 그리기 전에 ActiveX를 관리할 수 있습니다.
이 외에도 언급해야 할 특별한 상황이 있습니다. 이때 Ext.Window에 ActiveX 컨트롤을 배치합니다. Ext.Window가 닫힐 때 내부의 ActiveX를 파괴하는 데 도움을 주기를 순진하게 원한다면 다음 조건을 충족해야 합니다.
ActiveX의 컨테이너는 Ext.Window 자체여야 합니다.
즉, ActiveX 컨트롤을 Ext.Panel에 넣은 다음 Ext.Window에 넣는 경우입니다. Ext.Window가 닫힐 때 ActiveX 컨트롤을 "함께" 사용할 수 있다고 기대하지 마십시오.
행운을 빕니다!
성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.