문제 현재 프로젝트에서는 프런트 엔드 부분을 "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 컨트롤을 "함께" 사용할 수 있다고 기대하지 마십시오.
행운을 빕니다!