Javascript 如何使jQuery.ready中定义的函数全局可用?
我有一个功能,可以从url中删除youtube id。然后我希望每页使用这个函数10次(在wordpress循环中) 当我在函数脚本标记中向它提供url时,该函数工作得很好,但是当我在循环中启动一组新的脚本标记时,它就不工作了 我需要知道如何使用我的函数而不首先声明它 这是我在标题中的代码:Javascript 如何使jQuery.ready中定义的函数全局可用?,javascript,jquery,Javascript,Jquery,我有一个功能,可以从url中删除youtube id。然后我希望每页使用这个函数10次(在wordpress循环中) 当我在函数脚本标记中向它提供url时,该函数工作得很好,但是当我在循环中启动一组新的脚本标记时,它就不工作了 我需要知道如何使用我的函数而不首先声明它 这是我在标题中的代码: <script type="text/javascript"> $(document).ready(function() { var getList = function(url, gkey
<script type="text/javascript">
$(document).ready(function() {
var getList = function(url, gkey){
var returned = null;
if (url.indexOf("?") != -1){
var list = url.split("?")[1].split("&"),
gets = [];
for (var ind in list){
var kv = list[ind].split("=");
if (kv.length>0)
gets[kv[0]] = kv[1];
}
returned = gets;
if (typeof gkey != "undefined")
if (typeof gets[gkey] != "undefined")
returned = gets[gkey];
}
return returned;
};
// THIS WORKS
alert(getList('http://www.youtube.com/watch?v=dm4J5dAUnR4', "v"));
});
$(文档).ready(函数(){
var getList=函数(url,gkey){
返回的var=null;
if(url.indexOf(“?”)=-1){
var list=url.split(“?”[1]。split(&”),
获取=[];
for(列表中的变量ind){
var kv=列表[ind]。拆分(“”);
如果(千伏长度>0)
获取[kv[0]]=kv[1];
}
返回=获取;
if(gkey的类型!=“未定义”)
if(typeof get[gkey]!=“未定义”)
returned=获取[gkey];
}
返回;
};
//这很有效
警报(getList('http://www.youtube.com/watch?v=dm4J5dAUnR4","v"),;
});
但是当我尝试在页面上的其他地方使用它时,它不起作用
<script type="text/javascript">
$(document).ready(function() {
alert(getList('http://www.youtube.com/watch?v=dm4J5dAUnR4', "v"));
};
</script>
$(文档).ready(函数(){
警报(getList('http://www.youtube.com/watch?v=dm4J5dAUnR4","v"),;
};
Firebug给我的getList没有定义这很有意义,因为它没有定义。我能“全局”声明此函数吗?只需在脚本顶部将其定义为常规函数:
<script type="text/javascript">
function getlist(url, gkey){
...
}
</script>
函数getlist(url,gkey){
...
}
您有两个选项,将其添加到窗口
对象以使其成为全局对象:
window.getList = function(url, gkey){
// etc...
}
或者将其从document ready事件处理程序内部移动到全局范围:
$(document).ready(function() {
alert(getList('http://www.youtube.com/watch?v=dm4J5dAUnR4', "v"));
});
var getList = function(url, gkey){
var returned = null;
if (url.indexOf("?") != -1){
var list = url.split("?")[1].split("&"),
gets = [];
for (var ind in list){
var kv = list[ind].split("=");
if (kv.length>0)
gets[kv[0]] = kv[1];
}
returned = gets;
if (typeof gkey != "undefined")
if (typeof gets[gkey] != "undefined")
returned = gets[gkey];
}
return returned;
};
您可能还想了解如何使用var functionName=function(){}
vsfunction functionName(){}
,以及如何使用变量范围。在ready()函数之外声明getList()
var getList = function(url, gkey){
var returned = null;
if (url.indexOf("?") !=
....
....
...
};
现在,getList将在代码中的任何位置工作:
$(document).ready( function() {
alert(getList('http://www.youtube.com/watch?v=dm4J5dAUnR4', "v"));
});
问题是getList(.)函数的作用域。另一个选项是将函数挂起,使其脱离jQuery对象本身。这样可以避免进一步污染全局名称空间:
jQuery.getlist = function getlist(url, gkey) {
// ...
}
然后,您可以使用“$.getlist(url,key)”将其声明为一个全局函数,只需去掉所有jQuery特定的位即可。类似如下:
function getList(url, gkey) {
var returned = null;
if (url.indexOf("?") != -1){
var list = url.split("?")[1].split("&"), gets = [];
for (var ind in list){
var kv = list[ind].split("=");
if (kv.length>0) {
gets[kv[0]] = kv[1];
}
}
returned = gets;
if (typeof gkey != "undefined") {
if (typeof gets[gkey] != "undefined") {
returned = gets[gkey];
}
}
return returned;
}
然后您应该可以从任何地方调用它。您只需在
$变量中添加函数即可。fn
变量:
(function ($) {
$.fn.getList = function() {
// ...
};
}(jQuery));
用法示例:
$().getList();
这是创建for jQuery时通常会执行的操作。很抱歉格式设置不好,每次我编辑代码时,结果都很奇怪。代码是有效的。顺便说一句,在document.ready中声明它意味着只有在文档准备就绪(页面加载后)时才定义它因此,您应该在确定函数已定义的情况下调用该函数。如果在您尝试使用该函数之后运行声明本身,则将其声明为全局对象可能是不够的。这没有任何意义。如果他使用jQuery,这是有原因的,所以为什么不再使用它?更重要的是,在$(文档)中声明某些内容.ready事件可确保加载整个页面,这有时是必要的。当然,将document.ready声明与此范围外的调用函数混合使用可能不好,但简单地删除jQuery调用并不完全是一个解决方案。您至少应该解释为什么删除jQuery是好的。更新:好的,我开始了,您的答案是实际上没那么糟糕。但它缺少的是一个解释,即将它移出document.ready范围的好处和危险是什么。var x=函数(…)和函数x(…)之间的区别声明等等。如果没有它,它就像魔术一样——解决了一个特定的问题,但不知道它为什么工作。多亏了你,我刚刚制作了我的第一个jQuery函数,棒极了!如果有更全面的资源来制作你自己的jQuery函数,请让我知道,但这对我有帮助,不管这是真的,但它不是一个好的解决方案例如,在这种情况下,您在其他页面标题中定义了jQuery函数,并希望在img元素中使用它作为onclick=“$.function()”,其他答案必须更好。我不确定是否理解您的评论(和向下投票)。这段代码回答了如何在全局命名空间中创建函数的问题-在jQuery处理程序之外。全局词指向它的含义[全局]。我假设全局函数可以从每个java脚本节访问,但当您仅在脚本顶部定义时,情况并非如此。我提到了一个{inside img element作为onclick的示例=“$.Function()”}。毕竟,否决票只是为了帮助用户确定最佳答案。真诚地说。答案是肯定的,但缺少括号@Andrew