【问题标题】:How to clear innerHTML of spans如何清除跨度的innerHTML
【发布时间】:2018-01-13 15:25:42
【问题描述】:

我在 html 中有一个基本表单,当用户留下空白字段时,我会在我通过 javascript 创建的 span 中显示一条消息,到目前为止一切都很好。但是如果我一次又一次点击“提交”按钮,消息就会一次又一次地打印在已经打印的消息之上,我的意思是重叠。

我试过 element.innerHTML = '';和this。也许我执行得不好,因为它不起作用。

var myForm = document.getElementsByTagName('form')[0];
var formFields = document.getElementsByTagName('label');

myForm.addEventListener('submit', function(){
  event.preventDefault(); 
    var statusMessageHTML = [];     
    // create empty spans
    for(i = 0; i < formFields.length; i++){
      statusMessageHTML[i] = document.createElement('span');
        statusMessageHTML[i].className = 'status-field-message';
      formFields[i].appendChild(statusMessageHTML[i]);     
    }
    // print a string in empty spans
    for(i = 0; i < formFields.length; i++){
      statusMessageHTML[i].innerHTML = "Error Message"
    }      
  return false;
});

PD:我想用纯 JavaScript 解决这个问题。

CODEPEN

【问题讨论】:

    标签: javascript


    【解决方案1】:

    为了防止这种情况,您可以提前创建并附加那些spans,然后在单击提交按钮时修改它们的文本。

    例如,重新排列您的代码如下:

    var myForm = document.getElementsByTagName('form')[0];
    var formFields = document.getElementsByTagName('label');
    
    // create empty spans in advance
    var statusMessageHTML = [];
    for(var i = 0; i < formFields.length; i++) {
      statusMessageHTML[i] = document.createElement('span');
      statusMessageHTML[i].className = 'status-field-message';
      formFields[i].appendChild(statusMessageHTML[i]);
    }
    
    myForm.addEventListener('submit', function(event) {
      event.preventDefault();
      
      // change the text of spans
      for(var i = 0; i < formFields.length; i++)
        statusMessageHTML[i].textContent = 'Error Message';
    });
    

    注意:

    • 在使用函数之前,您必须在函数的参数中包含相应的变量名称(即event)。
    • 在您的情况下,span.textContent 可能比 span.innerHTML 更可取。
    • addEventListener的回调函数中返回值是没有意义的。返回的值被简单地丢弃。
    • 在使用之前声明所有变量(例如,i)是一种很好的做法。
    • 您也可以直接在 HTML 中构造这些 spans,因为它们在结构中是一种“静态”。

    更新

    如果我理解正确,你更喜欢:

    • 在用户第一次提交时创建那些spans 作为占位符。
    • 当收到ajax请求的响应时,重写spans中的值。
    • 如果多次点击提交按钮,只需清除spans中之前的值即可,后续流程不变。

    那么我相信您只需将整个部分包装在 if-else 块中:

    var myForm = document.getElementsByTagName('form')[0];
    var formFields = document.getElementsByTagName('label');
    var statusMessageHTML = [];
    var isFirstSubmit = true;
    
    myForm.addEventListener('submit', function(event) {
      event.preventDefault();
    
      if(isFirstSubmit) {
    
        // create empty spans
        for(var i = 0; i < formFields.length; i++) {
          statusMessageHTML[i] = document.createElement('span');
          statusMessageHTML[i].className = 'status-field-message';
          formFields[i].appendChild(statusMessageHTML[i]);
        }
        
        isFirstSubmit = false;
        
      } else {
        
        // clear previous values
        for(var i = 0; i < formFields.length; i++)
          statusMessageHTML[i].textContent = '';
          
      }
    });
    

    并在收到响应时重写值(可能包装在回调函数中,因为它是 AJAX 请求):

    function callback(response) {
      for(var i = 0; i < formFields.length; i++)
        statusMessageHTML[i].textContent = /*values in response*/;
    }
    

    【讨论】:

    • 感谢@Microloft 的回答,这是防止这种情况的唯一方法吗?一般来说,我是开发新手,所以如果我错了,请纠正我。我更愿意将创建代码保留在提交函数中,因为这种方式仅在用户提交表单时才创建(在此之前不需要有这些跨度),这样初始页面加载会有点.... 快点?我的意思是,一点点。这就是为什么我宁愿只在它们有用时才创建这些跨度的原因(以在用户提交表单时显示错误消息)。
    • 我明白你的意思,但我仍然不清楚你想要完成什么。如果多次单击提交按钮,您是要删除现有的spans 并创建一个全新的集合,还是跳过该部分?如果用户最终提交成功,你是否也要删除那些现有的spans?
    • 理想情况下,我只想在从 php 发送错误消息时创建跨度,但是我也需要在 js 中进行验证,对吗?而且我更喜欢在这个表单中只使用带有ajax的php(我知道我的代码中没有一个,我只是把“错误消息”作为例子来保存行)。所以,为了回答这个问题,如果多次点击提交按钮,我想先清除跨度的innerHTML,然后在其中重写从我的ajax请求返回的值(目前,如果我的php检测到没有错误只需发送一个空字符串。顺便说一句,我不知道这是否是一个好习惯)。
    • 感谢@Microloft 的帮助,现在它可以按我的意愿工作了。也感谢您的建议。
    猜你喜欢
    • 1970-01-01
    • 2018-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多