【问题标题】:error var is not defined -but its defined before used-错误变量未定义-但在使用之前已定义-
【发布时间】:2011-10-13 15:07:25
【问题描述】:

这段代码

    $(document).ready(function(){
                            var wBack = $('ul li.roundabout-in-focus').height();
                            var hBack = $('ul li.roundabout-in-focus').width();
                            var lback = $('ul li.roundabout-in-focus').css('left');
                            var tback = $('ul li.roundabout-in-focus').css('top');
    });
    function close_current(){
                    $('.nInfoIE').show();
                        $('.roundabout-in-focus').find('.img').show();
                        $('.roundabout-in-focus').css({position:'absolute',height:hBack,width:wBack,left:lBack,top:tBack});
                        $('.roundabout-in-focus').find('.iframe').css({'visibility':'hidden'});
                        $('ul li').find('.iframe').addClass('esconder');

                        $('ul li iframe').each(function(){
                            var tempurl = '';
                            tempurl = $(this).attr('src');
                            $(this).attr('src',tempurl.replace('?autoplay=1', ''));
                        });
                        watching = false;
                        $('.nInfoIE').hide();
 }

通过firebug警告hBack未定义来提示错误,如您所见在document.ready上定义并且该函数在onClick元素上执行...

-编辑-

甚至尝试在 document.ready 之前添加 var wBack ,hBack,lback,tback = 0; 并删除 document.ready 中的单个“var”

我错过了什么?

【问题讨论】:

  • 元素有高度吗?你试过输出/提醒它吗?

标签: javascript function variables document-ready


【解决方案1】:

您已经在“就绪”处理函数内部定义了变量。这意味着它们对该函数是私有的,并且在它之外不可见。

您可以通过明确地将它们设为window 属性来使它们可见:

  window['hBack'] = whatever;

或者你也可以将你的“closeCurrent”函数放在“ready”处理程序中,只要它只被处理程序中的代码引用。

【讨论】:

  • 如果我这样做,没有错误;但它为所有值返回“null”:s 我称它们为 alert(window['hBack']) 吗??
  • 一旦将它们定义为window 属性,它们应该可以作为window.hBack 或仅作为hBack 使用。如果这些值为空,那么“就绪”处理程序中的初始化可能没有按预期工作。换句话说,可能是正在创建变量,但以 null 作为值。
【解决方案2】:

一言以蔽之,范围。在 $(document).ready 函数之外声明你的变量,让它们进入全局范围,然后在函数内部设置它们。

var wBack, hBack, lback, tback;
$(document).ready(function () {
    wBack = ...

【讨论】:

  • 确保您不要在“就绪”处理程序中使用var。
【解决方案3】:

这是一个范围问题。

这里的其他答案在技术上会起作用,但如果您不需要全局变量,我绝不建议您将它们保持在全局范围内。

您正在 DOM-ready 块内定义 wBack、hBack、lBack 和 tBack,但您正试图从事件处理程序访问它们。如果可以,请从元素中删除 onclick,并将其添加到 DOM-ready 块中以共享变量。

$(document).ready(function(){

    // Store the selector
    var element = $('ul li.roundabout-in-focus')
    var wBack = element.height();
    var hBack = element.width();
    var lback = element.css('left');
    var tback = element.css('top');

   $("#someElement").click(function close_current(){
                    $('.nInfoIE').show();
                        $('.roundabout-in-focus').find('.img').show();
                        $('.roundabout-in-focus').css({position:'absolute',height:hBack,width:wBack,left:lBack,top:tBack});
                        $('.roundabout-in-focus').find('.iframe').css({'visibility':'hidden'});
                        $('ul li').find('.iframe').addClass('esconder');

                        $('ul li iframe').each(function(){
                            var tempurl = '';
                            tempurl = $(this).attr('src');
                            $(this).attr('src',tempurl.replace('?autoplay=1', ''));
                        });
                        watching = false;
                        $('.nInfoIE').hide();
   })
});

您还应该将选择器缓存在该块的顶部(如我的示例中)以防止重复查询 DOM(您也可以在单击处理程序中执行此操作,但选择器不同,所以我离开了单独作用:)

希望有帮助!干杯。

【讨论】:

    【解决方案4】:

    它仅在您传递给ready 函数的函数范围内定义。如果你想引用它,你需要在全局范围内声明它。 (只需删除var 关键字)

    【讨论】:

      【解决方案5】:

      您的变量(wBack、hBack、lback 和 tback)只是在您的 document.ready 函数中定义。没有全局的。

      为了能够在您的其他函数中使用它,您的变量必须是全局变量。 您可以只删除变量之前的“var”,因为在 javascript 中,没有“var”的变量声明会使变量成为全局变量。或者您可以像这样手动将其声明为全局:

      var wBack;      
      var hBack;
      var lback;
      var tback;
      $(document).ready(function(){
         wBack = $('ul li.roundabout-in-focus').height();
         hBack = $('ul li.roundabout-in-focus').width();
         lback = $('ul li.roundabout-in-focus').css('left');
         tback = $('ul li.roundabout-in-focus').css('top');
      });
      

      【讨论】:

        猜你喜欢
        • 2020-11-30
        • 2014-10-09
        • 1970-01-01
        • 2011-10-04
        • 2018-08-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多