Baseline Widely available
type="date"
ç±»åç <input>
å
ç´ ä¼å建ä¸ä¸ªè®©ç¨æ·è¾å
¥ä¸ä¸ªæ¥æçè¾å
¥åºåï¼å¯ä»¥ä½¿ç¨èªå¨éªè¯å
å®¹çææ¬æ¡ï¼ä¹å¯ä»¥ä½¿ç¨ç¹æ®çæ¥æéæ©å¨çé¢ãç»æå¼å
æ¬å¹´ä»½ï¼æä»½åæ¥æï¼ä½ä¸å
æ¬æ¶é´ãtime å datetime-local ç±»åæ¯ææ¶é´åæ¥ææ¶é´è¾å
¥ã
<label for="start">Start date:</label>
<input
type="date"
id="start"
name="trip-start"
value="2018-07-22"
min="2018-01-01"
max="2018-12-31" />
label {
display: block;
font:
1rem "Fira Sans",
sans-serif;
}
input,
label {
margin: 0.4rem 0;
}
é常æ¥è¯´æ§ä»¶ç UI çé¢å æµè§å¨çä¸åèæååï¼å°ç®åä¸ºæ¢æ¤æ§ä»¶è¿ä¸è¢«æææµè§å¨æ¯æï¼å
·ä½ç»è请åé
æµè§å¨å
¼å®¹æ§ãå¨ä¸æ¯æçæµè§å¨å½ä¸ï¼æ§ä»¶å æ¤ä¼è¢«ä¼é
çé级为æ®éç <input type="text">
è¾å
¥æ¡ã
ä¸ä¸ªå符串ï¼ä»£è¡¨çè¾å ¥å°è¾å ¥æ¡çæ¥æå¼ãè¾å ¥çæ¥ææç §æ¥æåç¬¦ä¸²æ ¼å¼ææè¿°ç ISO8601 æ åè¿è¡æ ¼å¼åã
ä½ å¯ä»¥éè¿å¨ value
屿§ä¸å
嫿¥ææ¥ä¸ºè¾å
¥è®¾ç½®é»è®¤å¼ï¼å¦ä¸æç¤ºï¼
<input type="date" value="2017-06-01" />
夿³¨ï¼ æä¸ç¹éè¦æ³¨æçæ¯ï¼å¨æ ¼å¼æ¹é¢æ¾ç¤ºçæ¥æä¸å®é
ç value
ä¸ä¸æ ·ââæ¾ç¤ºçæ¥ææ ¼å¼åå³äºç¨æ·æµè§å¨çåºå设å®ï¼èç»è§£æç value
çæ ¼å¼å§ç»ä¸º yyyy-mm-dd
ã
å½ç¶ä½ ä¹å¯ä»¥éè¿ JavaScript 代ç è·åå设置 HTMLInputElement
ç value
å valueAsNumber
屿§ï¼ä¾å¦ï¼
const dateControl = document.querySelector('input[type="date"]');
dateControl.value = "2017-06-01";
console.log(dateControl.value); // prints "2017-06-01"
console.log(dateControl.valueAsNumber); // prints 1496275200000, a JavaScript timestamp (ms)
è¿è¡ä»£ç æ¥æ¾ type
为 date
ç第ä¸ä¸ª <input>
å
ç´ ï¼å¹¶ä¸å°å
¶å¼è®¾ç½®ä¸º 2017-06-01
ï¼2017 å¹´ 6 æ 1 æ¥ï¼ãç¨åå°ä»¥åç¬¦ä¸²åæ°åçå½¢å¼è¯»ååºè¿ä¸ªå¼ã
å¯¹äºææ <input>
å
ç´ ç大é¨åéç¨å±æ§ä¹å¯¹ date
è¾å
¥èµ·ä½ç¨ï¼ä½å¯è½ä¸ä¼å½±åå®ç表ç°ï¼å¦ size
å placeholder
屿§ãé¤äºå
±æå±æ§å¤ï¼date
è¾å
¥è¿æä¾ä»¥ä¸å±æ§ã
ææ¥åææ°çæ¥æã妿è¾å
¥å°è¯¥å
ç´ ä¸ç value
åç卿¤ä¹åï¼åå
ç´ å°æ æ³éè¿çº¦æéªè¯ã妿 max
屿§çå¼ä¸æ¯æ ¼å¼ä¸º yyyy-mm-dd
çæææ¥æææå符串ï¼å该å
ç´ æ²¡ææå¤§æ¥æå¼ã
å¦æåæ¶è®¾ç½®äº max
å min
å¼ï¼æ¤å¼å¿
é¡»æäºæçäº min
屿§æå®çæ¥æå¼ã
ææ¥åææ©çæ¥æã妿è¾å
¥å°è¯¥å
ç´ ä¸ç value
åç卿¤ä¹åï¼åå
ç´ å°æ æ³éè¿çº¦æéªè¯ã妿 min
屿§çå¼ä¸æ¯æ ¼å¼ä¸º yyyy-mm-dd
çæææ¥æææå符串ï¼å该å
ç´ æ²¡ææå°æ¥æå¼ã
å¦æåæ¶è®¾ç½®äº max
å min
å¼ï¼æ¤å¼å¿
é¡»æ©äºæçäº max
屿§æå®çæ¥æå¼ã
step
屿§æå®äºå¼å¿
须满足çç²åº¦ï¼æè
æ¯ä¸ææè¿°çç¹æ®å¼ any
ãå¼å¿
须满足åºç¡çæ¥è¿å¼ï¼æææã妿æå®äº min
屿§ï¼åç± min
屿§å³å®ï¼å¦åï¼ä½¿ç¨ value
屿§çå¼ï¼å¦æä¸è¿°ä¸¤ä¸ªå¼é½ä¸åå¨ï¼åæä¾éå½çé»è®¤å¼ã
åç¬¦ä¸²å¼ any
æå³çä¸ä½¿ç¨æ¥è¿å¼ï¼ä»»æå¼é½å¯ä»¥æ¥åï¼é¤å
¶ä»å¶çº¦å ç´ å¦ min
æ max
ä¹å¤ï¼ã
夿³¨ï¼ å½ç¨æ·è¾å ¥çæ°æ®ä¸ç¬¦åæ¥è¿é ç½®æ¶ï¼ç¨æ·ä»£çå¯è½ä¼åèäºå ¥å°æè¿çææå¼ï¼å½æä¸¤ä¸ªåæ ·æ¥è¿çé项æ¶ï¼æ´å¾åäºæ£æ¹åçæ°åã
å¯¹äº date
è¾å
¥ï¼step
çå¼ä»¥å¤©ä¸ºåä½ï¼å¹¶è¢«è§ä¸ºçäº 86,400,000 ä¹ä»¥ step
å¼çæ¯«ç§æ°ï¼åºç¡æ°å¼æ¯æ¯«ç§ï¼ãstep
çé»è®¤å¼ä¸º 1ï¼è¡¨ç¤º 1 天ã
夿³¨ï¼ å° date
è¾å
¥ç step
弿å®ä¸º any
䏿å®ä¸º 1
çææç¸åã
æ¥ææ§ä»¶æä¾äºä¸ä¸ªç®åçæ¥æéæ© UI çé¢ï¼è¿æ ååäºåéå°æå¡å¨çæ°æ®æ ¼å¼ï¼èä¸ç¨æ·çæµè§å¨æåºå设置æ å ³ã
卿¬ç« ï¼æä»¬å°ç ç©¶ <input type="date">
åºç¡ç忴夿çç¨æ³ã
<input>
å <label>
å
ç´ ç»åæ¯ <input type="date">
æç®åçä½¿ç¨æ¹æ³ï¼å¦ä¸æç¤ºï¼
<form action="https://example.com">
<label>
Enter your birthday:
<input type="date" name="bday" />
</label>
<p><button>Submit</button></p>
</form>
è¿æ®µ HTML 代ç å°æè¾å
¥çæ¥æä½ä¸º bday
çåæ°åéè³ https://example.com
ï¼è·å¾äºåè¿æ ·ç URL https://example.com/?bday=1955-06-08
ã
ä½ å¯ä»¥éè¿ min
å max
屿§å»éå¶ç¨æ·çå¯éæ¥æèå´ãå¨éåçä¾åä¸ï¼æä»¬å°è®¾å®æ¥ææå°å¼ä¸º 2017-04-01
ï¼æå¤§å¼ä¸º 2017-04-30
ï¼
<form>
<label>
Choose your preferred party date:
<input type="date" name="party" min="2017-04-01" max="2017-04-30" />
</label>
</form>
å¨ç»æä¸æä»¬å¯ä»¥çå°ï¼åªæ 2017 å¹´ 4 æä»½çæ¥æå¯éââè¾å ¥æ¡ä¸å¯ä»¥ç¼è¾çé¨ååªæâæ¥âè¿é¨åï¼å¹¶ä¸è¶ åº 4 æä»½ä»¥å¤çæ¥æä¸è½éè¿æ¥ææ§ä»¶çéæ©ç»ä»¶éæ©ã
夿³¨ï¼ ä½ åºè¯¥å¯ä»¥ä½¿ç¨ step
屿§æ¥æ¹åæ¯æ¬¡æä½³æ¥ææ¶æ¥è¿ï¼å¢å å¼ï¼ç天æ°ï¼ä¾å¦ï¼æè®¸ä½ åªå¸æä½¿å¨å
å¯ä»¥éï¼ã使¯ï¼å¨æ°åè¿ç¯æç« çæ¶åï¼è¿æ²¡æå¯é çå®ç°ã
<input type="date">
䏿¯æè¯¸å¦ size
ç表å大å°å±æ§ãä½ å¿
é¡»ä¾é CSS æ¥ç¡®å®å¤§å°ã
é»è®¤æ
åµä¸ï¼<input type="date">
对è¾å
¥çå¼ä¸ä¼å任使 ¡éªãæ¥å£å®ç°é常ä¸ä¼è®©ä½ è¾å
¥ä»»ä½éæ¥æçä¸è¥¿ï¼è¿ä¸ç¹å¾æå¸®å©ï¼ï¼ä½æ¯ä½ ä»ç¶å¯ä»¥ç空æè
ï¼å¨è¢«ä¼é
é级为 text
ç±»åçè¾å
¥æ¡æ¶ï¼è¾å
¥ä¸ä¸ªä¸åæ³çå¼ï¼ä¾å¦ 4 æ 32 æ¥ï¼ã
å¦æä½ ä½¿ç¨ min
å min
屿§å»éå¶å¯ç¨æ¥æï¼åè§è®¾ç½®æ¥ææå¤§åæå°å¼ï¼ï¼å¯¹äºæ¯æçæµè§å¨æ¥è¯´å¦æä½ å°è¯æäº¤ä¸ä¸ªè¶
åºç»å®èå´çæ¥æï¼é£ä¹å®å°æåºä¸ä¸ªé误ãç¶èï¼ä½ å¿
é¡»æ£æ¥è¿äºç»æä»¥ç¡®ä¿ä»ä»¬å¨è¿äºæ¥æèå´å
ï¼å ä¸ºåªæå¨ç¨æ·è®¾å¤ä¸å®å
¨æ¯ææ¥æéæ©å¨çæ
åµä¸ï¼æè½æ§è¡è¿äºæä½ã
å¦å¤ï¼ä½ å¯ä»¥ä½¿ç¨ required
屿§å¼ºå¶å¡«åæ¥æï¼å¦æä½ å°è¯æäº¤ä¸ä¸ªæªå¡«åæ¥æçåæ®µï¼å°ä¼æåºé误ãå³ä½¿ä¼é
é级为 text
ç±»åè¾å
¥æ¡ï¼å¨å¤§å¤æ°æµè§å¨ä¹æ¯å¯ä»¥å·¥ä½çã
让æä»¬çä¸ä¸ªä¾åââæä»¬è®¾ç½®äºæ¥æçæå¤§åæå°å¼ï¼å¹¶ä¸å°æ¥æå段设å®ä¸ºå¿ å¡«ï¼
<form>
<label>
Choose your preferred party date (required, April 1st to 20th):
<input
type="date"
name="party"
min="2017-04-01"
max="2017-04-20"
required />
<span class="validity"></span>
</label>
<p>
<button>Submit</button>
</p>
</form>
å¦æä½ å°è¯æäº¤ä¸ä¸ªä¸å®æ´æ¥æç表åï¼æè è¶ åºæ¥æéæ©è®¾å®èå´ï¼ï¼æµè§å¨å°ä¼æ¾ç¤ºä¸ä¸ªé误ãå°è¯ä¸ä¸è¿ä¸ªä¾åï¼
è¿æ¯ä¸é¢ä¾å使ç¨ç CSSãæä»¬åºäº :valid
å :invalid
伪类æ¥å¨è¾å
¥æ¡æè¾¹æ·»å å°å¾æ ãæä»¬å¿
é¡»æå¾æ æ¾å¨ input æè¾¹ç <span>
éé¢ï¼è并䏿¯å®æ¬èº«ï¼å ä¸ºå¨ Chrome ä¸è¢«æ¾ç½®å¨è¡¨åä¸çæçå
容ä¸è½ææçæ ·å¼åæè
æ¾ç¤ºã
label {
display: flex;
align-items: center;
}
span::after {
padding-left: 5px;
}
input:invalid + span::after {
content: "â";
}
input:valid + span::after {
content: "â";
}
è¦åï¼ å®¢æ·ç«¯è¡¨åéªè¯ä¸è½æ¿ä»£æå¡ç«¯éªè¯ãå¯¹äºæäººæ¥è¯´ï¼å¯¹ HTML è¿è¡è°æ´ä»¥ä½¿å ¶ç»è¿éªè¯æå®å ¨å é¤éªè¯å¤ªå®¹æäºï¼çè³ä¹å¯ä»¥å®å ¨ç»å¼ HTML å¹¶å°æ°æ®ç´æ¥æäº¤å°æå¡å¨ã妿æå¡å¨ç«¯ä»£ç æ æ³éªè¯å ¶æ¥æ¶å°çæ°æ®ï¼åå¨æäº¤æ ¼å¼ä¸æ£ç¡®çï¼æå¤ªå¤§ï¼ç±»åé误â¦â¦ï¼çæ°æ®æ¶ï¼ç¾é¾å¯è½ä¼åçã
å¤çæµè§å¨æ¯æé®é¢å¨ä¸æ¯æçæµè§å¨ä¸ï¼æ¥æè¾å ¥æ¡ä¼è¢«éçº§ä¸ºææ¬è¾å ¥æ¡ï¼ä½è¿åæ¶å¸¦æ¥äºç¨æ·çé¢ä¸ç»ä¸ï¼åç°çæ§ä»¶ä¸åï¼åæ°æ®å¤çæ¹é¢çé®é¢ã
第äºä¸ªé®é¢æ´ä¸ºä¸¥éï¼æ£å¦æä»¬æ©äºæ¶åæå°çï¼å¯¹äºæ¥æè¾å
¥æ¡ï¼å®é
弿»æ¯ä¼è¢«æ ¼å¼å为 yyyy-mm-dd
ãå¦ä¸æ¹é¢å¯¹äºææ¬è¾å
¥æ¡ï¼é»è®¤æ
åµä¸æµè§å¨å¹¶ä¸ç¥éæ¥ææ ¼å¼åºè¯¥æä¹æ ·è¢«æ ¼å¼åï¼èä¸äººä»¬ä¹¦åæ¥ææ ¼å¼çæ¹å¼æå¾å¤ï¼ä¾å¦ï¼
ddmmyyyy
dd/mm/yyyy
mm/dd/yyyy
dd-mm-yyyy
mm-dd-yyyy
Month dd yyyy
è§£å³è¿äºé®é¢çæ¹æ³ä¹ä¸å°±æ¯å¯¹æ¥ææ§ä»¶è®¾ç½® pattern
屿§ãå³ä½¿æ¥æè¾å
¥ä¸ä½¿ç¨å®ï¼ææ¬è¾å
¥ä¹ä¼ç¨å°å®ãä¾å¦ï¼è¯·å°è¯å¨ä¸æ¯æçæµè§å¨ä¸çä¸é¢çä¾åï¼
<form>
<label>
Enter your birthday:
<input type="date" name="bday" required pattern="\d{4}-\d{2}-\d{2}" />
<span class="validity"></span>
</label>
<p>
<button>Submit</button>
</p>
</form>
å¦æä½ å°è¯æäº¤ä¸ç¬¦åæ¨¡å¼ ####-##-##
ï¼å
¶ä¸ #
æ¯ 0 å° 9 çæ°åï¼çè¾å
¥ï¼ä½ å°ä¼çå°æµè§å¨æ¾ç¤ºä¸ä¸ªé误ï¼å¹¶ä¸é«äº®æ¾ç¤ºè¾å
¥æ æãå½ç¶ï¼è¿å¹¶ä¸è½é»æ¢äººä»¬è¾å
¥æ æçæ¥ææè
æ ¼å¼ä¸æ£ç¡®çæ¥æï¼å æ¤æä»¬éè¦æ´è¿ä¸æ¥ã
span {
position: relative;
}
span::after {
right: -18px;
position: absolute;
}
input:invalid + span::after {
content: "â";
}
input:valid + span::after {
content: "â";
}
ç®å以跨æµè§å¨æ¹å¼å¤ç表å䏿¥æçæä½³æ¹å¼æ¯è®©ç¨æ·å¨åç¬çæ§ä»¶ä¸è¾å ¥æ¥ãæåå¹´ï¼æè ä½¿ç¨ JavaScript åºï¼ä¾å¦ jQuery æ¥æéæ©å¨ã
示ä¾å¨è¿ä¸ªä¾åä¸ï¼æä»¬å建äºä¸¤ç»ç¨äºéæ©æ¥æç UI å
ç´ ï¼ä¸ä¸ªåç <input type="date">
éæ©å¨åä¸ç»ç±ä¸ä¸ª <select>
å
ç´ ç¨äºå¨ä¸æ¯ææ¬å°è¾å
¥çæ§æµè§å¨ä¸æä¾æ¥æéæ©ã
HTML çèµ·æ¥åè¿æ ·ï¼
<form>
<div class="nativeDatePicker">
<label for="bday">Enter your birthday:</label>
<input type="date" id="bday" name="bday" />
<span class="validity"></span>
</div>
<p class="fallbackLabel">Enter your birthday:</p>
<div class="fallbackDatePicker">
<span>
<label for="day">Day:</label>
<select id="day" name="day"></select>
</span>
<span>
<label for="month">Month:</label>
<select id="month" name="month">
<option selected>January</option>
<option>February</option>
<option>March</option>
<option>April</option>
<option>May</option>
<option>June</option>
<option>July</option>
<option>August</option>
<option>September</option>
<option>October</option>
<option>November</option>
<option>December</option>
</select>
</span>
<span>
<label for="year">Year:</label>
<select id="year" name="year"></select>
</span>
</div>
</form>
æä»½æ¯åæ»çï¼å 为æä»½æ¯åºå®çï¼ï¼èæ¥åå¹´ç弿¯æ ¹æ®å½åéæ©çæä»½åå¹´ä»½ï¼æ¥çå¤å®éè¦æä»½å年份ï¼ä»¥åå½å年份卿çæçã请åé ä¸é¢çä»£ç æ³¨éï¼å®ä»¬è¯¦ç»çééäºè¿äºåè½æ¯å¦ä½å·¥ä½çã
span {
padding-left: 5px;
}
input:invalid + span::after {
content: "â";
}
input:valid + span::after {
content: "â";
}
JavaScript
该代ç ä¸å¯è½æè¶£çå¦ä¸é¨åæ¯ç¹æ§æ£æµä»£ç ââæ£æµæµè§å¨æ¯å¦æ¯æ <input type="date">
ã
æä»¬å建ä¸ä¸ªæ°ç <input>
å
ç´ ï¼å°è¯å°å
¶ type
设置为 date
ï¼ç¶åç«å³æ£æ¥å
¶ type
å¼ã䏿¯æçæµè§å¨å°è¿å text
ï¼å 为 date
ç±»åå°åé为 text
ç±»åã妿䏿¯æ <input type="date">
ï¼æä»¬å°éèåçéæ©å¨å¹¶æ¾ç¤ºåå¤éæ©å¨ UIï¼<select>
å
ç´ ï¼ã
// è·å UI å
ç´
const nativePicker = document.querySelector(".nativeDatePicker");
const fallbackPicker = document.querySelector(".fallbackDatePicker");
const fallbackLabel = document.querySelector(".fallbackLabel");
const yearSelect = document.querySelector("#year");
const monthSelect = document.querySelector("#month");
const daySelect = document.querySelector("#day");
// æåï¼éèåéå
ç´
fallbackPicker.style.display = "none";
fallbackLabel.style.display = "none";
// æµè¯ä¸ä¸ªæ°ç date è¾å
¥æ¡æ¯å¦ä¼åéè³ text è¾å
¥æ¡
const test = document.createElement("input");
try {
test.type = "date";
} catch (e) {
console.log(e.message);
}
// 妿åéäºï¼è¿è¡ if 代ç åä¸ç代ç
if (test.type === "text") {
// éèåçéæ©å¨ï¼æ¾ç¤ºåéå
ç´
nativePicker.style.display = "none";
fallbackPicker.style.display = "block";
fallbackLabel.style.display = "block";
// 卿çæå¤©æ°åå¹´æ°
// ç±äºç¡¬ç¼ç çç¼æ
ï¼æä»½æ»æ¯ç¸åç
populateDays(monthSelect.value);
populateYears();
}
function populateDays(month) {
// ä»å½åç <select> ä¸å é¤å½åç <option> å
ç´ éï¼
// 为ä¸ä¸ä¸ªéåçæ³¨å
¥ååå¤ã
while (daySelect.firstChild) {
daySelect.removeChild(daySelect.firstChild);
}
// å建ä¿å注å
¥æ°ç天æ°çåé
let dayNum;
// 31 å¤©è¿æ¯ 30 天ï¼
if (
[
"January",
"March",
"May",
"July",
"August",
"October",
"December",
].includes(month)
) {
dayNum = 31;
} else if (["April", "June", "September", "November"].includes(month)) {
dayNum = 30;
} else {
// å¦ææ¯ 2 æï¼è®¡ç®å
¶æ¯å¦ä¸ºé°å¹´
const year = yearSelect.value;
const isLeap = new Date(year, 1, 29).getMonth() === 1;
dayNum = isLeap ? 29 : 28;
}
// å°é彿°éçæ° <option> å
ç´ æ³¨å
¥å°å½åç <select> å
ç´ ä¸ã
for (let i = 1; i <= dayNum; i++) {
const option = document.createElement("option");
option.textContent = i;
daySelect.appendChild(option);
}
// 妿ä¹åç天æ°å·²ç»è®¾å®ï¼å° daySelect çå¼è®¾ç½®ä¸ºé£ä¸å¤©ï¼ä»¥é²æ¢å½å¹´æ°æ¹åæ¶å¤©æ°è¢«é置为1
if (previousDay) {
daySelect.value = previousDay;
// 妿åä¸å¤©è¢«è®¾å®ä¸ºä¸ä¸ªè¾é«çæ°åï¼ä¾å¦31ï¼ç¶åä½ éæ©äºä¸ä¸ªæ»å¤©æ°è¾å°çæä»½ï¼ä¾å¦2æï¼ï¼
// è¿é¨å代ç å°±ä¼ç¡®ä¿å¯ç¨çæå¤§æ¥æè¢«éä¸ï¼è䏿¯æ¾ç¤ºä¸ä¸ªç©ºç½ç daySelect
if (daySelect.value === "") {
daySelect.value = previousDay - 1;
}
if (daySelect.value === "") {
daySelect.value = previousDay - 2;
}
if (daySelect.value === "") {
daySelect.value = previousDay - 3;
}
}
}
function populateYears() {
// è·åä»å¹´ç年份æ°å
const date = new Date();
const year = date.getFullYear();
// 使ä»å¹´ä»¥åä¹åç 100 å¹´é½è½å¨ <select> ä¸éåã
for (let i = 0; i <= 100; i++) {
const option = document.createElement("option");
option.textContent = year - i;
yearSelect.appendChild(option);
}
}
// 彿æå¹´ç <select> 弿¹åæ¶ï¼éæ°è¿è¡ populateDays()
// 使å¾è¯¥ååå½±åå°å¯ç¨ç天æ°
yearSelect.onchange = () => {
populateDays(monthSelect.value);
};
monthSelect.onchange = () => {
populateDays(monthSelect.value);
};
// ä¿çéæ©ç天æ°
let previousDay;
// æ´æ°ä¹å设å®çæ¥æ
// ç¨æ³è¯·æ¥ç populateDays() çç»å°¾
daySelect.onchange = () => {
previousDay = daySelect.value;
};
夿³¨ï¼ è¯·è®°ä½æäºå¹´ä»½æ 53 å¨ï¼è§æ¯å¹´ç卿°ï¼ï¼å½ä½ å¨å¼å产ååºç¨æ¶åºå½èèè¿ä¸ªé®é¢ã
è§è æµè§å¨å ¼å®¹æ§ åè§RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4