【问题标题】:jQuery how to set selector to variablejQuery如何将选择器设置为变量
【发布时间】:2013-06-01 01:15:25
【问题描述】:

这是我的问题:
我有 300px 宽度的侧边栏,用户可以隐藏它的一部分,然后侧边栏可能有 100px 宽度。我想在侧边栏隐藏时向元素添加类,当它已满时我想从该元素中删除类。 当我隐藏侧边栏脚本的一部分时效果很好,但是当我再次显示它时。变量 element 未定义。 谁能解释一下这是为什么?
这是我的功能

function checkSidebarWidth()
{
    var sidebarWidth = $('.sidebar').width();
    var element;

    if(sidebarWidth <= 100){
        element = $('.sidebarWidth .nav > li > a.active').parents('ul').prev().children();
        element.addClass('active');
    }else{
        if(!typeof(element) === 'undefined'){
            element.removeClass('active');
        }
    }   
setTimeout(checkSidebarWidth, 100);
}

【问题讨论】:

  • 每次调用此函数时,都会声明一个名为 element 的新变量,它以 undefined 开头。如果您的 sidebarWidth 第一个 if 条件失败,它会保持未定义状态,因此永远不会输入 else if
  • @Willem OP 正在检查未定义的元素
  • if(!typeof(element) === 'undefined') 应该是 if( !(typeof(element)==='undefined') )
  • @san.chez if(!element) 应该足够了
  • @roasted 是的,应该。我只想指出:!优先级高于 ===

标签: javascript jquery


【解决方案1】:

局部变量不会在函数调用之后持续存在。当您对函数的第一次调用结束时,element 的值被扫除。

您可以做的是在函数范围之外声明element,并在函数中将其关闭。这样,它的值在调用之间保持不变。或者,您可以通过将element = $('.sidebarWidth .nav &gt; l... 移到条件语句之外,每次都重新选择 jQuery 集合(效率会大大降低)。

另一种方法(也是我更喜欢的方法)是接受集合作为参数,当您递归调度函数时,将集合传递给它:

function checkSidebarWidth(element) {
    var sidebarWidth = $('.sidebar').width();

    if (sidebarWidth <= 100) {
        element.addClass('active');
    } else {
        element.removeClass('active'); //The conditional statement is no longer needed
    }   
    setTimeout(function(){checkSidebarWidth(element);}, 100);
}

现在您可以对集合进行一次评估,在第一次调用时传递它,而不必担心它:

var sideBar = $('.sidebarWidth .nav > li > a.active').parents('ul').prev().children();
checkSidebarWidth(sideBar);
//Done! sideBar will keep circulating around inside checkSidebarWidth

【讨论】:

  • 感谢您的宝贵时间和回答。我会记住的,我保证以后不要问新手问题:)
【解决方案2】:

我想你可以在每次调用函数时分配element

function checkSidebarWidth(element) {

//var element = $('.sidebarWidth .nav > li > a.active').parents('ul').prev().children();
if(sidebarWidth <= 100){
    element.addClass('active');
}else{
    element.removeClass('active');
} 

【讨论】:

  • 感谢您的回答,这正是我想要的
  • @user1409508 这种方法效率低下,因为您在每次迭代中都不必要地重新构建相同的集合。考虑到您的函数每 100 毫秒运行一次,这会对性能造成巨大影响。
  • @Asad -- 我没有注意到间隔检查,我现在已经编辑包含元素作为参数,+1 到你的答案 -- OP,我会将 Asad 标记为正确答案。
猜你喜欢
  • 2013-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多