算是前面的結合實作,情境是當我下拉選單到底的時候,觸發 scroll 事件,當事件觸發後,要讓原本 disabled 狀態的 checkbox 顯示並可以點擊。
來記錄一下實作過程。
參考到這篇,有講道一個公式,也就是了解元素是否被滾輪完全滾過。
1
| element.scrollHeight - element.scrollTop === element.clientHeight;
|
如果元素被完全滾過將會回傳 true
, 否則回傳 false
.
可改寫之前的 scroll
的內容:
- 觸發
scroll
事件。
- 元素完全滾過會執行
checkbox
的方法。
scrolltoCheck.ts
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| disabled: boolean = true; check: boolean = false;
@HostListener('scroll', ['$event']) onElementScroll($event: any) { let modal = this.el.nativeElement.querySelector('.scrollModal'); let readPrivacy = modal.scrollHeight - modal.scrollTop === modal.clientHeight; if (readPrivacy) { this.onCheck(); } }
onCheck() { this.disabled = false; this.check = true; }
|
結合 checkbox 顯示切換
scrolltoCheck.html
這邊我使用的是 ngIf
來切換狀態,而不是直接改變 checkbox
的樣子。
分成兩個 checkbox
來顯示:
- 第一個
checkbox
只顯示 disabled
的狀態。
- 第二個在
scroll
事件觸發後,讓這一組可以點擊的 checkbox
出現,驗證也是寫在這個 element
上面。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
| <div class="modal-dialog modal-dialog-scrollable privacy-box-2"> <div class="modal-content"> <div class="modal-body scrollModal" (scroll)="onElementScroll($event)"> <textarea name="" id="" cols="30" rows="10"> ...文字略... </textarea > </div> </div> </div> <form [formGroup]="checkboxForm"> <div class="form-check pri-txt"> <div *ngIf="!check"> <input class="form-check-input" type="checkbox" name="checkbox1" id="uncheck" value="option" [attr.disabled]="disabled" /> <label class="form-check-label" for="uncheck"> 我已閱讀並同意隱私權政策 </label> </div>
<div *ngIf="check"> <input class="form-check-input" type="checkbox" id="canCheck" formControlName="checkbox1" (click)="onCheck()" /> <label for="canCheck" class="form-check-label"> 我已閱讀並同意隱私權政策</label > </div>
<div class="invalid-feedback d-block" *ngIf=" !checkboxForm.controls['checkbox1'].pristine && checkboxForm.controls['checkbox1'].errors?.required " > 請先勾選隱私權政策協議 </div> </div> </form>
|
Demo https://stackblitz.com/edit/angular-ivy-qw4qvo?embed=1&file=src/app/app.component.ts
備註:
本地端專案有安裝 jQuery,所以才能使用 $event
事件,線上 Demo 沒有安裝 jQuery,所以無法呈現預期效果。