【问题标题】:How can I call function in HTML file for checkbox?如何在 HTML 文件中为复选框调用函数?
【发布时间】:2020-10-20 21:54:06
【问题描述】:

默认情况下,复选框已被选中,但表格并未隐藏。默认情况下,应演示前两个表。当您单击几次时,您可以看到隐藏的表格,但它们应该被隐藏为默认选中。问题是当我在 https://codepen.io/ 中复制粘贴时,这是因为 js 直接调用该函数而起作用。当您将此代码复制粘贴到 html 文件中时,它不起作用。如何调用函数获取结果?

<html>

<head>
    <script language="JavaScript">
        function showMe(cls) {
            var chboxs = document.getElementsByName("c1");
            var vis = 0;
            for (var i = 0; i < chboxs.length; i++) {
                if (chboxs[i].checked) {
                    vis = 1;
                    break;
                }
            }
            var elements = document.getElementsByClassName(cls);
            for (let e of elements) {
                if (vis === 1) {
                    e.style.display = 'none';
                } else {
                    e.style.display = 'table';
                }

            }
        }
        show('box');
    </script>

</head>

<br>
<table class="header" width="100%" border="0" cellpadding="0" cellspacing="0">
    <tr>
        <td align="left">
            <input type="checkbox" name="c1" checked="true" onclick="showMe('box')">Show Result
        </td>
    </tr>
</table>

<table class="uniqueborder" width="100%" bordercolor="#CBCBCB" cellpadding="0" cellspacing="0">
    <tr>
        <td class="uniqueborder" width="90%" align="center" bgcolor="#F3F3F3"><b>Event</b></td>
        <td class="uniqueborder" width="10%" align="center" bgcolor="#F3F3F3"><b>Status</b></td>
    </tr>
    <tr>
        <td class="uniqueborder" align="left">
            <p style="margin: 0pt; ">Test </p>
        </td>
        <td class="uniqueborder" align="center" width="10%">
            <font color="gray">N/A</font>
        </td>
    </tr>
    <tr>
        <td class="uniqueborder" align="left">
            <p style="margin: 0pt; ">Test </p>
        </td>
        <td class="uniqueborder" align="center" width="10%">
            <font color="gray">N/A</font>
        </td>
    </tr>
    </tbody>
</table>
<table class="box" width="100%" bordercolor="#CBCBCB" cellpadding="0" cellspacing="0">
    <tbody>
        <tr>
            <td style="border-right:1px solid #CBCBCB; padding-left:2px; padding-right:2px" align="left">
                <p style="margin: 0pt; ">Test </p>
            </td>
            <td class="uniqueborder" align="center" width="10%">
                <font color="gray">N/A</font>
            </td>
        </tr>

    </tbody>
</table>
<table class="box" width="100%" bordercolor="#CBCBCB" cellpadding="0" cellspacing="0">
    <tbody>
        <tr>
            <td class="uniqueborder" align="left">
                <p style="margin: 0pt; "><span class="bluebold">1. Test input:</span></p>
            </td>
            <td class="uniqueborder" align="center" width="10%">
                <font color="gray">N/A</font>
            </td>
        </tr>
        <tr>
            <td class="uniqueborder" align="left">
                <p style="margin: 0pt; "><span class="bluebold">1. Expected</span></p>
            </td>
            <td class="uniqueborder" align="center" width="10%">
                <font color="gray">N/A</font>
            </td>
        </tr>
    </tbody>
</table>
<table class="uniqueborder" width="100%" bordercolor="#CBCBCB" cellpadding="0" cellspacing="0">
    <tbody>
        <tr>
            <td class="uniqueborder" align="left">
                <p style="margin: 0pt; "><span class="bluebold">1. Test input:</span></p>
            </td>
            <td class="uniqueborder" align="center" width="10%">
                <font color="gray">N/A</font>
            </td>
        </tr>
        <tr>
            <td class="uniqueborder" align="left">
                <p style="margin: 0pt; "><span class="bluebold">1. Expected</span></p>
            </td>
            <td class="uniqueborder" align="center" width="10%">
                <font color="gray">N/A</font>
            </td>
        </tr>
    </tbody>
