日期字段的年龄限制代码

Age restriction code on date field

电子烟出台了新法律,我必须检查顾客是否年满 18 岁。我在结账时添加了一个日期字段 select 框,要求他们填写出生日期。

我想知道您是否可以使用 javascript 将当前日期减去 18 年并将其设置为如果您未满该年龄则无法选择它。

我看了一圈,大型商业的所有年龄限制插件都是付费的,谁能提供解决方案?

<input type="hidden" class="FormFieldId" value="25"><input type="hidden" class="FormFieldFormId" value="2"><input type="hidden" class="FormFieldType" value="datechooser"><input type="hidden" class="FormFieldPrivateId" value="">
<div id="FormField_25" class="FormField">
  <select name="FormFieldMonth[2][25]" class="formFieldDate field-xsmall Age-reg FormFieldMonth">
  <option value="" selected="">---</option><option value="1">Jan</option><option value="2">Feb</option><option value="3">Mar</option><option value="4">Apr</option><option value="5">May</option><option value="6">Jun</option><option value="7">Jul</option><option value="8">Aug</option><option value="9">Sep</option><option value="10">Oct</option><option value="11">Nov</option><option value="12">Dec</option>
 </select>
  <select name="FormFieldDay[2][25]" class="formFieldDate field-xsmall Age-reg FormFieldDay">
  <option value="" selected="">--</option><option value="1">1st</option><option value="2">2nd</option><option value="3">3rd</option><option value="4">4th</option><option value="5">5th</option><option value="6">6th</option><option value="7">7th</option><option value="8">8th</option><option value="9">9th</option><option value="10">10th</option><option value="11">11th</option><option value="12">12th</option><option value="13">13th</option><option value="14">14th</option><option value="15">15th</option><option value="16">16th</option><option value="17">17th</option><option value="18">18th</option><option value="19">19th</option><option value="20">20th</option><option value="21">21st</option><option value="22">22nd</option><option value="23">23rd</option><option value="24">24th</option><option value="25">25th</option><option value="26">26th</option><option value="27">27th</option><option value="28">28th</option><option value="29">29th</option><option value="30">30th</option><option value="31">31st</option>
 </select>
  <select name="FormFieldYear[2][25]" class="formFieldDate field-xsmall Age-reg FormFieldYear">
  <option value="" selected="">----</option><option value="1917">1917</option><option value="1918">1918</option><option value="1919">1919</option><option value="1920">1920</option><option value="1921">1921</option><option value="1922">1922</option><option value="1923">1923</option><option value="1924">1924</option><option value="1925">1925</option><option value="1926">1926</option><option value="1927">1927</option><option value="1928">1928</option><option value="1929">1929</option><option value="1930">1930</option><option value="1931">1931</option><option value="1932">1932</option><option value="1933">1933</option><option value="1934">1934</option><option value="1935">1935</option><option value="1936">1936</option><option value="1937">1937</option><option value="1938">1938</option><option value="1939">1939</option><option value="1940">1940</option><option value="1941">1941</option><option value="1942">1942</option><option value="1943">1943</option><option value="1944">1944</option><option value="1945">1945</option><option value="1946">1946</option><option value="1947">1947</option><option value="1948">1948</option><option value="1949">1949</option><option value="1950">1950</option><option value="1951">1951</option><option value="1952">1952</option><option value="1953">1953</option><option value="1954">1954</option><option value="1955">1955</option><option value="1956">1956</option><option value="1957">1957</option><option value="1958">1958</option><option value="1959">1959</option><option value="1960">1960</option><option value="1961">1961</option><option value="1962">1962</option><option value="1963">1963</option><option value="1964">1964</option><option value="1965">1965</option><option value="1966">1966</option><option value="1967">1967</option><option value="1968">1968</option><option value="1969">1969</option><option value="1970">1970</option><option value="1971">1971</option><option value="1972">1972</option><option value="1973">1973</option><option value="1974">1974</option><option value="1975">1975</option><option value="1976">1976</option><option value="1977">1977</option><option value="1978">1978</option><option value="1979">1979</option><option value="1980">1980</option><option value="1981">1981</option><option value="1982">1982</option><option value="1983">1983</option><option value="1984">1984</option><option value="1985">1985</option><option value="1986">1986</option><option value="1987">1987</option><option value="1988">1988</option><option value="1989">1989</option><option value="1990">1990</option><option value="1991">1991</option><option value="1992">1992</option><option value="1993">1993</option><option value="1994">1994</option><option value="1995">1995</option><option value="1996">1996</option><option value="1997">1997</option><option value="1998">1998</option><option value="1999">1999</option><option value="2000">2000</option><option value="2001">2001</option><option value="2002">2002</option><option value="2003">2003</option><option value="2004">2004</option><option value="2005">2005</option><option value="2006">2006</option><option value="2007">2007</option><option value="2008">2008</option><option value="2009">2009</option><option value="2010">2010</option><option value="2011">2011</option><option value="2012">2012</option><option value="2013">2013</option><option value="2014">2014</option><option value="2015">2015</option><option value="2016">2016</option><option value="2017">2017</option><option value="2018">2018</option><option value="2019">2019</option><option value="2020">2020</option><option value="2021">2021</option><option value="2022">2022</option><option value="2023">2023</option><option value="2024">2024</option><option value="2025">2025</option><option value="2026">2026</option><option value="2027">2027</option><option value="2028">2028</option><option value="2029">2029</option><option value="2030">2030</option><option value="2031">2031</option><option value="2032">2032</option><option value="2033">2033</option><option value="2034">2034</option><option value="2035">2035</option><option value="2036">2036</option><option value="2037">2037</option><option value="2038">2038</option><option value="2039">2039</option><option value="2040">2040</option><option value="2041">2041</option><option value="2042">2042</option><option value="2043">2043</option><option value="2044">2044</option><option value="2045">2045</option><option value="2046">2046</option><option value="2047">2047</option><option value="2048">2048</option><option value="2049">2049</option><option value="2050">2050</option><option value="2051">2051</option><option value="2052">2052</option><option value="2053">2053</option><option value="2054">2054</option><option value="2055">2055</option><option value="2056">2056</option><option value="2057">2057</option><option value="2058">2058</option><option value="2059">2059</option><option value="2060">2060</option><option value="2061">2061</option><option value="2062">2062</option><option value="2063">2063</option><option value="2064">2064</option><option value="2065">2065</option><option value="2066">2066</option><option value="2067">2067</option><option value="2068">2068</option><option value="2069">2069</option><option value="2070">2070</option><option value="2071">2071</option><option value="2072">2072</option><option value="2073">2073</option><option value="2074">2074</option><option value="2075">2075</option><option value="2076">2076</option><option value="2077">2077</option><option value="2078">2078</option><option value="2079">2079</option><option value="2080">2080</option><option value="2081">2081</option><option value="2082">2082</option><option value="2083">2083</option><option value="2084">2084</option><option value="2085">2085</option><option value="2086">2086</option><option value="2087">2087</option><option value="2088">2088</option><option value="2089">2089</option><option value="2090">2090</option><option value="2091">2091</option><option value="2092">2092</option><option value="2093">2093</option><option value="2094">2094</option><option value="2095">2095</option><option value="2096">2096</option><option value="2097">2097</option><option value="2098">2098</option><option value="2099">2099</option><option value="2100">2100</option><option value="2101">2101</option><option value="2102">2102</option><option value="2103">2103</option><option value="2104">2104</option><option value="2105">2105</option><option value="2106">2106</option><option value="2107">2107</option><option value="2108">2108</option><option value="2109">2109</option><option value="2110">2110</option><option value="2111">2111</option><option value="2112">2112</option><option value="2113">2113</option><option value="2114">2114</option><option value="2115">2115</option><option value="2116">2116</option><option value="2117">2117</option>
 </select>
