【问题标题】:document.getElementById().style.display = "block" doesnt work in same function as document.getElementById().innerTextdocument.getElementById().style.display = "block" 与 document.getElementById().innerText 的功能不同
【发布时间】:2021-05-18 07:20:13
【问题描述】:

我有一个简单的表单,它在提交时调用函数“activate_loading”。 “activate_loading”包含两行代码,用于显示加载微调器并将提交按钮的文本更改为“请稍候”:

        document.getElementById("loader_mini").style.display = "block";

将加载微调器的显示从 display:none 更改为 display: block。

        document.getElementById("submitBtn").innerText = "Please Wait...";

将按钮的 innerText 更改为“请稍候”而不是“提交”

每一行都可以单独运行,但是放在一起时,加载微调器的显示不会从 display:none 变为 display: 块。好像那行

        document.getElementById("submitBtn").innerText = "Please Wait...";

原因

        document.getElementById("loader_mini").style.display = "block";

不工作。

  1. 我试过换行,结果相同 结果。
  2. 我试过 .style.visibility="visible";而不是显示:块-> 结果相同。
  3. 我还注意到从 按钮元素。代码运行良好。
  4. 我尝试切换浏览器,但结果还是一样(在 chrome 和 firefox 上尝试过)

有人知道问题是什么吗?我真的很感激这方面的任何帮助。代码看起来很简单,但我似乎看不出是什么导致了问题。

    function activate_loading() {

            document.getElementById("loader_mini").style.display = "block"; 
            document.getElementById("submitBtn").innerText = "Please Wait...";
       }
#loader_mini{
        width: 20px;
        height: 20px;
        border: 2px solid blue;
        border-top: 2px solid white;
        border-left: 1px solid white;
        border-bottom: 0px solid white;
        border-radius: 50%;
        -webkit-animation: spin 1.2s linear infinite;
        animation: spin 1.2s linear infinite;
        display: none;
      }
        
      @-webkit-keyframes spin {
        0% {
          -webkit-transform: rotate(0deg);
        }
        100% {
          -webkit-transform: rotate(360deg);
        }
      }
        
      @keyframes spin {
        0% {
          transform: rotate(0deg);
        }
        100% {
          transform: rotate(360deg);
        }
      }
<form id="form" method="post" class="hide_<?=$sent_status_show?>"
         onsubmit="activate_loading()">
         <label for="email">Email Address:</label>
         <input type="email" name="email"/>
         <br>
         <label for="subject">Email Subject:</label>
         <textarea name="subject"></textarea>
         <br>
         <button id="submitBtn" class="submitBtn" type="submit">
            Submit
            <div id="loader_mini">
            </div>
         </button>
     </form>

【问题讨论】:

  • 使用return语句onsubmit="return activate_loading()" 然后在做同样的事情后传递true或false。
  • &lt;div id="loader_mini"&gt;inside 你的按钮。当您编辑按钮的innerText 时,它会将里面的所有内容替换为"Please Wait...",包括&lt;div id="loader_mini"&gt;

标签: javascript html forms getelementbyid onsubmit


【解决方案1】:

您的代码有两个问题:

  1. 您不会停止表单提交,因此您看不到任何变化,因为页面发生了变化。

  2. 您需要在更改文本后添加加载器,否则文本将删除加载器。

我做了什么?

删除内联 onchange 并直接添加一个函数(更“优雅”的代码),然后我添加 event.preventDefault(); 以停止提交。 下一步是更改元素innerHTML 的位置(原为innerText,但更改为添加加载器)。

form.onsubmit = function(event)
{
  event.preventDefault();
  activate_loading();
};
function activate_loading() {            
  document.getElementById("submitBtn").innerHTML = "Please Wait...<div id='loader_mini'></div>";
  document.getElementById("loader_mini").style.display = "block"; 
}
#loader_mini{
        width: 20px;
        height: 20px;
        border: 2px solid blue;
        border-top: 2px solid white;
        border-left: 1px solid white;
        border-bottom: 0px solid white;
        border-radius: 50%;
        -webkit-animation: spin 1.2s linear infinite;
        animation: spin 1.2s linear infinite;
        display: none;
      }
        
      @-webkit-keyframes spin {
        0% {
          -webkit-transform: rotate(0deg);
        }
        100% {
          -webkit-transform: rotate(360deg);
        }
      }
        
      @keyframes spin {
        0% {
          transform: rotate(0deg);
        }
        100% {
          transform: rotate(360deg);
        }
      }
<form id="form" method="post" class="hide_<?=$sent_status_show?>">
         <label for="email">Email Address:</label>
         <input type="email" name="email"/>
         <br>
         <label for="subject">Email Subject:</label>
         <textarea name="subject"></textarea>
         <br>
         <button id="submitBtn" class="submitBtn" type="submit">
            Submit            
         </button>
     </form>

【讨论】:

  • 附言。如果您需要在执行所需操作时提交,请在第一个函数上使用 form.submit();
  • 我没有添加 event.preventDefault();因为我希望我的表单提交。我希望页面在重定向之前加载时出现微调器和“请稍候..”文本(尤其是在互联网连接不佳的情况下)
  • 或者最好按照您提供的 event.preventDefault();然后包括 form.submit();为了让它像我想要的那样提交?
  • 不,没关系:)
【解决方案2】:

.innerText 替换按钮内的所有内容,包括加载器元素。

这就是当你使用 innerText 时加载器消失的原因。解决方案是在按钮内有两个元素。一个用于文本,一个用于加载程序。所以当你使用.innerText时,你可以在文本元素上使用它而不是整个按钮。

【讨论】:

  • 感谢您的解释。说得通。我尝试通过在按钮文本中添加 并更改跨度的互文。
猜你喜欢
  • 2020-04-09
  • 2013-08-31
  • 2011-12-04
  • 1970-01-01
  • 1970-01-01
  • 2011-05-03
  • 1970-01-01
  • 2012-10-22
  • 1970-01-01
相关资源
最近更新 更多