</table>
<table class="box" width="100%" bordercolor="#CBCBCB" cellpadding="0" cellspacing="0">
    <tbody>
        <tr>
            <td class="uniqueborder" align="left">
                <p style="margin: 0pt; "><span class="bluebold">1. Test input:</span></p>
            </td>
            <td class="uniqueborder" align="center" width="10%">
                <font color="gray">N/A</font>
            </td>
        </tr>
        <tr>
            <td class="uniqueborder" align="left">
                <p style="margin: 0pt; "><span class="bluebold">1. Expected</span></p>
            </td>
            <td class="uniqueborder" align="center" width="10%">
                <font color="gray">N/A</font>
            </td>
        </tr>

    </tbody>
</table>
</table>

</html>

【问题讨论】:

标签: javascript html jquery css


【解决方案1】:

在文件末尾添加 JS,这是行不通的,因为您在 HTML 之前返回 JS。你需要在JS之前渲染HTML,并将show('box');更改为showME('box');

<html>

  <head></head>

  <br>
  <table class="header" width="100%" border="0" cellpadding="0" cellspacing="0">
    <tr>
      <td align="left">
        <input type="checkbox" name="c1" checked="true" onclick="showMe('box')">Show Result
        </td>
    </tr>
  </table>

  <table class="uniqueborder" width="100%" bordercolor="#CBCBCB" cellpadding="0" cellspacing="0">
    <tr>
      <td class="uniqueborder" width="90%" align="center" bgcolor="#F3F3F3">
        <b>Event</b>
      </td>
      <td class="uniqueborder" width="10%" align="center" bgcolor="#F3F3F3">
        <b>Status</b>
      </td>
    </tr>
    <tr>
      <td class="uniqueborder" align="left">
        <p style="margin: 0pt; ">Test </p>
      </td>
      <td class="uniqueborder" align="center" width="10%">
        <font color="gray">N/A</font>
      </td>
    </tr>
    <tr>
      <td class="uniqueborder" align="left">
        <p style="margin: 0pt; ">Test </p>
      </td>
      <td class="uniqueborder" align="center" width="10%">
        <font color="gray">N/A</font>
      </td>
    </tr>
  </tbody>
</table>
<table class="box" width="100%" bordercolor="#CBCBCB" cellpadding="0" cellspacing="0">
  <tbody>
    <tr>
      <td style="border-right:1px solid #CBCBCB; padding-left:2px; padding-right:2px" align="left">
        <p style="margin: 0pt; ">Test </p>
      </td>
      <td class="uniqueborder" align="center" width="10%">
        <font color="gray">N/A</font>
      </td>
    </tr>

  </tbody>
</table>
<table class="box" width="100%" bordercolor="#CBCBCB" cellpadding="0" cellspacing="0">
  <tbody>
    <tr>
      <td class="uniqueborder" align="left">
        <p style="margin: 0pt; ">
          <span class="bluebold">1. Test input:</span></p>
      </td>
      <td class="uniqueborder" align="center" width="10%">
        <font color="gray">N/A</font>
      </td>
    </tr>
    <tr>
      <td class="uniqueborder" align="left">
        <p style="margin: 0pt; ">
          <span class="bluebold">1. Expected</span></p>
      </td>
      <td class="uniqueborder" align="center" width="10%">
        <font color="gray">N/A</font>
      </td>
    </tr>
  </tbody>
