iOS上的JavaScript:打开HTMLselect元素

我不希望,但我会问,以防万一。

我希望能够使用JavaScript在iPhone / iPad的移动版Safari中打开select元素。

广泛的谷歌/堆栈溢出search显示,很多人希望能够在浏览器中做到这一点,但不支持(为什么不,我想知道?)。 已经提出了各种黑客技巧,从select元素调用focus() ,改变size属性来使更多的option元素可见,或者用<div><ul>元素构造一个完全模拟的select元素。 但是,我会喜欢在iPad和iPhone中使用本地浏览器select控件。

我想知道,也许有人可能知道专有的Apple WebKit方法来做到这一点。 这将是这样的:

 var myselect = document.getElementsByTagName("select")[0]; myselect.open(); // this method doesn't exist 

作为一个奖励,知道一个布尔属性也是很方便的,它说明select元素当前是否处于打开/活动状态(即不仅仅是元素是否有焦点)。 我知道我可以通过跟踪点击和更改事件来解决这个问题,但是一个简单的属性会很有用。

妄想?


更新:
我还没有答案,但是我发现,模拟成功的mousedown在Google Chrome中打开了select元素,但不是iPad或Firefox等等:

 function simulateMouseEvent(eventName, element) { var evt = document.createEvent("MouseEvents"); evt.initMouseEvent(eventName, true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null); element.dispatchEvent(evt); } simulateMouseEvent("mousedown", select); 

更新:
我在这里提出了一个相关的,但是不同的(同样没有答案的!)问题: 当HTML select元素closures时,是否有DOM事件触发?

用JS触发HTML控件是一个非常灰暗的地方,部分原因是由于安全原因,部分原因是缺乏支持。 即使使用像jQuery这样的框架,你也不能简单的click()一个链接来跟上它,就像button上的click()一样 – 你需要在浏览器级触发本地点击事件(我相信最新版本的Selenium这,但这是一个testing框架,因此不适合这个问题)。 恭喜能够在Chrome中获得部分结果! 但是,您不会find使用实际selectinput的通用解决scheme。

我build议使用不同types的控件 – 如果你想按下一个button来激活一个function,或者是一堆由标签支持的单选button(带有一点CSS),如果你想要一个多选的格式。

我有一个适用于最新版本的iOS和Android的工作解决scheme。 我还没有testing旧版本。 有没有两种方法:这个解决scheme是一个黑客。 但是,如果仔细实施,它会起作用

在我的情况下,我有像切换开关元素的iOS 7。 我希望在开关打开时显示select器的select器视图。 在我的情况下,我们不需要或希望用户看到select字段本身。 我们只是想用iOS的漂亮的滚动select器界面。

我用CSS来定位和拉伸select完全通过交换机。 然后,我将CSS中的opacity设置为opacity opacity: .001; 这使得它对于所有的意图和目的都是不可见的。 它仍然可以在不透明度0的情况下工作,但是我觉得留下一些不透明的东西可能会更安全,而且你真的无法看到这一切。 现在,当用户点击正在显示开关的屏幕区域时,点击事件实际上将进入select ,这导致select器视图显示。

selectonchange事件中,我设置了display: none; 完全隐藏select 。 这意味着,当用户触摸开关将其closures时,它们将与开关本身进行交互。 当切换开关closures,然后设置display: blockselect返回到其激活状态。

我的用例很窄,但是位置/不透明度技术应该适用于很多用例,但是如果您希望字段可见,则可能必须有2个select元素。

这是一个演示技术的截图。 此截图中的opacity设置为0.25,用于演示目的。 当您将其设置为0.001时,您看不到select

为了演示目的,不透明度的技巧截图设置得更高

select元素需要可见。 如果你使用jQuery,你可以这样做:

 $('mySelectElementSelector').focus(); 

在手机上,它会显示默认的select控制。 在桌面上只需关注select控件。

你有没有尝试过change()方法?