2010-08-04 4 views
2

내 aspx 페이지를 정의 호출 : -이 기능은 외부에서 준비 jQuery를 내부

<script src="js/jquery-1.4.2.js" type="text/javascript"></script> 
    <script src="js/jquery-ui-1.8.2.custom.js" type="text/javascript"></script> 

    <script type="text/javascript"> 
    $(document).ready(function() { 
     //lots of other code here.... 
     function showMessage(){ 
     $("#msgDiv").dialog({ 
         modal: true, 
         buttons: { 
            Ok: function() { 
              $(this).dialog('close'); 
             } 
         }, 
         resizable: true, 
         show: "explode", 
         position: "center", 
         closeOnEscape: true, 
         draggable: false 
         }); 
     } 
    }); 
    </script> 

또 다른 영문는

<script type="text/javascript"> 

    window.opener.document.getElementById("msgDiv").innerHTML = <%=MessageToShow%>; //works very well for me. 
    window.opener.document.showMessage(); // I am unable to access it like this? 
    window.close(); 

</script> 

은 기본적으로 내가 전화를 걸려는 위의 페이지에서 트리거되는 페이지를 팝업 showMessage() 팝업 창에서. 두 페이지 모두에서 수행 할 다른 논리가 있습니다.

답변

3

내가 아는 한,하고 싶은 일은 할 수 없습니다. 그럼 우리는 정확히 무엇을 할 수 있습니까?

내가 생각하기에 가장 단순한 생각은 ready 함수 외부에서 showMessage 외부로 이동하여 내부에서 호출하는 것입니다. 당신은 당신의 <script> 태그 바로 아래에 그것을 넣어 showMessage() 공개를 선언 할 수

function calledonready() 
    { 
     /// stuff 
     function showMessage(){ 
     /// stuff 
     } 
    } 

$(document).ready(calledonready); 

window.opener.document.calledonready.showMessage(); 
+0

를 호출하여 주 문서 내에서 호출 할 수 있습니다 이것은 나를 위해 작동하지 않습니다. 비록이'window.opener.window.calledonready'처럼'calledonready'에 접근 할 수 있습니다. 그러나이'window.opener.window.calledonready.showMessage()'와 같이 접근하면'TypeError : Object calledonready 메소드가 없습니다 'showMessage'' – IsmailS

+0

이동하면 jquery UI 대화 상자에 문제가있을 것입니다 준비 기능에서 showMessage()? 그렇지 않다면 나는 그것을 안에 보관할 다른 이유가 없습니다. – IsmailS

+0

감사합니다. 'showMessage()'이동이 효과적입니다. – IsmailS

2

: 그것은 정말 그 함수 내에서 정의해야하는 경우

지금, 그것을 명명 된 기능을 확인하십시오. 글쎄 실제로 나쁜 행동으로 밝혀졌지만 작동 할 것입니다.

더 나은 솔루션은 항상 자신의 네임 스페이스를 사용해야합니다. 모든 응용 프로그램 논리가 발생할 수있는 곳인 object을 선언하십시오.

<script> 
var MyApp = { 
    showMessage: function(){ 
     // do something 
    } 
}; 

나중에 코드에서 당신은 당신은 closures를 사용하여 확장으로 그 패턴을 가져올 수

MyApp.showMessage(); 

와 함께 사방에서이 개체에 액세스 할 수 있습니다. 많은 똑똑한 사람들이 ecmascript을 위해 멋진 패턴을 개발했습니다. 언제나처럼 좋은 읽기`자바 스크립트입니다 : 더글러스 크록 포드에 의해 좋은 부분 "

var MyApp = function(){ 
    var my_private_data = "version 1.0.0", 
     foo    = "bar"; 

    return { 
     getfoo   = function(){ 
      return(foo); 
     }, 
     showMessage  = function(){ 
      // do something 
     } 
    }; 
}; 

var app = MyApp(); 

app.showMessage(); 

이 모든 약 private datanamespacing 귀하의 측면에서 다른 스크립트가 가능하여 closured에서 당신이 잡고있는 날짜를 변경할 수 있습니다 그런 식으로.. . 목적은 생각조차 inheritanceshared data을 (반 보호) 작성하여 훨씬 더 수행 할 수 있지만, 나는 이것이 또 다른 이야기 것 같다

+0

+1 좋은 개념과 모범 사례를 가르치는 데 백만 밀리언 톤을 감사합니다. 내 'showMessage()'를 내 페이지로 옮기고 있지만, 내 페이지에서 자바 스크립트를 많이 사용하지는 않지만이 질문에 대한 최선의 답변이라는 것을 알고있다. – IsmailS

11

준비 문서 내에서 다음과 같이 함수를 선언 :.

$(document).ready(function() { 

    window.showMessage = function() { 
     //... 
    }; 

}); 

그럼 당신은이 같은 다른 문서에서 호출 할 수 있어야한다 :

window.opener.showMessage(); 

를 그리고 글로벌 범위에 있기 때문에, 당신은 단지

showMessage(); 
+0

이 경우 팝업창에서'window.opener.window.showMessage();'로 호출해야 할 것입니다. +1. 이제는 이미 옮겨지고 작동하므로 아무런 문제가없는 한 다시 수정하고 싶지는 않습니다. 매우 감사합니다. – IsmailS

+0

창 참조를 두 번 올릴 필요는 없습니다. window.opener는 현재 윈도우를 연 창에 대한 참조를 반환합니다. window.opener.window가 작동하는 유일한 이유는 window 요소가 자신에 대한 참조 (창)를 포함하기 때문입니다. 만약 당신이 나를 믿지 않는다면, window.opener.window.window.window.showMessage();를 시도해보십시오. –

+1

* showMessage * 기능을 세계화시킬 것이기 때문에 이것을 +1하고 싶을뿐입니다. jquery 네임 스페이스'jQuery.fn.showMessage = function() {...}'에 연결할 수도 있다고 가정합니다.이 파일은 준비가되지 않은 상태에서'jQuery.showMessage() '처럼 호출 할 수 있습니다. – vol7ron

관련 문제