Javascript 如何调用$(window)中定义的JQuery函数。从HREF加载
我喜欢将所有JQuery函数和事件接收器的作用域都限定为$(window)。加载,如下所示: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> 通常,我在这个范围内完成所有工作,但我有一个案例,我想从一个独立
$(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>