2010-08-04 28 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> 

另一个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

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

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

现在,如果真的必须在该函数中定义,使它成为一个命名函数:

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 2010-08-04 05:53:23

+0

如果我移动jquery ui对话框会有什么问题showMessage()离开ready函数吗?如果不是,我没有其他理由保留它。 – IsmailS 2010-08-04 05:58:20

+0

谢谢。移动'showMessage()'出来工作。 – IsmailS 2010-08-04 06:02:38

2

您可以只用把它直接在<script>标签下声明showMessage()公众。那实际上是不好的做法,但它会起作用。

更好的解决方案应该总是使用你自己的命名空间。声明一个object其中可以发生所有应用程序逻辑。

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

在后面的代码,你可以从任何地方访问这个对象与

MyApp.showMessage(); 

您可以通过使用closures把那个模式的延伸。因此,很多聪明的人为ecmascript开发了很好的模式。像往常一样,很好看的是`的JavaScript:好的部分”由Douglas Crockford的

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()',因为我在页面中并没有做很多javascript,但我知道这是问题的最佳答案。 – IsmailS 2010-08-04 06:06:16

11

声明你这样的功能,在文档里面准备。

$(document).ready(function() { 

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

}); 

那么你应该能够从其他文件这样称呼它:

window.opener.showMessage(); 

而且因为它是在全球范围内,你可以通过调用

showMessage(); 
+0

我敢肯定,在这种情况下,我将不得不在window.opener.window.showMessage();'弹出窗口中调用它。 +1虽然。现在它已经搬出来工作,所以不要再修改它,除非有任何问题。非常感谢。 – IsmailS 2010-08-04 09:51:35

+0

您不应该将窗口引用加倍。 window.opener将返回一个对打开当前窗口的引用。 window.opener.window的唯一原因是window元素包含对自身的引用(如窗口)。如果你不相信我,请尝试window.opener.window.window.window.showMessage();) – 2010-08-04 10:25:55

+1

只是想+1,因为它会全球化*'showMessage' *函数。我认为它也可以附加到jquery命名空间'jQuery.fn.showMessage = function(){...}',你可以在准备好之外调用像'jQuery.showMessage()'。 – vol7ron 2011-10-05 18:25:13

相关问题