자바리안
198
2019-02-21 15:28:35
4
801

prototype 형태의 javascript 에서 opener 객체 참조


안녕하세요. 웹개발을 오래해왔지만 항상 느끼는 것이 자바스크립트는 너무 어렵다 입니다.

이번에도 개발을 하면서 나름 다른 방식으로 개발을 하다보니 여러 어려움에 부딪히고 있습니다.

많은 고수 개발자님의 도움이 절실합니다.

다름이 아니라 제가 자바스크립트를 다음과 같은 형태로 개발을 하고 있습니다.

document.ready = function(){ 

Test.St.init();

};

var Test = Test || {};

var St = function(){

  this.a  = '이 화면의 전역변수 입니다.'; 

};

St.prototype = {

  init : function(){

    this.a_method();

  },

  a_method : function(){

    this.a  = '여기서 전역변수 값을 변경했습니다.';

    console.log(this.a);

  }

};

Test.St = new St();


머 이런 형태로 사용을 하고 있습니다.

다른건 문제가 없는데 팝업을 띄우고 나서 opener 의 객체 참조를 하는 부분이 막히고 있습니다.

예를 들어 전역변수로 선언해놓은 a 라는 변수에 값을 팝업에서 세팅한다던지 아니면 값을 가져오는 부분이 잘 안되고 있습니다. 위 처럼 하면 먼저 a 라는 변수 값이 a_method 로 인해 변경되어있는 상태인데 팝을 띄우고 opener.Test.St.a 라고 하면  초기 세팅값이 나옵니다.

참조는 하는데 opener.Test.St 로 인해서 초기화가 되는 것 같습니다. 어떻게 해야할지 모르겠습니다. 고수님들의 도움이 절실합니다.

전역변수 선언하는 것도 맞는 건지도 확인 부탁드립니다.

그럼 여러 고수님들의 조언을 기다리겠습니다. 감사합니다.

0
  • 답변 4

  • 유리세계
    3k
    2019-02-21 15:49:41 작성 2019-02-21 15:50:50 수정됨

    흐음 다른 이유가 있는게 아닐까요?

    그냥 콘솔에서 테스트해봤는데 잘 먹히거든요


    document.ready 이 부분이

    $(document).ready(function(){}) 와는 다른거라서 실행이 안되었다거나는요?



  • 자바리안
    198
    2019-02-21 16:04:14 작성 2019-02-21 16:06:11 수정됨

    아 제가 저 부분을 잘못 기재를 한것 같은데 유리세계님이 적은 게 맞습니다. $(document).ready(function(){})  를 제가 잘못 적었네요. ^^;

    팝업창을 띄우고 참조를 해도 변경되지 않고 보인단 말씀인가요?

    팝업창에서 부모창의 전역변수를 참조할 때 어떤 형식으로 하셨는지요?

  • 유리세계
    3k
    2019-02-21 16:10:59

    당장 오키에서 크롬 관리자모드 콘솔을 켜서

    document.ready = function(){ 
    	console.log("do!");
    	Test.St.init();
    	console.log("end!");
    };
    var Test = Test || {};
    var obj = new Array();
    var St = function(){
      this.a  = '이 화면의 전역변수 입니다.';
      this.b = "hello";
      obj.push(this.a);
      console.log("hh -> " + this.a)
    };
    St.prototype = {
      init : function(){
        this.a_method();
      },
      a_method : function(){
        this.a  = '여기서 전역변수 값을 변경했습니다.';
        this.c  = "hello2";
        obj.push(this.a);
        console.log(this.a);
      }
    };
    
    Test.St = new St();
    console.log(Test.St);
    document.ready();
    
    console.log(Test.St);
    console.log(obj);
    window.open("about:blank");

    위에처럼 입력하면


    새창이 하나 열립니다


    그럼 그 새창에서 다시 개발자 콘솔을 켜서

    console.log(opener.Test.St);
    console.log(opener.obj);

    를 쳐봤습니다

  • 자바리안
    198
    2019-02-21 17:33:32

    유리세계님 감사합니다. 제가 빼먹은게 있었네요. 공통으로 사용할 목적으로 opener 의 className 을 java 쪽으로 parameter 로 넘긴 후 popup 창에서 해당 className 으로 다시 객체를 생성하여서 참조하는 과정에서 첫번째 참조자를 안넣고 해서 그런 현상이 발생한것 같습니다. 위에서 보면 Test 를 빼먹은거죠. 즉, opener.Test.St 를 하면 제가 변경한 상태의 opener 의 전역변수를 참조할 수 있는데 opener.St 를 하니 초기화된 전역변수를 참조한거였네요.

    생각지도 못한 부분에서 실수를 했네요. 다시 한번 감사합니다~^^ 즐프하세요~

  • 로그인을 하시면 답변 을 등록할 수 있습니다.