从外部调用jQuery中定义的函数

时间:2010-08-04 05:35:54

标签: javascript jquery

我的aspx页面: -

  <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>

从上页触发的另一个aspx弹出页面

<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 个答案:

答案 0 :(得分:13)

在准备好的文档中声明你的函数:

$(document).ready(function() {

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

});

然后你应该可以从其他文档中调用它:

window.opener.showMessage();

因为它在全局范围内,所以只需调用

即可在主文档中调用它
showMessage();

答案 1 :(得分:3)

据我所知,你想做什么,不能做。那么,我们到底能做什么呢?

我认为最简单的想法是将showMessage移到ready函数之外,然后从内部调用它。

现在,如果它必须在该函数中定义,请将其命名为命名函数:

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

$(document).ready(calledonready);

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

答案 2 :(得分:2)

您可以直接在showMessage()标记下方声明<script>个公开信息。好吧,事实证明这是不好的做法,但它会起作用。

更好的解决方案应该始终是使用您自己的命名空间。声明object可以发生所有应用程序逻辑。

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

稍后在您的代码中,您可以使用

从任何地方访问此对象
MyApp.showMessage();

您可以使用closures扩展该模式。因此,很多聪明人为ecmascript开发了很好的模式。道格拉斯·克罗克福德(Douglas Crockford)就像“Javascript:好的部分”一样好读。

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(半受保护),这个想法甚至可以更进一步,但我想这是另一个故事。