JavaScript: element.setAttribute(attribute,value) , element.attribute=value & element.[attribute]=value 不改变属性值

JavaScript: element.setAttribute(attribute,value) , element.attribute=value & element.[attribute]=value not changing attribute value

我的任务是在用户单击输入框时从输入框中删除占位符并使标签可见。 如果用户未在其中再次填写任何内容,请放回占位符并使标签不可见。

我可以隐藏它但不能重新分配它。 我试过 element.setAttribute(attribute,value) , element.attribute=value & element.[attribute]=value type 但不起作用。

我保留了 <label> 的默认值 visibility "hidden"

我已经为任务创建了 hide() 和 show() 函数,它们都有 2 个参数,即

  1. 输入框的id
  2. 标签的id

代码JavaScript:

var placehlder;


function hide(input_id,lbl){
            var e1=document.getElementById(input_id);
            placehlder=e1.getAttribute('placeholder');
            /*document.write(placehlder);*/
            e1.placeholder="";
            var e2=document.getElementById(lbl);
            e2.style.visibility="visible";
        }
function show(input_id,lbl){
            var e1=window.document.getElementById(input_id).value;
            var e2=document.getElementById(lbl);
            /*document.write(placehlder);*/
            if (e1.length ==0) 
            {
                e2.style.visibility="hidden";
                e1.placeholder=placehlder;
                /*e1.setAttribute('placeholder',placehlder);*/
                /*e1['placeholder']=placehlder;*/
            }
     }

代码HTML:

<form>
        <label id="first" >First Name</label><br/>
        <input id="box" type="text" placeholder="First Name" onclick="hide(id,'first')" onfocusout="show(id,'first')"/>

</form>

完整代码:HTML + CSS + JAVASCRIPT:

        var placehlder;
        function hide(input_id,lbl){
            var e1=document.getElementById(input_id);
            placehlder=e1.getAttribute('placeholder');
            /*document.write(placehlder);*/
            e1.placeholder="";
            var e2=document.getElementById(lbl);
            e2.style.visibility="visible";
        }
        function show(input_id,lbl){
            var e1=window.document.getElementById(input_id).value;
            var e2=document.getElementById(lbl);
            /*document.write(placehlder);*/
            if (e1.length ==0) 
            {
                e2.style.visibility="hidden";
                e1.placeholder=placehlder;
                /*e1.setAttribute('placeholder',placehlder);*/
                /*e1['placeholder']=placehlder;*/
            }
        }
  
        #first{

            visibility: hidden;
        }
        #box{

        }
<!doctype html>
<html>
<head>
    <meta charset="utf-8"/>
    <title>
        Functions
    </title>

    

</head>
<body>
    <form>
        <label id="first" >First Name</label><br/>
        <input id="box" type="text" placeholder="First Name" onclick="hide(id,'first')" onfocusout="show(id,'first')"/>

    </form>
</body>
</html>

编辑 1: 在@Darlesson 的回答中,我已经使用 CSS 解决了我的问题。 但如果可能的话,请告诉我的代码有什么问题。 编辑 2: 正如@lenilsondc 所指出的,我的代码没有工作,因为 var e1 没有元素,但是元素的 value attribute

var e1=window.document.getElementById(input_id).value;

替换为

var e1=window.document.getElementById(input_id);

曾与e1.placeholder=placehlder;

合作过

我建议使用 CSS 作为占位符部分:

:focus::placeholder{
    opacity: 0;
}

:focus::placeholder {
    opacity: 0;
}
<input placeholder="Visible">

你可以不使用任何 JS,只需要 HTML/CSS 类似的东西;

.group {
  display: flex;
}

.group label {
  display: none;
  order: 1;
}

.group input {
  order: 2;
  display: block;
}
.group input:focus ~ label {
  display: block;
}

/* 
   note: browser compatibility is only ~82% 
   https://caniuse.com/#feat=css-placeholder
*/
.group input:focus::placeholder {
  color: transparent;
}
<div class="group">
  <input type="text" id="id1" placeholder="Description">
  <label for="id1">Description</label>
</div>

如果出于兼容性原因您无法使用 css () 执行此操作,您可以使用 javascript.

按照以下代码片段执行此操作

诀窍是存储旧的占位符,以便在需要恢复时可以使用它。在这种情况下,我使用了一个新属性 data-placeholder,我在其中存储当前值并清除真实的 placeholder 属性。最后,当元素失去焦点时,您可以获取属性 data-placeholder 并用它重置真正的 placeholder 值。

var myInputLabel = document.getElementById('myInputLabel');
var myInput      = document.getElementById('myInput');

// when element gets focused
myInput.addEventListener('focus', function (e) {

  // save current placeholder
  myInput.setAttribute('data-placeholder', myInput.getAttribute('placeholder'));
 
  // clear current placeholder 
  myInput.setAttribute('placeholder', '');
  
  // show label
  myInputLabel.style.display = 'inline';
});

// when element gets blured
myInput.addEventListener('blur', function (e) {

  // restore the placeholder stored on data-placeholder
  myInput.setAttribute('placeholder', myInput.getAttribute('data-placeholder'));
  
  // hide label
  myInputLabel.style.display = 'none';
});
<form>
  <label id="myInputLabel" style="display: none;">Name</label><br>
  <input type="text" id="myInput" placeholder="Name">
</form>

 var input = document.getElementById("box");
 var label = document.getElementById("first");

 // When the user clicks on the input element
 input.addEventListener("focus", function() {

  // Make label visible
  first.style.visibility = "visible";

  // Remvoe placeholder
  input.placeholder = "";
 });

 // When the user clicks away
 input.addEventListener("focusout", function() {
 
  // Check if he did not typed anything
  if (input.value === "") {
   // Restore placeholder value and hide label
   input.placeholder = "First Name";
   first.style.visibility = "hidden";
  }

 });
       #first{

            visibility: hidden;
        }
<!doctype html>
<html>
<head>
    <meta charset="utf-8"/>
    <title>
        Functions
    </title>

    <style>
        #first{

            visibility: hidden;
        }
 </style>

</head>
<body>
    <form>
        <label id="first" >First Name</label><br/>
        <input id="box" type="text" placeholder="First Name" />

    </form>
    
    </body>
</html>