[JavaScript30] 🔎06. TYPE AHEAD


🔎06 TYPE AHEAD


Webから情報を取得し、Live Search機能を実装
<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <title>Type Ahead 👀</title>
    <link rel="stylesheet" href="style_JuneHyung.css">
</head>
<body>
    
  <form class="search-form">
    <input type="text" class="search" placeholder="City or State">
    <ul class="suggestions">
      <li>Filter for a city</li>
      <li>or a state</li>
    </ul>
  </form>
  <script>
    const endpoint = 'https://gist.githubusercontent.com/Miserlou/c5cd8364bf9b2420bb29/raw/2bf258763cdddd704f8ffd3ea9a3e81d25e2c6f6/cities.json';
    
    </script>
</body>
</html>
html {
    box-sizing: border-box;
    background: #ffc600;
    font-family: 'helvetica neue';
    font-size: 20px;
    font-weight: 200;
}

*,
*:before,
*:after {
    box-sizing: inherit;
}

input {
    width: 100%;
    padding: 20px;
}

.search-form {
    max-width: 400px;
    margin: 50px auto;
}

input.search {
    margin: 0;
    text-align: center;
    outline: 0;
    border: 10px solid #f7f7f7;
    width: 120%;
    left: -10%;
    position: relative;
    top: 10px;
    z-index: 2;
    border-radius: 5px;
    font-size: 40px;
    box-shadow: 0 0 5px rgba(0, 0, 0, 0.12), inset 0 0 2px rgba(0, 0, 0, 0.19);
}

.suggestions {
    margin: 0;
    padding: 0;
    position: relative;
    /*perspective: 20px;*/
}

.suggestions li {
    background: white;
    list-style: none;
    border-bottom: 1px solid #d8d8d8;
    box-shadow: 0 0 10px rgba(0, 0, 0, 0.14);
    margin: 0;
    padding: 20px;
    transition: background 0.2s;
    display: flex;
    justify-content: space-between;
    text-transform: capitalize;
}

