0%

Angular 筆記 - 觸發 scroll 事件後可點擊 checkbox 實作

angular

算是前面的結合實作,情境是當我下拉選單到底的時候,觸發 scroll 事件,當事件觸發後,要讓原本 disabled 狀態的 checkbox 顯示並可以點擊。

來記錄一下實作過程。

取得 scroll 可視範圍

參考到這篇,有講道一個公式,也就是了解元素是否被滾輪完全滾過

1
element.scrollHeight - element.scrollTop === element.clientHeight;

如果元素被完全滾過將會回傳 true , 否則回傳 false.

可改寫之前的 scroll 的內容:

  1. 觸發 scroll 事件。
  2. 元素完全滾過會執行 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; //預設無法點擊

// 監聽 DOM
@HostListener('scroll', ['$event']) onElementScroll($event: any) {
// console.log($event); //有事件觸發
let modal = this.el.nativeElement.querySelector('.scrollModal');
let readPrivacy =
modal.scrollHeight - modal.scrollTop === modal.clientHeight;
if (readPrivacy) {
this.onCheck(); //讓 checkbox 改變狀態的事件
}
}

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,所以無法呈現預期效果。