【问题标题】:Javascript onclick() requires two clicksJavascript onclick() 需要两次点击
【发布时间】:2015-07-02 22:31:09
【问题描述】:

我有三个按钮,每个按钮调用chooseMap() 函数onclick,然后将用户重定向到基于按钮id 的新页面。一切正常,但我每次都必须单击两次。谁能告诉我这是为什么,我该如何解决?

<div class="row text-center" onclick="chooseMap();">
  <div class="col-md-4">
      <button type="button" class="btn btn-primary" id="world" >World Map</button>
  </div>
  <div class="col-md-4">
    <button type="button" class="btn btn-primary" id="europe">Europe</button>
  </div>
  <div class="col-md-4">
    <button type="button" class="btn btn-primary" id="sweden">Sweden</button>
  </div>
</div> 
function chooseMap(){
  $(document).ready(function() {
    document.getElementById("sweden").onclick = function(){
      location.href = "map_game/sweden.html";
    }
    document.getElementById("europe").onclick = function(){
      location.href="map_game/europe.html";
    }
    document.getElementById("world").onclick = function(){
      location.href="map_game/world.html";
    }
  })
} 

一切正常。我单击按钮,调用函数,传递正确的字符串,然后我很高兴地被发送到下一页,一切都正常工作。但是,我必须在按钮上单击两次才能使其工作。我第一次点击没有任何反应。有什么想法吗?

我已经在 Stack Overflow 上研究过这个问题,但无法通过 thisthis 问题解决我的问题。

【问题讨论】:

  • 你能把你的代码放在小提琴里吗?
  • 为什么将document.ready 放在chooseMap 函数中
  • 很可能没有调用chooseMap,当文档被加载但是当你第一次点击你的按钮时。然后单击事件与按钮一起注册,并在您第二次单击它时触发。这可能吗?
  • 很难将一些按钮包装在您需要使用 jquery 的 href 链接中
  • 超级超级经典的问题。您将点击附加到另一个函数中,因此只有在调用该函数后点击才会生效。

标签: javascript jquery html button onclick


【解决方案1】:

使用 jQuery 进行事件处理,无论如何你都在使用它:

$(document).ready(function () {
    $('#sweden').on('click', function () {
        location.href = "map_game/sweden.html";
    });
    $('#europe').on('click', function () {
        location.href = "map_game/europe.html";
    });
    $('#world').on('click', function () {
        location.href = "map_game/world.html";
    });
});

【讨论】:

    【解决方案2】:
    <div class="row text-center" onclick="chooseMap();">
        <div class="col-md-4">
            <a href="map_game/sweden.html"
        ><button type="button" class="btn btn-primary" id="world" >World Map</button></a>
        </div>
        <div class="col-md-4">
            <a href="map_game/europe.html"><button type="button" class="btn btn-primary" id="europe">Europe</button></a>
        </div>
        <div class="col-md-4">
            <a href="map_game/world.html"><button type="button" class="btn btn-primary" id="sweden">Sweden</button></a>
        </div>
    </div> 
    

    【讨论】:

      【解决方案3】:

      问题是因为第一次点击执行chooseMap 函数,然后附加事件处理程序。然后第二次单击执行在这些事件处理程序中分配的代码。

      要修复和改进您的代码,请删除内联 onclick 属性并使用 jQuery 附加您的事件。试试这个:

      <div class="row text-center">
          <div class="col-md-4">
              <button type="button" class="btn btn-primary" id="world">World Map</button>
          </div>
          <div class="col-md-4">
              <button type="button" class="btn btn-primary" id="europe">Europe</button>
          </div>
          <div class="col-md-4">
              <button type="button" class="btn btn-primary" id="sweden">Sweden</button>
          </div>
      </div>
      
      $(document).ready(function() {
          $("#sweden").click(function() {
              window.location.assign('map_game/sweden.html');
          });
          $("#europe").click(function() {
              window.location.assign('map_game/europe.html');
          });
          $("#world").click(function() {
              window.location.assign('map_game/world.html');
          });
      });
      

      请注意,您甚至可以通过使用 DRY 原则进一步改进这一点,您可以使用基于 button 元素的 class 的单个处理程序,并使用按钮的 id 设置 URL,如下所示:

      $(document).ready(function() {
          $(".btn").click(function() {
              window.location.assign('map_game/' + this.id + '.html');
          })
      });
      

      【讨论】:

      • DRY 的例子很好,但是 jQuery,同样的事情可以用 addEventListener 来实现,这背后有什么原因吗?
      • 不,你也可以使用addEventListener。我提供了一个 jQuery 示例,因为 OP 似乎处于中途状态。如果你在页面中包含了 jQuery,你也可以使用它:)
      • 我试过这个,但有时我的按钮需要点击两次。我可以通过在文本区域中按回车键,然后单击按钮来一致地重现这一点。
      • @ChewieTheChorkie 听起来你有嵌套的事件处理程序。如果这是一个问题,我建议提出一个新问题
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-21
      • 2017-09-23
      • 2020-11-26
      • 1970-01-01
      • 1970-01-01
      • 2010-09-25
      相关资源
      最近更新 更多