【问题标题】:Button does not function on the first click按钮在第一次单击时不起作用
【发布时间】:2015-03-21 23:10:01
【问题描述】:

function showCheckbox(){  
    var node_list = document.getElementsByClassName('check');
    for (var i = 0; i < node_list.length; i++) 
    {  
      if(node_list[i].style.display == 'none') { 
        node_list[i].style.display = 'block';
      } else { node_list[i].style.display = 'none'; }
    }
}
input[type=checkbox]{
display:none;
position:relative;
}
<input type="button"  value="Εμφάνιση" onclick="showCheckbox()" />
<img src="form-images\trash.png"  onclick="" style="width:21px;height:24px;margin-left:20px; "/>

    <input type="checkbox" class="check" />   
        <label>Ψάρεμα</label>
        <input type="text"  />
   	</br>
	<input type="checkbox" class="check" />   
        <label>Γήπεδο</label>
        <input type="text"/>
      </br>

当页面第一次加载并且我在第一次单击时按下按钮时,它不会触发 onclick 功能。 如果我第二次按下它会触发事件。

其他&lt;input type="button"/&gt; 按钮在第一次点击时触发事件没有问题。 有谁知道是什么问题还是有同样的问题?

【问题讨论】:

  • 发布您的代码并标记。
  • 确保在 HTML 之前定义了 showCheckbox 函数。否则,input 标签将要求一个不存在的函数(尚)。
  • 我在头部声明了所有的 错误仍然存​​在,我把它放在 之后仍然存在错误.so?
  • 第一次点击无效是否会导致浏览器的开发控制台出现任何错误? (当你说它没有触发该函数时,你确定该函数根本没有被调用,与它被调用但没有正确显示/隐藏复选框相比?)
  • inspect element -> console->JS 是空白的,所以我猜没有错误。在 Css 上有很多错误,但它们在其他类的背景中

标签: javascript html button dom-events


【解决方案1】:

这样做并尝试我会工作,因为 if 语句首先检查代码然后运行

for (var i = 0; i < node_list.length; i++) 
    {  
      if(node_list[i].style.display == 'block') { 
        node_list[i].style.display = 'none';
      } else { node_list[i].style.display = 'block'; }
    }