</div>

基于您粘贴的代码的完整示例。它正在处理闰年和所有

var months = ["","Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"],
  nth = function(d) {
    if (d > 3 && d < 21) return 'th'; 
    switch (d % 10) {
      case 1:return "st";
      case 2:return "nd";
      case 3:return "rd";
     default:return "th";
    }
  }

window.onload = function() {
  var date = new Date(),
    yyyy = date.getFullYear(),
    maxDate = new Date(yyyy - 18, date.getMonth(), date.getDate(), 0, 0, 0),
    maxYear = maxDate.getFullYear(),
    maxMonth = maxDate.getMonth() + 1,
    maxDay = maxDate.getDate(),
    dY = document.querySelector(".FormFieldYear"),
    dM = document.querySelector(".FormFieldMonth"),
    dD = document.querySelector(".FormFieldDay");

  for (var i = yyyy - 100, max = maxYear; i <= max; i++) {
    dY.options[dY.options.length] = new Option(i, i);
  }
  dY.onchange = function() {
    dM.options.length = 1;
    var year = this.value;
    if (this.value == "") return;
    for (var i = 1; i <= 12; i++) {
      if (year == maxYear && i > maxMonth) break;
      dM[dM.options.length] = new Option(months[i], i);
    }
  }
  dM.onchange = function() {
    dD.options.length = 1;
    var year = dY.options[dY.selectedIndex].value,
      month = this.value,
      lastDay = new Date(year,month,0).getDate();
    if (this.value == "") return;
    
    for (var i = 1; i <= lastDay; i++) {
      if (year == maxYear && i > maxMonth) break;
      dD[dD.options.length] = new Option(i+nth(i), i);
    }
  }
}
<div id="FormField_25" class="FormField">
  <select name="FormFieldMonth[2][25]" class="formFieldDate field-xsmall Age-reg FormFieldMonth">
    <option value="">--</option>
  </select>
  <select name="FormFieldDay[2][25]" class="formFieldDate field-xsmall Age-reg FormFieldDay">
    <option value="">--</option>
  </select>
  <select name="FormFieldYear[2][25]" class="formFieldDate field-xsmall Age-reg FormFieldYear">
    <option value="">----</option>
  </select>
