以下是我通过谷歌帐户创建页面随机自动选择出生月份的代码片段。
月份是通过下拉列表生成的,并且具有合适的ID,即1 = 1月2日= 2月等。
我已尝试将myArray中的值更改为实际月份(1月,2月等),但也没有运气。
我哪里出错了?或者这不是它的完成方式吗?
非常感谢任何帮助。
//Get select object
var objSelect = document.getElementById("BirthMonth");
var myArray = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'];
var rand = myArray[Math.floor(Math.random() * myArray.length)];
//Set selected
setSelectedValue(objSelect, "myArray");
function setSelectedValue(selectObj, valueToSet) {
for (var i = 0; i < selectObj.options.length; i++) {
if (selectObj.options[i].text== valueToSet) {
selectObj.options[i].selected = true;
return;
}
}
}
答案 0 :(得分:0)
var objSelect = document.getElementById("BirthMonth");
objSelect
DOM元素没有像您正在使用的options
数组一样访问。
var myArray = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'];
月份元素的ID值实际为:1
- :9
,然后是:a
- :c
。
包含所选月份值的隐藏字段为HiddenBirthMonth
。月份字段的标题元素的标识为:0
,需要将其设置为相应的月标题。我们可以从month元素的textContent
属性中获取它。
令人烦恼的是,在您单击下拉列表之前,不会呈现单个月元素。为了解决这个问题,我创建了一个函数,在继续之前快速触发mousedown
事件两次。
工作解决方案:
function setRandomBirthMonth() {
var hiddenMonthField = document.getElementById("HiddenBirthMonth");
var selectedMonthCaption = document.getElementById(":0");
var monthIds = [':1', ':2', ':3', ':4', ':5', ':6', ':7', ':8', ':9', ':a', ':b', ':c'];
var randomMonth = monthIds[Math.floor(Math.random() * monthIds.length)];
// month options don't render until a 'mousedown' event, so let's simulate it
if (document.getElementById(randomMonth) == null) forceRenderOfMonths();
var selectedMonth = document.getElementById(randomMonth);
hiddenMonthField.value = randomMonth;
selectedMonthCaption.setAttribute("aria-posinset", randomMonth);
selectedMonthCaption.textContent = selectedMonth.textContent;
function forceRenderOfMonths() {
var select = document.getElementsByClassName("jfk-select")[0];
var clickEvent = document.createEvent('MouseEvents');
clickEvent.initEvent("mousedown", true, true);
select.dispatchEvent(clickEvent);
clickEvent.initEvent("mousedown", true, true);
select.dispatchEvent(clickEvent);
}
}
setRandomBirthMonth();