reactjs - 如何使用 Ipad 检索范围输入的点击事件值?
问题描述
目前正在使用 react typescript 网站内的自定义滑块(即“范围”类型的输入),它在桌面(MacO 和 Windows + 目标浏览器)和 android 上运行良好,但在 Ipad 上缺少一些东西(我们只关注平板电脑)。问题是我们不能通过点击滑块本身来设置值:我们可以拖动它并点击它顶部的标签,但不能点击里面的标签。
我已经看到许多主题告诉 Apple 可触摸设备对许多事件的工作方式不同,因此我调试了我的设备以查看问题所在。我的“onClick”方法根据来自事件的值设置滑块的当前值,但结果显示,只有在 Ipad(Safari 和 Chrome)上执行时,这两个变量才相等(所以我的滑块更新它值正确,但使用当前值)!在任何其他环境中,一切正常,事件的价值正确地应该是“未来价值”。
我还测试了如下所述的不同触摸事件,但没有一个是触发事件,即使有一些默认阻止。
这是滑块本身(仅触发 onClick):
<input
type="range"
min={-half}
max={half}
step="1"
value={this.state.selectedRange}
onTouchStart={(e: any) => { console.log("on touch : " + e.target.value);}}
onTouchMove={(e: any) => { console.log("on touch : " + e.target.value);}}
onTouchCancel={(e: any) => { console.log("on touch : " + e.target.value);}}
onTouchEnd={(e: any) => { console.log("on touch : " + e.target.value);}}
onTouch={(e: any) => { console.log("on touch : " + e.target.value);}}
onClick={(e: any) => this.onClickSlider(e, "Inputslider + changer")}
defaultValue={this.state.selectedRange}
onChange={(e: any) => { this.onChange(e); }}
/>
和 onClickSlider :
onClickSlider(e: any, m: string) {
let value: any = e.target.value;
console.log("New Value : " + e.target.value);
// target value is equal to the current value... (only on Ipad)
if (this.props.onChange) {
if (!this.props.slider) {
value = value - 1;
}
this.props.onChange(value);
}
}
我没想到一个事件的价值行为会发生如此巨大的变化......
有没有人建议我如何检索用户触摸滑块的位置值(它可能涉及特定的平台条件)?
谢谢 !
解决方案
试试这个范围输入设置,看看它是否适合您的需要。它基于 jQuery,但您应该掌握这个想法。我尝试了许多失败的解决方案,并且无法在我的情况下使用 preventDefault,所以我鼓起了这个 gem,它允许即时范围输入拇指定位/滑动,无论你在元素上的 touchstart 和 touchmove 是什么位置:
document.on('touchstart touchmove', 'input[type="range"]', function(e){
var len = $(this).attr('max');
var offset = $(this).offset();
var xxx = (e.pageX - offset.left);
var xPercent = xxx/$(this).width();
var xPos = Math.round(len)*xPercent;
$(this).attr('value',xPos);
$(this).val(xPos).trigger('input');
});
推荐阅读
- c - 在现代 Windows 命令行上启用 ANSI 转义码处理?[C]
- powershell - Powershell 尝试重新启动打印后台处理程序
- linux - 如何将输入从一个 docker 容器回显到另一个
- uwp - UWP 安装 MVVM Light 和 NuGet
- javascript - 为什么不和谐机器人可以使用默认表情符号,而当我放置自定义表情符号时不起作用?
- javascript - 如何检查“深层”结构是否未定义?
- docker - 从 docker 容器中访问代理的本地 webapp
- bash - Rundeck 不同的输出运行脚本
- python - 在回调函数中使用keyboard.record()
- javascript - .NET Core 5.0 到 Javascript DFH 密钥交换不起作用