【问题标题】:HTML form button not working properlyHTML 表单按钮无法正常工作
【发布时间】:2018-02-07 12:03:06
【问题描述】:

我正在用 HTML 和 JavaScript 构建一个闹钟。

我有一个播放歌曲playSound(soundfile) 的函数,还有一个在给定时间调用playSound 函数Acordar(h, m) 的函数。这两个都可以自己正常工作。

我还有一个表单,我在其中输入小时和分钟,当我按下保存按钮时,它会调用 Acordar 并给出小时和分钟。

问题是,当我以这种方式调用Acordar 时,声音立即播放(它不会在播放声音之前等待请求的时间)。但是,正如我之前提到的,这两个函数都可以单独运行。

这是我的代码:

playSound 函数:

function playSound(soundfile) {
    document.getElementById("dummy").innerHTML= "<embed 
src=\""+soundfile+"\" hidden=\"true\" autostart=\"true\" loop=\"false\" />";
}

Acordar 函数:

function Acordar(h, m) {
    var now = new Date();
    var espera = new Date(now.getFullYear(), now.getMonth(), now.getDate(), h, m, 0, 0) - now;
    if (espera < 0) {
        espera += 86400000;
    }
    setTimeout(function() {
        document.getElementById("dummy").innerHTML="<embed src=\""+'starwars.mp3'+"\" hidden=\"true\" autostart=\"true\" loop=\"false\" />";
        }, espera);
}

这是我的 HTML 表单:

<div class="defTime" id="defTime">
<label id="hora" for="hora"></label>
<select size="1" id="hora" name="hora">
    <option value="1">1</option>
    <option value="2">2</option>
    <option value="3">3</option>
    <option value="4">4</option>
    <option value="5">5</option>
    <option value="6">6</option>
    <option value="7">7</option>
    <option value="8">8</option>
    <option value="19">9</option>
    <option value="10">10</option>
    <option value="11">11</option>
    <option value="12">12</option>
    <option value="13">13</option>
    <option value="14">14</option>
    <option value="15">15</option>
    <option value="16">16</option>
    <option value="17">17</option>
    <option value="18">18</option>
    <option value="19">19</option>
    <option value="20">20</option>
    <option value="21">21</option>
    <option value="22">22</option>
    <option value="23">23</option>
    <option value="24">24</option>
</select>
<label for="minuto"></label>
<select size="1" id="minuto" name="minuto">
    <option value="0">0</option>
    <option value="5">5</option>
    <option value="10">10</option>
    <option value="15">15</option>
    <option value="20">20</option>
    <option value="25">25</option>
    <option value="30">30</option>
    <option value="35">35</option>
    <option value="40">40</option>
    <option value="45">45</option>
    <option value="50">50</option>
    <option value="55">55</option>
</select>

<button id="save" type="submit" style="border: 0; background: transparent" class="save" onclick="Acordar(hora.value, minuto.value)"><img src="save.png" width="50" height="50" alt="submit"  />

【问题讨论】:

  • 为什么要插入 embed 标签而不是使用 HTML5 音频 API?
  • @Toastrackenigma 正如我所说,我不是一个非常熟练的 html 程序员 :) 我会看看,也许它可以解决我的问题,谢谢 :)
  • 在这种情况下它不会解决您的问题,但是 embed 旨在将内容从插件添加到您的页面 - 您不需要使用它用于音频,因为既有 audio 标记,也有用于音频的 JavaScript API。我建议您查看它们(请参阅 herehere),因为它们还允许您在播放音频时进行更多控制。

标签: javascript html forms function button


【解决方案1】:

问题在于您传递的小时值是undefined,因为您有两个具有相同id 的元素。 ids 必须是唯一的

从以下位置更改或删除您的 id 属性: &lt;label id="hora" for="hora"&gt;&lt;/label&gt;

