【问题标题】:If var not set always results in true, even if its set如果 var not set 总是导致 true,即使它的 set
【发布时间】:2013-05-10 16:31:00
【问题描述】:

不知道如何表述,但就这样吧。

我正在检查一个 var 是否存在(内容),如果它没有我设置它。

问题是下一次点击,它仍然表现得好像没有 var 内容。但是为什么呢??

这是我的代码:

$("#nav a").click(function(event) {
    event.preventDefault();
    var href = $(this).attr("href");
    var load = href + " .content";
    if (!content)
    {
        var content = $('<div>').load(load);
        $(".content").append(content);

    } 
    else 
    {
        var position = content.offset();
        $(document).scrollTop(position);

    }
});

它永远不会导致其他结果,因此始终会在整个加载和附加功能重复时进行单击。

基本上我怎样才能记录这个特定链接的内容已经加载过一次,所以下次应该执行else函数?

另外,我的 if(!content) 语句有什么问题?是因为范围吗?

【问题讨论】:

    标签: javascript jquery ajax if-statement


    【解决方案1】:

    在 Javascript 中,函数确定对象的范围。您需要将内容放在全局范围内。目前它是在分配给 click 事件处理程序的匿名函数中创建的,因此当再次执行该函数时,内容超出范围导致它返回 false。

    var content;
    $("#nav a").click(function(event) {
        event.preventDefault();
        var href = $(this).attr("href");
        var load = href + " .content";
        if (!content)
        {
            content = $('<div>').load(load);
            $(".content").append(content);
    
        } 
        else 
        {
            var position = content.offset();
            $(document).scrollTop(position);
    
        }
    });
    

    【讨论】:

    • 好的,但在这种情况下,如果 else 总是会导致 else 对吗?
    • 不,因为我们还没有分配内容,所以它在 javascript undefined 中是 undefined == false。四处寻找有关真假的信息以了解更多信息。
    【解决方案2】:

    尝试将var content 设为全局变量而不是本地变量,就像您现在正在做的那样。这就是为什么if (!content) 结果始终为真,例如:

    var content;
    $("#nav a").click(function (event) {
        event.preventDefault();
        var href = $(this).attr("href");
        var load = href + " .content";
        if (!content) {
            content = $('<div>').load(load);
            $(".content").append(content);
        } else {
            $(document).scrollTop(content.offset());
        }
    });
    

    只是为了说明会发生什么,当content的值首先没有设置然后再次设置时:

    var content;
    console.log(content);  // undefined 
    console.log(!content); // true 
    
    content = 'text';
    console.log(content);  // text  
    console.log(!content); // false
    

    【讨论】:

      【解决方案3】:

      感谢大家回答第一个关于检查 var 是否存在的问题。

      我最终放弃了整个概念,结果却是

      one()
      

      功能是我一直需要的。为了只执行一次功能,然后在所有后续点击中执行另一个功能。

      这里是:

      $(document).ready(function() {
          //Ajaxify Navi
              $("#nav a").one("click", function(event) {
                  event.preventDefault();
                  var href = $(this).attr("href");
                  var load = href + " .content";
                  var content = $('<div>').load(load);
                  $(".content").append(content);
                  $(this).click(function(event) {
                      event.preventDefault();
                      var position = content.offset().top;
                      $(document).scrollTop(position);
                      $("body").append(position);
                  });
              });
      });
      

      这是什么:

      第一次单击按钮通过 ajax 加载内容并附加它,第二次单击同一按钮只会滚动到所述内容。

      【讨论】:

        猜你喜欢
        • 2019-05-06
        • 2015-09-08
        • 1970-01-01
        • 2023-02-20
        • 2013-09-14
        • 1970-01-01
        • 2019-04-26
        • 1970-01-01
        • 2014-02-05
        相关资源
        最近更新 更多