Javascript jQuery中的函数作用域
我在HTML文件顶部的Javascript jQuery中的函数作用域,javascript,jquery,Javascript,Jquery,我在HTML文件顶部的标记中有此代码 $(document).ready(function() { $('#scrollbar1').tinyscrollbar(); $('a.jqtree_common').click(updateScrollbar()); }); $(function updateScrollbar() { var oScrollbar = $('#scrollbar1'); oScrollbar.tinyscrollbar();
标记中有此代码
$(document).ready(function()
{
$('#scrollbar1').tinyscrollbar();
$('a.jqtree_common').click(updateScrollbar());
});
$(function updateScrollbar()
{
var oScrollbar = $('#scrollbar1');
oScrollbar.tinyscrollbar();
oScrollbar.tinyscrollbar_update();
$('a.jqtree_common').click(updateScrollbar());
});
但由于某种原因,当我运行此程序时,它会说updateScrollbar()
在(document).ready中未定义。当我试图在(文档)中定义updateScrollBar()
时,ready
然后updateScrollBar()
陷入了某种无休止的循环
我的问题有两个:
如何使updateScrollBar()
在(document).ready的范围内定义
是否有更好的方法将此函数分配给'a.jqtree\u common'
元素?它们在运行时动态创建,并在使用网页时进行修改。我希望函数在每次单击其中一个时运行
我用的是小巧的
编辑:我想要$('a.jqtree_common')。单击(updateScrollbar)每次更新滚动条时都要进行代码>分配,因为我相信单击'a.jqtree\u common'
元素会创建更多'a.jqtree\u common'
元素。尝试以下代码:
$(document).ready(function() {
var updateScrollbar = function () {
var oScrollbar = $('#scrollbar1');
oScrollbar.tinyscrollbar();
oScrollbar.tinyscrollbar_update();
};
$('#scrollbar1').tinyscrollbar();
$('a.jqtree_common').click(updateScrollbar).click();
});
将函数引用作为回调传递,而不是在Click事件中传递函数的结果()
将调用函数并将结果设置为回调,inturn将再次调用函数内部的updatescrollbar,并以无限循环的方式运行
$(document).ready(function()
{
$('#scrollbar1').tinyscrollbar();
$('a.jqtree_common').click(updateScrollbar);
});
function updateScrollbar()
{
var oScrollbar = $('#scrollbar1');
oScrollbar.tinyscrollbar();
oScrollbar.tinyscrollbar_update();
//$('a.jqtree_common').click(updateScrollbar);
}
要绑定稍后加载的元素,我们必须使用(
函数)上的
$(document).ready(function(){
$('#scrollbar1').tinyscrollbar();
$(document).on("click","a.jqtree_common", updateScrollbar);
});
function updateScrollbar(){
var oScrollbar = $('#scrollbar1');
oScrollbar.tinyscrollbar();
oScrollbar.tinyscrollbar_update();
}
如果需要范围限制,则在块内声明函数
$(document).ready(function(){
$('#scrollbar1').tinyscrollbar();
$(document).on("click","a.jqtree_common", updateScrollbar);
function updateScrollbar(){
var oScrollbar = $('#scrollbar1');
oScrollbar.tinyscrollbar();
oScrollbar.tinyscrollbar_update();
}
});
好吧,我知道在这一点上有很多帽子在拳击场上,但这是我的参赛作品一样
//IMMEDIATELY-INVOKED FUNCTION EXPRESSION (IIFE)
// Used for privacy/variable scoping
(function(){
//bind init function to dom-ready event
$(init); //same as $(document).ready(init);
//initialize event bindings for page
function init() {
//initialize scrollbar
$('#scrollbar1').tinyscrollbar();
//click binding for tree
$('a.jqtree_common').click(updateScrollbar);
//assuming you want to run the updateScrollbar on page load
//in addition to clicks
updateScrollbar();
}
//handles scrollbar updates
function updateScrollbar() {
//assuming the tinyscrollbar() initialization only needs
//to happen once, inside the initialization event.
$('#scrollbar1').tinyscrollbar_update();
}
}());
上面的结构基本上就是我处理事情的方式……我首先处理变量,然后在顶部进行事件绑定,下面是我的函数声明。这是因为函数提升(在JS的编译中,函数声明移动到顶部),这不适用于函数赋值(例如:var x=function)(){…}
),然后我将整个内容包装在一个文件中。我发现这种结构更易于阅读和理解。我不喜欢将绑定放在底部,因为我发现你必须反复阅读才能找到你想要的内容。这就是我最终的工作:
$(document).ready(function()
{
$('#scrollbar1').tinyscrollbar();
$('a.jqtree_common').click(updateScrollbar);
function updateScrollbar()
{
var oScrollbar = $('#scrollbar1');
oScrollbar.tinyscrollbar();
oScrollbar.tinyscrollbar_update();
$('a.jqtree_common').click(updateScrollbar);
}
});
$('a.jqtree_common')。单击(updateScrollbar());
应该是$('a.jqtree_common')。单击(updateScrollbar);
做了一个小改动来更正JS,此外,我倾向于依靠函数提升将我的函数定义放在我的事件绑定之下,但没有改变这一点。函数提升在这种情况下不起作用。只有变量updateCollbar
被提升,而不是值。我知道,必须重构才能使用函数updateScrollbar…
在绑定下面。确实如此。顺便说一句:所以礼仪只是针对格式问题或拼写错误编辑答案/帖子。如果是代码更改,最好留下评论。在这种情况下,我同意编辑,但你可以想象,如果我不同意你的更改和回复,可能会引发一场大讨论-第四次编辑游戏。只需删除围绕函数的$(
和);
。DOM不需要准备好声明函数。使用事件绑定时,函数不需要()或在浏览器读取该行时调用。@caps我们必须使用此。on(
用于动态绑定的函数elements@RohitAgrawal这是为什么?它不使用bind元素,而是使用静态元素,如document,例如$(document).on(
然后它会查找目标并与提供的选择器匹配,这样在添加该元素时就不必一次又一次地绑定,请看我的answer@JuanMendes没有找到您?范围仍需要修复。您需要删除$(
函数更新滚动条()之前的,以及匹配的)
@JuanMendes Man你设置注释时,我可能正在键入。这是最接近我的答案,只是我没有注释掉$('a.jqtree_common')。单击(updateScrollbar);
行。我尝试了这两种方法,但没有一种对我有效。我能让小提琴看看吗