【问题标题】:Cannot read property 'Value'无法读取属性“值”
【发布时间】:2015-03-29 11:13:10
【问题描述】:

我一天中的大部分时间都在试图解决这个问题。 一点背景:我正在设计一个多步表单,其中一个步骤是在两个选项之间进行选择(都是单选按钮)。

例如,第一步是选择性别“男性”或“女性”,第二步是在文本输入中输入一些内容。 我遇到的问题是,当我选择性别时,它没有进入第二步。我也遇到了一个问题,它确实进入了第二步,但返回的值是“未识别的”。

$('#gpadding input:radio').addClass('input_hide');
$('label').click(function() {
   $(this).addClass('selected').siblings().removeClass('selected');
});

var gender, fname, lname;
function _(x) {
   return document.getElementById(x);
}

function next1() {
      gender = _("gender").value;
      _("step1").style.display = "none";
      _("step2").style.display = "block";
}

function next2() {
   fname = _("firstname").value;
   lname = _("lastname").value;
      _("step2").style.display = "none";
      _("show_all_data").style.display = "block";
      _("display_gender").innerHTML = gender;
      _("display_fname").innerHTML = fname;
      _("display_lname").innerHTML = lname;
}
<div class="step" id="step1">
  <h3>Gender</h3>
  <div>
     <div class="gender-box">
        <div id="gpadding">
           <input type="radio" name="gender" id="gender" value="m" />
           <label for="malereg"><img src="images/icons/male-register.png" /><span>MALE</span></label>
           <input type="radio" name="gender" id="gender" value="f" />
           <label for="femalereg"><img src="images/icons/female-register.png" /><span>FEMALE</span></label>
        </div>
     </div>
     <button onclick="next1()">Next</button>
     <button id="bstep" class="md-close">Close</button>
     <div class="clearfix"></div>
  </div>
  </div>
  <div class="step" id="step2">
  <h3>Name</h3>
  <div>
     <input type="text" id="firstname" name="firstname" />
     <input type="text" id="lastname" name="lastname" />
     <button onclick="next2()">Next</button>
     <button id="bstep" class="md-close">Close</button>
     <div class="clearfix"></div>
  </div>
  </div>
  <div class="step" id="show_all_data">
  <h3>Complete</h3>
     <span id="display_gender"></span> <br />
     <span id="display_fname"></span> <br />
     <span id="display_lname"></span> <br />
     <button onlick="submitForm()">Register</button>
     <button id="bstep" class="md-close">Close</button>
  </div>

【问题讨论】:

  • 你有什么问题?
  • HTML 不允许 &lt;div&gt;&lt;label&gt; 范围内
  • 当你的标签都没有“gender”作为id时,你怎么能要求getElementById(“gender”)?
  • 也没有show_datadisplay_genderdisplay_input元素。
  • 您在代码中访问的ID都不存在。

标签: javascript forms radio-button multi-step


【解决方案1】:
  • 您不能在&lt;label&gt; 中使用&lt;div&gt;
  • 确保 ID 您所定位的选择器确实存在
  • 无需使用forid 属性,您就可以将所有需要的内容包装在标签中:

function _(x)  { return document.getElementById(x); }
function _n(x) { return document.getElementsByName(x); } //Needed to get elements by Name

var gender, input;

function next1() {
  var radio = _n("gender"); // get the elements by Name !!

  for (var i=0, j=radio.length; i<j; i++) { // Loop all radio buttons
    if (radio[i].checked) {                 // If one is Checked...
        gender = radio[i].value;            // All fine
        _("step1").style.display = "none";
        _("step2").style.display = "block";
        break;                              // and exit the loop.
    }
  }
  if(!gender) return alert("Please select a gender"); // If no value, alert something
}

function next2() {
  input = _("input").value; // Use the right ID !!!!!
  if(!input) return alert("Please enter your name");

  _("step2").style.display = "none";
  _("show_data").style.display = "block";
  _("display_gender").innerHTML = gender;
  _("display_input").innerHTML = input;
}
label{display:block;}
#step1, #step2m #show_data{
  background:#eee;
  width:200px;
  padding:30px;
}
#step2, #show_data{display:none;}
    <div id="step1">
      <label>
        <input type="radio" name="gender" value="m">
        <img src="images/icon/male.png" />
        <span>MALE</span>
      </label>
      <label>
      <input type="radio" name="gender" value="f">
        <img src="img/icon/female.png">
        <span>FEMALE</span>
      </label>
      <button onclick="next1()">Next</button>
    </div>
    
    <div id="step2">
      <label>
        Enter your name:
        <input type="text" id="input" name="input">
      </label>
      <button onclick="next2()">Next</button>
    </div>
    
    <div id="show_data">
      <p id="display_gender"></p>
      <p id="display_input"></p>
    </div>

【讨论】:

  • 感谢您花时间纠正这一切。不幸的是,再一次,无论我单击什么单选按钮,即使我选择了女性,返回值始终是男性的“m”。
  • 抱歉,我是这个网站的新手 :) 这到底是怎么回事?我在做什么错大声笑....我也将您的确切代码输入了我的网站...
  • 叫我白痴。我将两个值都设置为“m”。哈哈哈你的代码也很好用。谢谢大佬!
【解决方案2】:

也许将您的代码更改为:

function next1() {

   var gender_controls = document.getElementsByName("gender");
   gender = gender_controls[0].checked ? gender_controls[0].value : gender_controls[1].value;

  _("step1").style.display = "none";
  _("step2").style.display = "block";
}

【讨论】:

  • getElementById 不返回数组。 ID 必须是唯一的,所以这只会返回一个节点。
  • 感谢您的回复。有了这个,当我单击“下一步”时没有任何反应。我检查了控制台,那里的错误非常相似。但这次“无法读取未定义的属性‘已检查’”。
  • 抱歉,getElementById 确实返回了一个元素。
  • 已经测试了gender = _("gender").value;(在最新的 chrome 上)并且第一个性别控制从 DOM 返回,无论是否被检查。换句话说,该值始终为 'm' 我可以建议一种稍微不同的方法 - 将更新我的答案。
  • 已更新我的答案(并对其进行了测试)。我在 chrome 中没有收到任何错误,而且多步骤似乎表现正确
猜你喜欢
  • 2021-02-01
  • 2013-07-19
  • 2023-03-11
  • 1970-01-01
  • 1970-01-01
  • 2011-08-25
  • 2017-02-17
  • 2018-05-23
  • 1970-01-01
相关资源
最近更新 更多