【问题标题】:JQuery / HTML link does not load on first clickJQuery / HTML链接在第一次点击时不加载
【发布时间】:2012-07-27 06:19:15
【问题描述】:

JQuery + HTML + CSS

我正在尝试获取导航栏上的链接以更新我拥有的“div”标签。我得到了它的工作,但我必须单击每个超链接两次,然后才能将页面加载到主查看器上。为什么?如何让它一键加载?

test.js:

function onScreen(id){
    $("a#" + id).click(function(){$("div#viewer").load(id + '.html')});  
}

main.html:

<a href="#" id="about" onclick="onScreen('about')">About Us</a>
<a href="#" id="account" onclick="onScreen('account')">My Account</a>

等等

<div class ="article" id="viewer">
    <p>welcome to this awesome site! </div>

在同一文件夹中有一个“about.html”文件(以及所有其他必要的文件)。再说一遍,代码的功能,只是不像它应该的那样。

【问题讨论】:

    标签: jquery html css


    【解决方案1】:

    第一次点击执行onScreen,将加载函数关联到点击事件。 因此,第二次点击时会触发加载功能。

    编辑

    一种解决方案可能是删除 &lt;a href=#&gt; 标签上的 onclick 属性

    $(function(){
        $("a[href='#']").click(function(){$("div#viewer").load(this.id + '.html')});
    })
    

    【讨论】:

    • 是的 - 这非常准确地解释了问题。但是解决方案呢? :)
    • 没错,我只回答了问题的第一部分,已编辑
    • 谢谢!我今天就试一试!
    • 成功了!非常感谢。至于为什么,我的第一次点击加载了第二次点击功能,是吗?
    • 是的,差不多。实际上,在您的代码中,每次点击都会调用您的 onScreen 函数,该函数会将您的加载程序函数添加到 onClick 事件处理程序中。因此,当您第三次单击时,您的 onScreen 函数将被调用一次,而您的加载器函数两次! ;)
    【解决方案2】:

    将屏幕更改为

    function onScreen(id){
       $("div#viewer").load(id + '.html'); 
    }
    

    说明:

    您之前所做的是在点击时将点击事件附加到链接。这意味着当您第一次点击时,它会启用链接来加载您的内容以供下次点击,因此只能在第二次点击时工作。

    【讨论】:

      【解决方案3】:

      嗯...首先,这不是最好的解决方案。更好的解决方案是:

      <a href="about.html" class="scriptable" id="about">About Us</a>
      <a href="account.html" class="scriptable" id="account">My Account</a>
      

      $(document).ready(function(){
           function displayScreen(screenname){
               var url_to_load = screenname + '.html';
               $('#viewer').load(url_to_load);
      
           }
           $('.scriptable').live("click", function(ev){
               var screenname = $(this).attr('id');
               displayScreen(screenname);
               ev.preventDefault();
           });
      });
      

      Facebook 做了类似的解决方案,虽然他们用 rel="ajaxify" 属性来做,但原理是完全一样的。

      (下一步:使用某种历史 API 使 URL 跟随用户导航)

      【讨论】:

      【解决方案4】:

      那里只是有一些冗余代码。您附加了两个点击事件。

      1. 使用onClick 属性在标记中内联。
      2. onScreen() 函数中使用.click()

      只有在您单击链接后,才会创建实际的 .click() 处理程序。所以你必须点击一次来创建一个处理程序,然后第二次点击会触发回调函数。

      您可以删除.click() 并将代码保留在该函数中。所以你的 onScreen() 函数看起来像这样 -

      function onScreen(id){
        $("div#viewer").load(id + '.html');
      }
      

      您也可以改用这种语法来改进代码 -

      $('a.internalLink').on('click',function(
        $("div#viewer").load($(this).id + '.html');
      ));
      

      这假设您为所有想要表现得像这样的&lt;a&gt; 标记提供internalLink 的类属性。为相似的元素赋予相同的类名要容易得多,这样您就可以使用 jQuery 选择器轻松地对它们进行分组。

      较新的.on() function 自 jQuery 1.7+ 起是首选

      【讨论】:

      • 非常感谢。今天晚些时候测试后我会接受!
      【解决方案5】:

      看到您正在使用 jQuery,放弃内联 onclick 并改为绑定。这使您的代码更简洁,更易于理解和修改。

      <a href="#" id="about" class="viewer">About Us</a>
      <a href="#" id="account" class="viewer">My Account</a>
      <div class ="article" id="viewer">
          <p>welcome to this awesome site!</p>
      </div>
      ​<script>
      $(function(){
          $("a.viewer").click(function(){
              alert($(this).attr('id') + '.html');
              $("div#viewer").load(this.id + '.html')
          });  
      })​;
      </script>
      

      Working JSFiddle

      【讨论】:

      • 在您的小提琴示例中,您使用 jQuery 1.7 - 为什么不使用 .on() 函数?
      • @Lix 回复:on 你是对的。 re:分号,这里不需要。 mislav.uniqpath.com/2010/05/semicolons
      • 仅仅因为您可以忽略它们 - 并不意味着您应该这样做。我认为应该与他们的代码风格保持一致。
      • 我相信我很快就写了答案,由于缺少; 没有任何影响,所以没什么大不了的。如果冒犯了您,请随时编辑答案并添加它。
      【解决方案6】:

      试试

      $(document).ready(function(){
        $("a").click(function(){
          $("div#viewer").load(this.id + '.html')
        });
      });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-03
        • 1970-01-01
        • 1970-01-01
        • 2015-09-02
        • 1970-01-01
        相关资源
        最近更新 更多