【讨论】:

    【解决方案2】:

    不要在你的 css 文件中写 display: none ,而是在你的 html 文档中内联写它,这样它会更像:

    <input style="display: none" type="checkbox" class="check" />
    

    【讨论】:

      【解决方案3】:

      第一次循环时 style.display 属性不存在,您可以更改代码如下:

          function showCheckbox(){
          var node_list = document.getElementsByClassName('check');
          for (var i = 0; i < node_list.length; i++)
          {
              if(node_list[i].style.display !== 'none' || !node_list[i].style.display) {
                  node_list[i].style.display = 'block';
              } else { node_list[i].style.display = 'none'; }
          }
      }
      

      一个更好的解决方案可能是(如果你可以使用 jQuery)

          function showCheckbox(){
      
          $( "input.check" ).each(function() {
              if ($(this).css('display') == 'none'){
                  $(this).css('display','block')
              } else {
                  $(this).css('display','none')
              }
          });
      }
      

      【讨论】:

        【解决方案4】:

        您的代码很脆弱,容易破解。我建议您在 css 和 javascript 之间创建一个清晰的关注点分离。

        此外,您对check 类的使用是双重的:选择元素并隐藏它们。那是两件事管理得更好,而不是相互耦合。

        更改元素类可能很简单:

        node_list[i].classList.toggle('check-hidden');
        

        您需要为实际隐藏的复选框创建一个新的 CSS 类。

        function showCheckbox(){  
            var node_list = document.getElementsByClassName('check');
            for (var i = 0; i < node_list.length; i++) 
            {  
                node_list[i].classList.toggle('check-hidden');
            }
        }
        .check {
            position:relative;
        }
        
        .check-hidden {
            display:none;
        }
        <input type="button"  value="Εμφάνιση" onclick="showCheckbox()" />
        <img src="form-images\trash.png"  onclick="" style="width:21px;height:24px;margin-left:20px; "/>
        
            <input type="checkbox" class="check" />   
                <label>Ψάρεμα</label>
                <input type="text"  />
           	</br>
        	<input type="checkbox" class="check" />   
                <label>Γήπεδο</label>
                <input type="text"/>
              </br>

        【讨论】:

        • 我不明白你说的“易碎、易碎”是什么意思。我有义务只使用JS没有Jquery你说的“易碎、易碎”是什么意思?
        • 易碎我的意思是它在这一点上很脆弱。反转条件可以使其工作,但不会使您的代码更健壮。对 css 的更改会使其再次崩溃。
        • 软件应该只有一个崩溃的理由。与您已实施的行为无关的任何更改都不应破坏该行为。一切都与代码质量有关。
        • 啊,很高兴看到你绑定到纯 JS。我的 sn-p 是纯 JS。
        • 为什么要再次破解?你在想什么?简短地说一下,只是为了提供信息。
        【解决方案5】:

        原因很简单: 当您获得“样式”属性时,它表示该元素的内联样式。在第一次单击时,“显示”没有内联样式, 所以否则 fork 会触发并将“display”的内联样式设置为“none”

        接下来你可以做的事情

        1. 使用计算样式

          window.getComputedStyle(node_list[i]).display == "none"

        2. 或者将“if”语句切换到

          if(node_list[i].style.display == 'block') node_list[i].style.display = 'none'; 否则 node_list[i].style.display = 'block';

        https://developer.mozilla.org/en-US/docs/Web/API/window.getComputedStyle

        【讨论】:

        • 对。我不知道“内联的东西”。也谢谢你。
        【解决方案6】:

        我认为正在发生的事情是您的点击处理程序正在在第一次点击时被调用,但您的if 测试没有按您预期的方式工作。这一行:

        if(node_list[i].style.display == 'none')
        

        ...正在测试元素是否具有 inline 样式集。它没有:它通过适用于所有此类输入的 CSS 规则隐藏。那么你的else case 执行并且.display 设置为'none'。然后在 next 点击时,if 按预期工作并将.display 更改为'block'。

        如果您实际稍微调试一下您的函数,您可以自己看到这一点,看看它是否被调用并测试该 .display 属性的值 - 如您在此处看到的:@987654321 @(注意:我不推荐使用alert()s 进行调试)。

        检查样式表规则设置的当前可见性有点棘手,因为它在浏览器中的工作不一致。您可能需要测试 .currentStyle 和 .getComputedStyle() 是否存在,以允许当前浏览器可能支持的任何一个。请查看 this answer 到另一个问题以了解更多信息。

        但是在您的情况下,鉴于您知道复选框是隐藏的,您可以简单地反转您的 if/else:

          if(node_list[i].style.display == 'block') { 
            node_list[i].style.display = 'none';
          } else {
            node_list[i].style.display = 'block';
          }
        

        .display 不会以'block' 开头,因此将执行 else 并显示元素。

        演示:http://jsfiddle.net/uLjxp3ha/1/

        【讨论】:

        • 你是对的。这是一个非常奇怪的错误。谢谢。我对 Css 的评论是否帮助您找到了这个?
        • 不,直到提出答案后我才看到该评论。
        • 哈哈好吧,你帮我使用控制台...我在想如果 JS 没有错误,从控制台检查 CSS 是没用的
        • 你能解释一下为什么node_list[i].style.display 指的是内联样式集吗?我在浏览器中使用了谷歌开发工具,首先(没有点击)它显示了一些element = {}。第一次单击后,属性将保存/复制到element 中,只有在此之后,第二次单击时才会发生编程更改。 “风格”和“元素”有区别吗?这让我很困惑。
        • @ChinmayGhule - node_list[i] 指的是元素。 node_list[i].style.display 属性指的是该元素上的内联 display 样式(如果已设置该内联样式)。
        猜你喜欢
        • 2021-02-14
        • 2020-06-25
        • 2013-06-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-09
        相关资源
        最近更新 更多