</div>

一个快速但可能不是最好的解决方案是使用 HTML 输入日期类型和一些 javascript 代码。请注意,以下代码不适用于 firefox 和 IE 11 或以下版本。

下面是一个工作代码:

function getMaxDate() {
    var millisecondsIn18years = 568080000000;
    var ceil = new Date(Date.now() - millisecondsIn18years);
    var date = ceil.getDate();
    var month = String(ceil.getMonth() + 1);
    month = month.length > 1 ? month : '0' + month;
    var year = ceil.getFullYear();
    return year + '-' + month + '-'  + date;
}
document.getElementById('dob').max = getMaxDate();
<!DOCTYPE html>
<html>
<body>
<form>
  Birthday:
  <input type="date" name="bday" id="dob">
  <input type="submit">
</form>

</body>
</html>

由于我还不能发表评论,我只是想快速插话一下在美国在线销售电子烟和电子烟液的法律要求。

根据 2016 年 8 月通过的 FDA 法律,您必须检查在线购买的任何 27 岁以下客户的带照片的身份证件。

FDA 法律片段(屏幕截图):

FDA 法律片段(文本):

"...Therefore, the final rule states that retailers of the newly deemed covered tobacco products may not sell them to individuals under 18 years of age and requires retailers of covered tobacco products to verify the purchaser's birth date by reviewing the individual's photographic identification...."

"...a retailer is not required to verify the age of any person who is more than 26 years of age...."

"...Therefore, any sale of covered tobacco products over the Internet must comply with the minimum age and identification requirements in this rule."


你怎么知道某人是 27 岁以下还是 27 岁以上?

这里的法律是灰色的,但为了确保最大程度的合规性,最好的办法是简单地请求您网站上所有客户的照片身份证明

我推荐的手动流程是您将所有成功下达的订单搁置,并要求客户在销售点后通过电子邮件发送带照片的 ID。对于您已将照片 ID 存档的客户,您可以安全地完成他们的订单。

您怎么知道带照片的身份证件是否合法?

您可以要求拍摄并发送 3 张照片:

 1. The front of the photo ID. 
 2. The back of the photo ID. 
 3. A picture of the customer holding the ID near his/her face.

然后您可以访问数据库(尽管它要求您的业务经过审查和批准),您可以从那里访问客户的个人信息以确认和 his/her 身份(客户的地址、年龄等)通过将照片 ID 上的信息和 DOB 与身份数据库服务返回的结果进行交叉核对。

尽管此答案与您的 JavaScript 问题无关,但我希望发布此信息对某些人有用。