.suggestions li:nth-child(even) {
    transform: perspective(100px) rotateX(3deg) translateY(2px) scale(1.001);
    background: linear-gradient(to bottom, #ffffff 0%, #efefef 100%);
}

.suggestions li:nth-child(odd) {
    transform: perspective(100px) rotateX(-3deg) translateY(3px);
    background: linear-gradient(to top, #ffffff 0%, #efefef 100%);
}

span.population {
    font-size: 15px;
}

.hl {
    background: #ffc600;
}

🌏 新しく知り合ったもの


👉 text-transform : capitalize


大文字または小文字に置き換えるプロパティで、大文字と小文字をよく使用します.
初めて大文字を見た
大文字:単語の最初のアルファベットを大文字に変更します.

👉 transform: perspective()


パースビューを使用しないとTranslateZの変化は感じられません.
透視図を使うと元手感があり、違いが感じられます.
注意:
https://gahyun-web-diary.tistory.com/80
https://developer.mozilla.org/ko/docs/Web/CSS/CSS_Transforms/Using_CSS_transforms

👉 ...


展開構文
羅列データの抽出または接続に使用します.
使用方法は配列またはオブジェクトで、変数名の前に3つの句点(...)があります.入力します.
! 配列、オブジェクト、および関数パラメータ式([]、{}、()でのみ使用されます.

👉 RegExp


パターンを使用してテキストを識別します.RegExpオブジェクトは、文字記号および作成者によって作成できます.
  • 文字記号のパラメータは、二重斜線で囲まれ、引用符は使用されません.
  • コンストラクション関数のパラメータには斜線はありませんが、引用符を使用します.
  • /ab+c/i
    new RegExp(/ab+c/, 'i') // 리터럴
    new RegExp('ab+c', 'i') // 생성자

    👉 構文(Syntax)

    new` `RegExp(pattern [,flags]) ``// 생성자 방식``/pattern/flags ``// 정규표현식 리터럴 

    👉 パラメータ(Parameters)


    パラメータ名データ型必須/オプション説明patternstring必須正規表現flagsオプションg:テキスト全体で一致する文字を検索する場合、指定しない場合、最初の一致する文字iのみを検索する:大文字と小文字を区別しない.m:^(最初の文字)と$(最後の文字)は(n,rで区切られた)行の上に一致します.

    👉 説明(Description)


    正規表現は、次の場合に使用されます.
  • 文字列に特定の文字列が存在するかどうかを確認
  • 文字列の一部を別の文字列に変更
  • CharacterMeaning\エスケープ^範囲、開始点、$範囲、終了点*数、無以上={0,}+数、1より大きい.{1,}?数、なしまたは1つのみ.マッチング、1文字マッチング(*x*)マッチング、xマッチング、そしてxマッチング.xまたはyに一致するt{n}の数.tおよびnが一致する文字列は、一致するt{n,}の数、tおよびnが一致する文字列は、一致するt{n,m}の数と一致する.tとn回以下のm回の文字列[xyz]が一致する.任意のxyz文字列に一致

    👉 NumberWithCommas()

    function numberWithCommas(x) {
            return x.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ',');
        }
    正規表現を使用して、1000単位で数値を切り捨て、カンマを挿入します.
    正規表現を学ぶ必要があります.
    /\B(?=(\d{3})+(?!\d))/g
    \b:非語境界(開始と終了)(\d{3}) :
  • \d:数字文字対応
  • {n}:前述の式nに対応する.
  • =>すなわち3+(?!\d) :
  • +:前の式と連続して1回以上繰り返した部分に対応
  • x(?!y):xの後ろにyがない場合にのみxと一致
  • =>つまり、(?!\d)の後ろに数字はありません.(?=~):すべての前後条件を満たす.

    🌏 プロセス


    👉 1.都市と州の名前と人口を獲得した。

    const endpoint = 'https://gist.githubusercontent.com/Miserlou/c5cd8364bf9b2420bb29/raw/2bf258763cdddd704f8ffd3ea9a3e81d25e2c6f6/cities.json';
    
        const cities =[];
    
        // const porm = fetch(endpoint);
        // console.log(porm);
        
        // fetch(endpoint).then(blob => console.log(blob));
        fetch(endpoint)
        .then(blob => blob.json())
        .then(data=> cities.push(...data));
    blob結果画面

    都市に直接データを入れようとしたときにエラーが発生しました
    タイプが違うから起こったようです.
    fetch(endpoint)
        .then(blob => blob.json())
        .then(data=> cities = data);
    Uncaught (in promise) TypeError: Assignment to constant variable. 발생

    👉 2.検索時に一致する値を検索する関数

    function findMatches(wordToMatch, cities){
            return cities.filter(place => {
                // here we need to figure out if the city on state matches what was searched
                // 여기서 우리는 주의 도시가 검색되는 것과 일치하는 지 알아 내야합니다.
    
                const regex = new RegExp(wordToMatch, 'gi');
                return place.city.match(regex) || place.state.match(regex);
            })
        }
    変数regexを作成して、単語に一致する都市または州を返し、findMatches関数を作成してフィルタを適用して返します.
    つまり、RegExpは検索時にモードを設定できる作成者であり、giは検索時に大文字と小文字を区別しない.
    g i m貼って使えますか!

    👉 3.画面に表示させる関数。

    function displayMatches(){
            // console.log(this.value);
            const matchArray = findMatches(this.value, cities);
            // console.log(matchArray);
            const html = matchArray.map(place => {
                
                const regex = new RegExp(this.value, 'gi');
                const cityName = place.city.replace(regex, `<span classs="h1"> ${this.value}</span>`);
                const stateName = place.state.replace(regex, `<span classs="h1"> ${this.value}</span>`);
                return `
                    <li>
                        <span class="name">${cityName}, ${stateName}</span>
                        <span class="population">${numberWithCommas(place.population)}</span>
                    </li>`
            }).join('');
            suggestions.innerHTML = html;
        }
    入力した値(this.value)を受信した都市(cities)と一致させ、matchArrayに保存します.
    const matchArray = findMatches(this.value, cities);
    htmlで検索した後、配列内で一致するコンテンツを検索し、cityNameとstateNameに新しい検索値を含むhtmlタグで置き換え、新しいリストタグを返します.
    displayMatchesにはhtmlコンテンツをスクリプトとしてsuggenstionsに挿入するすべてのプロセスが含まれています.

    👉 4.数字の3桁ごとのカンマ(,)

     function numberWithCommas(x) {
            return x.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ',');
        }
    正規表現で模索する.

    👉 5.リアルタイム出力。


    inputの値が変化した場合、およびKeyupイベントが発生するたびに、表示マッピングが変化します.
    searchInput.addEventListener('change', displayMatches);
    searchInput.addEventListener('keyup', displayMatches);