【讨论】:

    【解决方案2】:

    问题与解决方案

    首先,您需要从您的第一个&lt;label&gt; 中删除horaid 才能正常工作。 id 是唯一标识符,因此要求您在任何给定页面上仅使用相同的 id 一次。


    您不能像在表单中那样访问 HTML 元素。

    要获取 ID 为 hora 的选择的值,请使用 hora.value,而应使用 document.getElementById("hora").value

    您使用的语法是您尝试调用变量方法时使用的语法。但是,在这种情况下,该变量不存在。

    如果您在 JavaScript 代码中声明了变量(在所有内容加载后),它工作。

    var hora;
    var minuto;
    window.onload = function() {
        hora = document.getElementById("hora");
        minuto = document.getElementById("minuto");
    }
    

    或者如果你只是简单地使用:

    <button id="save" type="submit" style="border: 0; background: transparent" class="save" onclick="Acordar(document.getElementById("hora").value, document.getElementById("minuto").value)"><img src="save.png" width="50" height="50" alt="submit"  />
    

    那么,为什么声音会立即播放?

    变量horaminuto 未定义,您尝试访问它们。这会在 JavaScript 中返回 undefined 值。

    当您尝试在需要数字的上下文中使用 undefined 时,它会将其转换为 0

    所以,您调用 Acordar 时使用了两个 undefined 值,这两个值都变为 0,因此它在 0 小时和 0 分钟内运行了该函数,因此它看起来好像被立即调用了。

    【讨论】:

    • 您可以使用字段名称/id 来访问其在事件函数中的值,这可能不是最好的方法,但它是合法的,至少在表单中是这样。未定义是因为标签也具有“hora”ID,并且标签没有值属性(如果您尝试代码,只有小时未定义,但分钟已定义)。实际上,如果您不更改 id 而是在 select 之后移动标签的定义,它会起作用,因为 getElementById() 现在返回选择(当两个元素具有相同的 id 时,它似乎返回第一个)。跨度>
    • 谢谢!解决了我的问题,我实际上学到了一些东西!干杯:)
    • @AlbertoMartinez 好吧,我不知道 - 我认为 document.getElementById() 总是需要的!你每天都会学到新东西!
    • @Toastrackenigma 我也会使用document.getElementById(),但是使用fileld名称(是的,名称,而不是id!)是本世纪初访问表单字段值的方式......
    【解决方案3】:

    一些事情。

    1. 更改此行
      <label id="label" for="hora"></label>
      

        <label id="hora-label" for="hora"></label>
    

    原因:ID 在页面上必须是唯一的。

    1. 将此行更改为:

      document.getElementById("dummy").innerHTML= "<embed src=\""+soundfile+"\" hidden=\"true\" autostart=\"true\" loop=\"false\" />";
      

    到:

        document.getElementById("dummy").innerHTML = "<embed src=\""+ soundfile +"\" hidden=\"true\" autostart=\"true\" loop=\"false\" />";
    

    解决语法错误。

    1. 从以下位置更改此 HTML:

      <button id="save" type="submit" style="border: 0; background: transparent" class="save" onclick="Acordar(hora.value, minuto.value)"><img src="save.png" width="50" height="50" alt="submit"  />
      

    到:

        <button id="save" type="submit" style="border: 0; background: transparent" class="save" onclick="Acordar()"><img src="save.png" width="50" height="50" alt="submit"  />
    

    访问输入的语法不正确,可以在函数本身访问输入,如下所示:

        function Acordar() {
          var sH = document.getElementById("hora");
          var sM = document.getElementById("minuto");
          var nH = Number(sH.options[sH.selectedIndex].text);
          var nM = Number(sM.options[sM.selectedIndex].text);
          var now = new Date();
          var espera = new Date(now.getFullYear(), now.getMonth(), now.getDate(), nH, nM, 0, 0) - now;
    
          if (espera < 0) {
            espera += 86400000;
          }
    
          setTimeout(function() {
            document.getElementById("dummy").innerHTML = document.getElementById("dummy").innerHTML="<embed src=\""+'starwars.mp3'+"\" hidden=\"true\" autostart=\"true\" loop=\"false\" />";
          }, espera);
        }
    

    【讨论】:

    • 访问字段值的语法可能很旧,但它是正确的,至少在表单中使用时是正确的。您的选项也是正确的,但与这些字段相关,其原始形式是可重复使用的。
    猜你喜欢
    • 2021-11-21
    • 1970-01-01
    • 2021-01-17
    • 1970-01-01
    • 1970-01-01
    • 2013-11-11
    • 2011-09-20
    相关资源
    最近更新 更多