고객의 꿈을 실현하려는 도중에.. (.. 우어~) 자바스크립트로 도배가 되어 있는 웹 화면에서 숨은 프레임을 통해 서버와 통신해서 숨은 프레임이 또 상위 프레임을 제어해야 할 일이 생겼습니다. 양쪽에 모두 코딩을 하자니, 몇가지 전역변수에도 접근을 해야하기에 js를 양쪽에 모두 포함하기도 그렇고.. 여러모로 딱히 대책이 없어서 한참을 고민 끝에 하나 해결책을 만들었습니다. -O-
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
// parent 프레임에서 정의된 자바 스크립트 함수를 가져온다. function getFunctionFromParent(funcname, nargs) { var expplace = parent.document.getElementById('funcexport_allowed'); var proxyname ='_funcproxy_exported_'+ funcname; var fun = parent.document.getElementById(proxyname); if (fun) return fun.onclick; var argspec =''; for (var i = 0; i< nargs; i++) { if (i) argspec +=','; argspec +='arguments['+i+']'; } expplace.innerHTML += ( '<input type="text"id="'+proxyname+'"'+ 'onclick="return'+funcname+'('+argspec+');">'); fun = parent.document.getElementById(proxyname); if (fun) return fun.onclick; else alert("자바스크립트 내부 에러입니다: 함수"+funcname+"이 정의 되지 않았음"); } |
므흐흐.. 빈 구멍에 input 태그를 하나 넣고 거기서 onclick을 통해서 호출을~ 아아.. 깔끔하게 document.getScriptFunction 뭐 이런 것 있으면 참 좋을텐데 말이죠.
음.. 프레임명.함수명(인자); 이렇게 호출하면 호출되는데요..
top.frames[‘framename’].funcname(‘arg’);
단, 변수 접근은 가끔 security에 막히는 일이 있어서..
변수를 공유할 프레임에 function getVar(return eval(‘varname’)); } 따위 함수를 만들어두어 가져와야 하더군요.. 아아.. 가져오는건 되고 set이 안되던가?
어, 위엣분 그건 DOM 표준이 아닌것 같은데요. -ㅁ- M$IE전용 아닌가요..?
흐흐 그런 방법이 있었군요.. 흑흑 괜히 삽질을~
사이트 도메인명에 따라 보안에 막히더군요. 예를 들면, domain.com으로 로딩된 페이지에서 (parent 프레임인)www.domain.com의 주소로 로딩된 페이지에 있는 자바스크립 함수를 불러와도 막힙니다. 사실 둘다 같은 곳으로 매핑되어 있더라도 말이죠.. iframe의 문서에서 문서 크기에 따라 iframe 크기 조절하는거 할때 알아낸 문제점;;
부모 프레임의 것이면 parent.함수명(인자)하시면 됩니다..
아, 파이어폭스에서 테스트하니 top.frames[]가 먹히는군요. -_-; 제가 잘못 알았나 봅니다; 죄송;;
t3RRa// 같은 도메인에서 앞에 www. 라던지 file. 같은것만 다를 때에는 domain을 써서 해결이 가능해요 😉
그나저나 parent.document.getElementById가 파이어폭스에서는 없는 함수라고 나오니 당황…
eval(“function()”) 으로 안되던가..;;;
음.. 한참 옛날얘기긴 하군-
앗.. 헛소리였다.. ㅋㅋㅋ
요렇게 될것 같은데..;;
return eval(“parent.funcname”);
약간 응용… 저렇게 받은 함수에 파라미터 넣기..
var func = eval(“parent.aaa”);
func(“param1″,”param2”);
좀더 응용.. 저렇게 받은 함수를 특정 객체의 이벤트에 할당하기
var fun = eval(“parent.aaa”);
document.onkeydown = function(){ fun(event.keyCode);};
ㅋㅋ 민종형 민간인 되신 기념으로 답글을 달으셨군요! 🙂
사실 parent.funcname(arg) 이런식으로 호출하면 된다더군요;; ㅠ.ㅠ
에고.. 글 잘 읽었습니다.
getElementById 라는 메서드가 따로 있었군요. -_-;;
역시 아는게 힘이네…
MSDN을 아무리 봐도 나중에 아는것만 쓰게 되네요.