Javascript 如何调用$(window)中定义的JQuery函数。从HREF加载

Javascript 如何调用$(window)中定义的JQuery函数。从HREF加载,javascript,jquery,scope,href,Javascript,Jquery,Scope,Href,我喜欢将所有JQuery函数和事件接收器的作用域都限定为$(window)。加载,如下所示: $(window).load(function () { function Foo(id) { alert(String.format("Do Foo for: {0}", id)); } }); <a href="javascript:Foo(27)">Click me!</a> 通常,我在这个范围内完成所有工作,但我有一个案例,我想从一个独立

我喜欢将所有JQuery函数和事件接收器的作用域都限定为$(window)。加载,如下所示:

$(window).load(function ()
{
   function Foo(id)
   {
      alert(String.format("Do Foo for: {0}", id));
   }
});
<a href="javascript:Foo(27)">Click me!</a>
通常,我在这个范围内完成所有工作,但我有一个案例,我想从一个独立JQuery小部件构建的HREF调用Foo(27)。HREF如下所示:

$(window).load(function ()
{
   function Foo(id)
   {
      alert(String.format("Do Foo for: {0}", id));
   }
});
<a href="javascript:Foo(27)">Click me!</a>
下面是构建HREF的jQuery小部件中的一行。标题用于预测,HREF导航到该预测的详细信息页面:

r = String.format('<a href="javascript:App.NavDetails({1});" class="link3">{0}</a>',
   Predikt.General.EncodeHtml(options.rowData.Title), 
   options.rowData.PredictionId);

Foo
函数移到
$(窗口)之外。加载()
函数或将
Foo
绑定到
方法:

$(window).load(function() {
    //...
    function Foo() {
        //...
    }
    //...
    window.Foo = Foo;
});

这将在
窗口
对象中留下对
Foo
的引用,并且由于
窗口
是默认范围,您应该能够在
元素中访问它。

您必须在该范围内工作和具有类似的可访问功能之间进行选择。唯一的其他选择是强制重新加载或将其绑定到锚的单击处理程序

另外,您可能已经更改了原型,但除非您已经更改,否则,
String.format
无法工作。您可能只想为:“+id

function Foo(id) {
  alert("Do Foo for: " + id);
}
$(window).load( ... );

点击我!
...
$(窗口)。加载(函数(){
$(“a.someClass”)。单击(函数(){
警报(“dofoo for:”+$(this.data(“id”));
});
});
您可以这样做

$(window).load(function (){
    window.Foo =  function(n){
      alert(n);
   }
});

还是这个

var Foo;

$(window).load(function (){
    Foo =  function (n){
      alert(n);
   }
});

在我看来,更好的方法是为你的应用程序设置一个名称空间,这样你就不会污染gobal名称空间

window.App = {};

$(window).load(function (){
   App.Foo =  function (n){
      alert(n);
   }
});
然后,在html中,您可以将其称为:

<a href="javascript:App.Foo(27)">Click me!</a>


<>但是,您可能想考虑从脚本调用它,而不是从标记调用。我希望我能以某种方式(比如什么)修饰HREF对Foo的调用,使Foo()可见。我无法将Foo()移动到全局空间,因为$(window).load中有我需要访问的变量和支持函数。因此,我想在构建锚标记时,我只需要将ID存储在expando属性中,然后使用传统的jQuery语法接收click事件。这可以调用Foo()并传入$(This),然后从Foo()我可以查看expando以获取ID。@Armchair:您可以将
Foo
保留在它所在的位置(这样它就可以访问当前范围内的所有内容),然后为它设置一个在外部可见的别名,这是jm方法的一种变体。是的,除非有人单独提出更好的解决方案,否则这就是我正在做的。一般来说,当存在备选方案时,我会尽量避免使用expando属性。在本例中,我希望将ID作为参数传递给Foo()。但由于我不能这样做,我将把ID添加为expando,将共享CSS类添加到锚点,在该CSS类上接收单击事件,然后提取expando ID值。顺便说一句:Re String.format——这已经是我拥有的另一个库的一部分,并且依赖于它,我再也不能编写进行古字符串连接的代码了!:-)带有可替换参数的String.format()是我最喜欢的库功能之一。我对数据属性也有同样的不情愿态度(试图找到一个留在JS中的解决方案),尽管它们很方便。当我对Chrome扩展进行国际化时尤其如此(用
data-i18n=“someString”
替换标记中的所有文本)。您可以使用单独的静态HTML页面,但这很痛苦。至于
String.format
,我喜欢它在许多语言中的本族语,我只是想确保你不是那种对JS抱有同样期望的Java/C人我是一个C#人,大约18个月前开始使用jQuery时,我首先寻找的是高性能版本的String.format()。事实证明有很多很多的实现;有些是针对较短的字符串进行优化的,有些是针对较长的字符串或几十个参数进行优化的。我最终决定做一件万事通但一事无成的事。但我如何从HREF中称之为呢?你是在内联操作,从技术上看,检查我发布的小提琴
,如果
Foo
是全球性的,你根本不需要做
var Foo
。我更喜欢你的第一种方法,因为它更明确。很好!我想我们这里有赢家了!我也更喜欢第一个版本。以前没有使用过jsfiddle.net,所以我最初没有单击您的链接。我以为这是一些文档的链接。在接受这个答案之前,我会等一等,但到目前为止,这正是我想要的。它基本上把我原来的问题颠倒过来了。您告诉$(window).load()中的函数查找从全局范围调用的函数,而不是修饰HREF的调用。非常聪明。我喜欢你用window.App编辑的版本。当我编写自己的jQuery小部件和控件时,我总是将它们限定在自己的名称空间中,因此我想我最好对Javascript做同样的事情,否则它们将生活在全局名称空间中。再次感谢所有这些伟大的建议和到JSFIDLE的链接(基于到目前为止我所看到的一点,注定会成为我最喜欢的编程相关网站之一)。javascript中没有
String.format
。另外,请详细说明您希望在加载时传递给
Foo
<a href="javascript:App.Foo(27)">Click me!</a>