如何检测 Ionic 4 的离子含量成分中的滚动条到达终点?
How to detect scroll reached end in ion-content component of Ionic 4?
在 Ionic v3 ion-content 中有像 "scrollTop" 这样的属性。在 Ionic v4 中,不再有此属性...我如何确定用户是否已到达内容末尾?
https://ionicframework.com/docs/v3/api/components/content/Content/
https://ionicframework.com/docs/api/content
这些功能仍然可用,只是位置不同。
使用scrollEvents
启用后,需要使用ionScroll
事件,然后根据getScrollElement()
函数的结果计算高度,而不是ion-content
- 具有 window 高度的固定高度。
我在下面写了一个例子。您可以删除 console.log
并将其收紧一点,我只是将它们留在里面以帮助您了解发生了什么。
示例页面:
<ion-header>
<ion-toolbar>
<ion-title>detectScrollToBottom</ion-title>
</ion-toolbar>
</ion-header>
<ion-content [scrollEvents]="true" (ionScroll)="logScrolling($event)">
<p *ngFor="let dummy of ' '.repeat(75).split('')">Lorem ipsum dolor sit amet consectetur adipisicing elit. Quia placeat nam sapiente iusto eligendi</p>
</ion-content>
示例代码:
import { Component, OnInit } from '@angular/core';
@Component({
selector: 'app-detect-scroll-to-bottom',
templateUrl: './detect-scroll-to-bottom.page.html',
styleUrls: ['./detect-scroll-to-bottom.page.scss'],
})
export class DetectScrollToBottomPage implements OnInit {
private scrollDepthTriggered = false;
constructor() { }
ngOnInit() {
}
async logScrolling($event) {
// only send the event once
if(this.scrollDepthTriggered) {
return;
}
console.log($event);
if($event.target.localName != "ion-content") {
// not sure if this is required, just playing it safe
return;
}
const scrollElement = await $event.target.getScrollElement();
console.log({scrollElement});
// minus clientHeight because trigger is scrollTop
// otherwise you hit the bottom of the page before
// the top screen can get to 80% total document height
const scrollHeight = scrollElement.scrollHeight - scrollElement.clientHeight;
console.log({scrollHeight});
const currentScrollDepth = scrollElement.scrollTop;
console.log({currentScrollDepth});
const targetPercent = 80;
let triggerDepth = ((scrollHeight / 100) * targetPercent);
console.log({triggerDepth});
if(currentScrollDepth > triggerDepth) {
console.log(`Scrolled to ${targetPercent}%`);
// this ensures that the event only triggers once
this.scrollDepthTriggered = true;
// do your analytics tracking here
}
}
}
示例日志:
记住使用滚动事件会导致性能问题。
你没有说你使用的是什么编程环境,但是使用 vue 你可以在 ion-content 上设置一个 ref,然后像这样访问 shadowroot 的第一个子元素 get/set clientHeight 和所有其他 javascript 事情。当然,随着版本的变化,这个 "hidden" 东西可能会改变。
this.$refs.msg_list.shadowRoot.children[0].clientHeight
在 Ionic v3 ion-content 中有像 "scrollTop" 这样的属性。在 Ionic v4 中,不再有此属性...我如何确定用户是否已到达内容末尾?
https://ionicframework.com/docs/v3/api/components/content/Content/ https://ionicframework.com/docs/api/content
这些功能仍然可用,只是位置不同。
使用scrollEvents
启用后,需要使用ionScroll
事件,然后根据getScrollElement()
函数的结果计算高度,而不是ion-content
- 具有 window 高度的固定高度。
我在下面写了一个例子。您可以删除 console.log
并将其收紧一点,我只是将它们留在里面以帮助您了解发生了什么。
示例页面:
<ion-header>
<ion-toolbar>
<ion-title>detectScrollToBottom</ion-title>
</ion-toolbar>
</ion-header>
<ion-content [scrollEvents]="true" (ionScroll)="logScrolling($event)">
<p *ngFor="let dummy of ' '.repeat(75).split('')">Lorem ipsum dolor sit amet consectetur adipisicing elit. Quia placeat nam sapiente iusto eligendi</p>
</ion-content>
示例代码:
import { Component, OnInit } from '@angular/core';
@Component({
selector: 'app-detect-scroll-to-bottom',
templateUrl: './detect-scroll-to-bottom.page.html',
styleUrls: ['./detect-scroll-to-bottom.page.scss'],
})
export class DetectScrollToBottomPage implements OnInit {
private scrollDepthTriggered = false;
constructor() { }
ngOnInit() {
}
async logScrolling($event) {
// only send the event once
if(this.scrollDepthTriggered) {
return;
}
console.log($event);
if($event.target.localName != "ion-content") {
// not sure if this is required, just playing it safe
return;
}
const scrollElement = await $event.target.getScrollElement();
console.log({scrollElement});
// minus clientHeight because trigger is scrollTop
// otherwise you hit the bottom of the page before
// the top screen can get to 80% total document height
const scrollHeight = scrollElement.scrollHeight - scrollElement.clientHeight;
console.log({scrollHeight});
const currentScrollDepth = scrollElement.scrollTop;
console.log({currentScrollDepth});
const targetPercent = 80;
let triggerDepth = ((scrollHeight / 100) * targetPercent);
console.log({triggerDepth});
if(currentScrollDepth > triggerDepth) {
console.log(`Scrolled to ${targetPercent}%`);
// this ensures that the event only triggers once
this.scrollDepthTriggered = true;
// do your analytics tracking here
}
}
}
示例日志:
记住使用滚动事件会导致性能问题。
你没有说你使用的是什么编程环境,但是使用 vue 你可以在 ion-content 上设置一个 ref,然后像这样访问 shadowroot 的第一个子元素 get/set clientHeight 和所有其他 javascript 事情。当然,随着版本的变化,这个 "hidden" 东西可能会改变。
this.$refs.msg_list.shadowRoot.children[0].clientHeight