</table>
<table class="uniqueborder" width="100%" bordercolor="#CBCBCB" cellpadding="0" cellspacing="0">
  <tbody>
    <tr>
      <td class="uniqueborder" align="left">
        <p style="margin: 0pt; ">
          <span class="bluebold">1. Test input:</span></p>
      </td>
      <td class="uniqueborder" align="center" width="10%">
        <font color="gray">N/A</font>
      </td>
    </tr>
    <tr>
      <td class="uniqueborder" align="left">
        <p style="margin: 0pt; ">
          <span class="bluebold">1. Expected</span></p>
      </td>
      <td class="uniqueborder" align="center" width="10%">
        <font color="gray">N/A</font>
      </td>
    </tr>
  </tbody>
</table>
<table class="box" width="100%" bordercolor="#CBCBCB" cellpadding="0" cellspacing="0">
  <tbody>
    <tr>
      <td class="uniqueborder" align="left">
        <p style="margin: 0pt; ">
          <span class="bluebold">1. Test input:</span></p>
      </td>
      <td class="uniqueborder" align="center" width="10%">
        <font color="gray">N/A</font>
      </td>
    </tr>
    <tr>
      <td class="uniqueborder" align="left">
        <p style="margin: 0pt; ">
          <span class="bluebold">1. Expected</span></p>
      </td>
      <td class="uniqueborder" align="center" width="10%">
        <font color="gray">N/A</font>
      </td>
    </tr>

  </tbody>
</table>
</table>
<script language="JavaScript">
function showMe(cls) {
  var chboxs = document.getElementsByName("c1");
  var vis = 0;
  for (var i = 0; i < chboxs.length; i++) {
    if (chboxs[i].checked) {
      vis = 1;
      break;
    }
  }
  var elements = document.getElementsByClassName(cls);
  for (let e of elements) {
    if (vis === 1) {
      e.style.display = 'none';
    } else {
      e.style.display = 'table';
    }

  }
}
showMe('box');
</script>
</html>

