ふたりで

IE대응 자식 창에서 부모 창으로 Object(Data) 넘기기 본문

javascript

IE대응 자식 창에서 부모 창으로 Object(Data) 넘기기

graykang 2020. 3. 12. 18:07
728x90
반응형
SMALL

현재 담당하고 있는 프로젝트에서 이상한 현상이 발생하였다.

Chrom, Firerfox 등에서는 자식 창에서 부모 창의 함수를 호출하면서 Array Object(객체)를 넘겼을 때

자식 창이 닫혀도 부모 창에서 이미 받은 Object를 마음대로 컨트롤할 수 있었다.

그. 런. 데??

IE는??... 이... 슈... 덩... 어... 리...

IE에서는 자식 창을 닫으면 자식 창이 넘긴 Object를 부모 창에서 컨트롤하려고 하면 Error가 발생하며

오동작을 하였다... 단... 자식창을 닫지 않고 열어두면 정상적으로 Object를 참조하며 정상 동작을 

하는 것이었다!!! 

하여 해당 증상에 대해 겁나 구글링 시작...

원인은 IE에만 아니 IE만 Object(객체)를 부모 창의 함수를 호출하며 넘길 시 Object Data 가 전달되는

것이 아닌 자식 창의 해당 Object를 참조만 한다는 것이었다.

하...

해서 아래와 같이 window.opener.postMessage

를 사용하여 해결하였다. 

 

1. 자식 창 script

function addGoodsParent(){ 
    var gridArray = new Array(); 
    gridArray = firstGridSalseTab.getList("selected"); //그리드에서 체크된것만 Array에 담는다.
    if(gridArray != 0){      
       /*IE에서 객체 참조로 형태로 데이터 넘어감으로 인해 부모창으로 
        *Object 넘기는 방식 변경. 
        *opener.parent.setGridDataByCh(gridArray); 
        */ 

      //"*"은 크로스도매인 사용시 Url들어간다 로컬일경우 "*"
        window.opener.postMessage(gridArray, "*"); 
        self.close();     
     }else{ 
     alert("상품을 선택해 주세요."); 
     return; 
     } 
}

2. 부모 창 script

$(function () {
   /*addEventListener:자식창에서 호출되는 meassage event 캐치*/ 
   window.addEventListener('message', function(event) { 
     if(event.srcElement.location.href==window.location.href){ 
         /* 전달받은 event.data 를 가지고 원하는 추가 액션 수행 */ 
        console.log(event.data); 
         childDataArrsy = event.data; 
         var orgList = new Array(); 
         orgList = firstGridSalseDetail.getList(); 
         if(orgList.length != 0){ 
           for(j=0; j<childDataArrsy.length; j++){ 
              var resval = orgList.filter(function(item){ 
                   return item.goodsBcode === childDataArrsy[j].goodsBcode
               }); 
              //console.log(resval); 
              if(resval.length == 0){ 
                 firstGridSalseDetail.appendToList(childDataArrsy[j]); 
               } 
           } 
         }else{ 
            firstGridSalseDetail.appendToList(childDataArrsy); 
         } 
     } 
  }); 
});

원인 파악하고 해결하느라 한 이틀 겁나 눈팅만 한 듯;;;

 

728x90
반응형
LIST
Comments