--- tags: JS 直播班 - 2021 春季班 --- # 4/15 線上 Slack 助教 ## 今日輪班助教時間 佩涵:4/15(四) 早上 9:00 - 早上 11:00,下午 1:00 -下午 5:00 ## 發問規範 老師助教同學們好,**這是我的 Codepen**,我**原本預期**「JS 第 8 行會出現數字 8」,**但卻出現**「預期外的結果是 0」,想問下問題出在哪裡? ## 注意 1. 請各位先到 Slack 上將問題放在助教服務內的 thread,如圖 ![](https://i.imgur.com/nHE3sOx.png) 2. 遵循以上的發問規範以便助教查看問題,不可直接貼上網址而沒有說明文字或者只提供截圖 3. 助教會依照 Slack 上的順序回覆問題 4. 以下問題區塊只能由助教自行增加 5. 助教會將回覆寫在下方問題區塊 ## 問題 1. **穎旻:** 老師助教同學們好,這是我的 [Codepen](https://),我原本預期「JS 第 8 行會出現數字 8」,但卻出現「預期外的結果是 0」,想問下問題出在哪裡? > 助教回覆: --- 2. **Fred Chang:** 老師助教同學們好,這是我的 [Codepen](https://codepen.io/fred8196/pen/bGgLjMV),想請問如果把JS的174-188行先註解,然後打開191-200和203-214行時,為什麼會無法成功建立訂單,謝謝! > 助教回覆: > 因為 POST 這邊的 orderData 外層多包了一個大括號唷 ```javascript "data": { orderData } ``` > 要改成 ```javascript "data": orderData ``` > 這樣就可以成功送出訂單資料哩~ --- 3. **Jordan_Tseng:** 老師助教同學好,這是我的[code](https://codepen.io/jordan-ttc-design/pen/gOgzJJo?editors=1011),我是想問4/12的題目,我寫完看看同學們的寫法,大部分好像都會把productData.forEach放在判斷是否為全部外面,我是先判斷完才去forEach,如果是全部就可以減少回圈運作?雖然在這個範例應該沒啥影響。是想問這樣會不會比較好。 > 助教回覆: > 你的做法跟觀念都沒有問題唷,先過濾掉全部再跑迴圈的方式確實是比較好的~~ --- 4. **Carrie:** 老師助教同學們好,這是我的 [CodePen](https://codepen.io/echocarriet/pen/oNBygeQ) 原本預期 「 驗證失敗欄位出現錯誤訊息提示,如果再次輸入成功會清除錯誤訊息 」,所以在 212 ~ 214 行使用選取節點的方式,console 查詢到只有選到 `<div class="alert-message"></div>`,試了幾個在 `item.parentNode.nextElementSibling.子節點` 於後方加入子節點方式,都無法選取到它的子層 `<p id="ticketName-message" data-message="xxx">`。 再麻煩助教解惑了,謝謝 ! > 助教回覆: 這邊助教測試用 `.firstElementChild` 的方式取子節點是有成功的,同學可以試看看唷~ --- 5. **WuJungHan:** 老師助教同學們好,這是我的 [Codepen](https://codepen.io/JungHanWu/pen/OJWEVWp?editors=0011), 我原本預期「按照助教直播分享的方法,JS 第 175 行到246行的表單驗證套件Validate.js應該會正常顯示如圖1」,但卻出現「錯誤 如圖二 並且也無正常顯示提示文」,想請問助教問題出在哪裡?謝謝助教 > 助教回覆: > Object.keys(errors) 回傳的會是 errors 的 key 值(比如:"套票名稱"、"圖片網址"…等) > > 但是 > ```javascript > document.querySelector(`.${keys}`).textContent = errors[keys] > ``` > 卻會找不到 class 名稱為套票名稱、圖片網址…等等的 DOM 元素 > > 助教發現同學的 HTML 結構,每個欄位區塊中放錯誤訊息地方有寫兩處,這邊都會提出修改方式給你參考(以套票名稱為例) 1. ```html <div class="messages name"></div> ``` 把這邊的 name 改成「套票名稱」,這樣驗證錯誤後就會跑出提示文字了(不過 class 不建議用中文命名,所以助教比較偏向使用第二種方式) 2. ```html <p id="ticketName-message" data-message="套票名稱"></p> ``` 把選取對象 `.${keys}` 改成 `[data-message=${keys}]`,就也可以正常出現提示文字了 --- 6. **Vivian Yeh:** 老師助教同學們好,這是[4/9的每日任務助教的範例code](https://codepen.io/znlcgmgk/pen/xxgLRQM?editors=0011), 我原本預期「JS 第 146 行DOM會出現querySelectorAll("input[type='text'],input[type='tel']")」,但卻出現「("input[type=text],input[type=tel]")」,attribute=value的value部分並沒有加上引號想請問為什麼呢? > 助教回覆: > 這個算是訂定好的規則哦。其實不管有沒有加引號,只要有取到 DOM 的話就不是錯的~ > 也可以參考[這篇文件](https://www.w3schools.com/cssref/sel_attribute_value.asp)(js 選取器跟 CSS 選取器很類似) --- 7. **Harvey:** 老師助教同學們好,這是[4/6的每日任務解答](https://codepen.io/lqigzkgx/pen/eYgKdNv),想請問為何要把api網址拆成1,2行然後在第7行重組呢?跟直接帶入整串網址(如第4行)的差別在哪裡呢? > 助教回覆: 主要是為了方便管理、可以簡化程式碼哦,如果同學有開始做最終作業的話可以發現每支 API 網址都有包含 https://hexschoollivejs.herokuapp.com 跟你的 API 路徑名稱,先把相同的部分拆出來,就不用再多撰寫重複的程式碼哩 --- 8. **Valerie:** 老師助教同學們好,這是我的 [Codepen](https://codepen.io/vicky-chang/pen/rNjpdzJ?editors=0010), 我原本預期「JS 第 150 行能夠執行驗證」,但卻出現「Not Found」,想問問題出在哪裡?謝謝 > 助教回覆: > 1. 因為沒有 .deleteAllItem 這顆清空購物車的按鈕,所以程式運行到 112 行的時候就會報錯,不會再繼續執行下面的程式碼,因此底下表單驗證的函式就不會被觸發到,也就無法阻止 submit 按鈕提交表單的預設行為。 > > 所以「清空購物車」的功能若還沒做出來的話可以先暫時註解起來,或是擺放到最後面,不要影響到驗證這一塊~ >2. 同學沒載入到 validate.js 的 CDN 唷,要記得加上哩 > >```html ><script src="https://cdnjs.cloudflare.com/ajax/libs/validate.js/0.13.1/validate.min.js"></script> >``` --- 9. **yu0917:** 老師助教同學好,我想詢問關於影音課程的「計算機網路總結」章節裡的「共筆文件」中。「瀏覽器解析過程」的連結進去是404,不知道有沒有其他連結,謝謝您~ > 助教回覆: > 有跟助教長及老師確認了一下,應該是這篇被 Google 拿掉了 :shocked_face_with_exploding_head: > > 這邊提供其他連結給你參考 ↓ > - 這一頁是別的網站翻譯轉存的,但內容和原始連結是相同:[文件連結](https://www.html.cn/doc/chrome-devtools/network-performance/understanding-resource-timing/) > - 這篇是新的相似頁(但內容已有些不同):[文件連結](https://developer.chrome.com/docs/devtools/network/reference/) > > 也有請老師同步更新連結了,感謝同學的提出~ --- 10. **WuJungHan:** 老師助教同學們好,這是我的 Codepen, 我原本預期「html的13行可以與js的230~246顯示表單驗證文字在input下方,且能在輸入文字的時後驗證文字變空字串消失 圖如1」,但卻出現「但由於.addTicket-input有下flex導致驗證文字會在右邊顯示跑版,如圖二,js應該如何改成抓取html的15,16行來顯示驗證文字,而不是下個元素呢?如果不用js235行的item.nextElementSibling語法,應該如何修改呢?」,再麻煩助教解惑,謝謝! > 助教回覆: > 第 235 行也可以改用以下方式選取指定的 DOM 元素~ > ```javascript > document.querySelector(`[data-message=${item.name}]`).textContent = ''; > ``` > 修改完後,要記得把 HTML 內所有 `<div class="messages" data-message="..."></div>` 的結構都移除喔 --- (這裡只能由助教自行增加問題,請大家將問題放在 thread 上)