Javascript 在用户关闭弹出窗口之前,如何检测iOS7选择菜单上的更改事件?

Javascript 在用户关闭弹出窗口之前,如何检测iOS7选择菜单上的更改事件?,javascript,iphone,html,ios7,mobile-safari,Javascript,Iphone,Html,Ios7,Mobile Safari,在iOS 7上,Mobile Safari中的菜单在用户单击“完成”后才会触发更改事件。是否有其他事件可供我监听,以了解用户的选择何时更改 <select onchange="alert('This will not fire until the user clicks Done')"> <option>1</option> <option>2</option> </select> 1. 2. iOS上的

在iOS 7上,Mobile Safari中的菜单在用户单击“完成”后才会触发更改事件。是否有其他事件可供我监听,以了解用户的选择何时更改

<select onchange="alert('This will not fire until the user clicks Done')">
    <option>1</option>
    <option>2</option>
</select>

1.
2.

iOS上的Mobile Safari不会触发
更改事件

解决方法:

使用
blur
change
,您可以附加一个事件处理程序,在触发一次时解除绑定:
jQuery有$().one()


注意:如果您需要每个DOM元素多次执行函数,可以使用
设置超时重新应用它,以避免双重触发

在用户触摸“完成”之前无法确定新的选择值

当用户第一次触摸
控件时,iOS会打开一个用于选择选项的本机UI。这不是DOM。当用户点击“Done”时,它发送新的值/索引,并在DOM上触发相应的事件

你可以测试一下。只需设置两个事件:
onfocus
将设置计时器并持续轮询
selectedIndex
,直到触按“完成”时
onblur
销毁计时器


1.
2.
var定时器;
//对焦计时器设置
函数checkSelectedIndex(){
计时器=窗口。设置间隔(函数(){
console.log('selected index:',document.getElementById('my-select')。selectedIndex);
},500);//每秒轮询2次
}
//计时器在模糊时清除
函数selectDone(){
log('Selection changed!');
如果(!timer){return;}
窗口清除间隔(计时器);
}
使用,您将看到,即使您更改了UI上的选定项;只有在触摸“Done”(即最后一条消息发送到DOM)之后,记录的索引才会更改

所以,你能做的是;(有一些折衷);创建自定义控件,而不是
元素,该控件在
中弹出选项列表。这样,您就不会触发本机UI,用户也不会离开DOM。您将能够收听菜单和单击项的事件

只需确保您的控制装置对移动设备友好即可

为iOS设备启用Safari Web Inspector:
  • 在iOS设备上,转至:设置»Safari»高级并启用Web检查器
  • 在桌面Safari上,转到:首选项»高级并选中“在菜单栏中显示开发人员菜单”。名为“开发”的新菜单项将添加到Safari菜单中
  • 通过USB将iOS设备连接到计算机
  • 打开要调试的页面(外部或本地主机URL)
  • 从桌面Safari Develop菜单中,选择设备名称,然后单击子菜单中的应用程序名称

  • 唉,这并不能解决问题。如果在iOS7设备上查看,事件仍然不会触发,直到点击“完成”按钮。我检查了它是否有效。抱歉,我没有iPhone.It stange,因为每次用户选择一个选项时,“select”元素,IOS弹出窗口,没有点击“done”就会触发一个更改事件。。。这很奇怪,因为用户还没有“完成”它。这就是为什么我通常为ios做的,模糊event@Miguel-是的!我想知道2014年到2017年间是否发生了变化。我有一个通过敲除绑定的多选菜单,而且更改事件肯定会触发。当我在所需选项旁边放置复选框时,页面在关闭弹出窗口(测试过的iPad Mini和iPhone 7 Safari)之前在后台更新@bkwdesign,不确定更改是否在2014年和2017年之间。但苹果公司的观点是,如果菜单状态发生变化,他们就会允许进行更改,这样他们就可以在UI中看到这种变化的影响。假设这是一个颜色选项,通过检查颜色,你可以实时看到颜色的变化,我个人认为这会导致混乱,因为平台的一致性。这就是为什么您应该使用模糊来确认值的最终状态。这不是我想要的答案,但感谢您如此彻底地确认了它!:)
    $("input[type='select']").one("blur change", function(){  
    //will only execute once
      alert('This will fire sure and only once');
    });