【讨论】:

    【解决方案2】:

    为了便于阅读,我将您的 js 拆分为一个单独的文件。然后我做了以下调整:

    1. 在您的复选框中添加一个 ID。当只有 1 个元素时,这消除了在循环中检查您的元素的需要,并且由于它是一个复选框,因此应该始终只有 1 个具有该名称的元素
    2. 照原样按类名拉入表,然后将节点集合转换为数组。然后利用内置的数组 forEach 循环。
    3. 最后使用三元 if 语句为某些语法糖设置表格显示。

    function showMe(cls) {
        const checkbox = document.getElementById("c1"),
          tables = Array.prototype.slice.call(document.getElementsByClassName(cls));
        tables.forEach(function (t) {
            t.style.display = checkbox.checked ? 'table' : 'none';
        });
    }
    <table class="header" width="100%" border="0" cellpadding="0" cellspacing="0">
        <tr>
            <td align="left">
                <input type="checkbox" name="c1" id="c1" checked="true" onclick="showMe('box')">Show Result
            </td>
        </tr>
    </table>
    <table class="uniqueborder" width="100%" bordercolor="#CBCBCB" cellpadding="0" cellspacing="0">
        <tr>
            <td class="uniqueborder" width="90%" align="center" bgcolor="#F3F3F3"><b>Event</b></td>
            <td class="uniqueborder" width="10%" align="center" bgcolor="#F3F3F3"><b>Status</b></td>
        </tr>
        <tr>
            <td class="uniqueborder" align="left">
                <p style="margin: 0pt; ">Test </p>
            </td>
            <td class="uniqueborder" align="center" width="10%">
                <font color="gray">N/A</font>
            </td>
        </tr>
        <tr>
            <td class="uniqueborder" align="left">
                <p style="margin: 0pt; ">Test </p>
            </td>
            <td class="uniqueborder" align="center" width="10%">
                <font color="gray">N/A</font>
            </td>
        </tr>
        </tbody>
    </table>
    <table class="box" width="100%" bordercolor="#CBCBCB" cellpadding="0" cellspacing="0">
        <tbody>
            <tr>
                <td style="border-right:1px solid #CBCBCB; padding-left:2px; padding-right:2px" align="left">
                    <p style="margin: 0pt; ">Test </p>
                </td>
                <td class="uniqueborder" align="center" width="10%">
                    <font color="gray">N/A</font>
                </td>
            </tr>
    
        </tbody>
    </table>
    <table class="box" width="100%" bordercolor="#CBCBCB" cellpadding="0" cellspacing="0">
        <tbody>
            <tr>
                <td class="uniqueborder" align="left">
                    <p style="margin: 0pt; "><span class="bluebold">1. Test input:</span></p>
                </td>
                <td class="uniqueborder" align="center" width="10%">
                    <font color="gray">N/A</font>
                </td>
            </tr>
            <tr>
                <td class="uniqueborder" align="left">
                    <p style="margin: 0pt; "><span class="bluebold">1. Expected</span></p>
                </td>
                <td class="uniqueborder" align="center" width="10%">
                    <font color="gray">N/A</font>
                </td>
            </tr>
        </tbody>
    </table>
    <table class="uniqueborder" width="100%" bordercolor="#CBCBCB" cellpadding="0" cellspacing="0">
        <tbody>
            <tr>
                <td class="uniqueborder" align="left">
                    <p style="margin: 0pt; "><span class="bluebold">1. Test input:</span></p>
                </td>
                <td class="uniqueborder" align="center" width="10%">
                    <font color="gray">N/A</font>
                </td>
            </tr>
            <tr>
                <td class="uniqueborder" align="left">
                    <p style="margin: 0pt; "><span class="bluebold">1. Expected</span></p>
                </td>
                <td class="uniqueborder" align="center" width="10%">
                    <font color="gray">N/A</font>
                </td>
            </tr>
        </tbody>
    </table>
    <table class="box" width="100%" bordercolor="#CBCBCB" cellpadding="0" cellspacing="0">
        <tbody>
            <tr>
                <td class="uniqueborder" align="left">
                    <p style="margin: 0pt; "><span class="bluebold">1. Test input:</span></p>
                </td>
                <td class="uniqueborder" align="center" width="10%">
                    <font color="gray">N/A</font>
                </td>
            </tr>
            <tr>
                <td class="uniqueborder" align="left">
                    <p style="margin: 0pt; "><span class="bluebold">1. Expected</span></p>
                </td>
                <td class="uniqueborder" align="center" width="10%">
                    <font color="gray">N/A</font>
                </td>
            </tr>
    
        </tbody>
    </table>

    【讨论】:

      【解决方案3】:

      首先你尝试调用函数 show('box');这不存在。您应该将调用重命名为 showMe('box');

      第二个问题是执行顺序。基本上所有加载的内容都会立即执行。在您的情况下,首先定义的是函数 showMe()。之后立即调用它(见上文)。现在出现的问题是该函数应该访问的HTML元素还没有被渲染。

      所以函数 showMe('box') 的初始调用应该在 HTML 元素被渲染之后完成。您可以通过在页面末尾在单独的脚本标签或 onload 方法的正文标签中进行调用来做到这一点。

          <body onload="showResults('box')">
          ...
          </body>
      
      

      基本上,您应该使用有意义的变量和函数名称(例如,“resultVisible”而不是“vis”或“showResults”而不是“showMe”)并将它们与正确的类型一起使用,例如布尔值(真/假)。

      我会在复选框中添加一个 ID 而不是名称。由于您只有其中一个,因此您可以节省大量脚本来确定复选框是否已设置。您还可以缩短控制可见性的部分。

         function showResults(cls) {
            var checked = document.getElementById('c1').checked;
      
            var elements = document.getElementsByClassName(cls);
            for (let e of elements) {
                e.style.display = (checked) ? 'table' : 'none';
            }
         }
      

      【讨论】:

        猜你喜欢
        • 2018-09-25
        • 2015-07-28
        • 1970-01-01
        • 2013-06-21
        • 2019-08-11
        • 1970-01-01
        • 1970-01-01
        • 2011-03-12
        • 1970-01-01
        相关资源
        最近更新 更多