JavaScript в iOS: открытие элемента выбора HTML

Я не надеюсь, но спрошу на всякий случай.

Я хотел бы иметь возможность использовать JavaScript для открытия элемента select в mobile Safari для iPhone/iPad.

обширный поиск переполнения Google / Stack показывает, что многие люди хотели бы иметь возможность делать это в браузерах в целом, но он не поддерживается (почему бы и нет, интересно?). Были предложены различные хаки, от вызова focus() на элементе select и изменение его size свойство, чтобы сделать больше option элементы видимые, или построение полностью макет выберите элемент с <div> и <ul> элементы. Тем не менее, я хотел бы использовать собственный браузер select controls в iPad и iPhone.

я задавался вопросом, может быть, кто-то может знать о собственном методе Apple WebKit для этого. Это было бы что-то вроде:

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

в качестве бонуса было бы также удобно узнать о логическом свойстве, которое говорит, открыт ли элемент select в настоящее время/активен или нет (т. е. не только имеет ли элемент фокус). Я знаю, что могу решить эту проблему, отслеживая события click и change, но простое свойство было бы полезно.

принятие желаемого за действительное?


обновление:
У меня еще нет ответа, но я обнаружил, что имитация mousedown успешно открывает элемент select в Google Chrome, но не 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);

обновление:
Я спросил родственника, но другого (и точно так же без ответа!) вопрос по выделенным полям здесь:есть ли событие DOM, которое срабатывает, когда элемент выбора HTML закрыт?

4 ответов


запуск HTML-элементов управления с помощью JS-очень серая область, частично из-за соображений безопасности, а частично из-за отсутствия поддержки. Даже используя такие фреймворки, как jQuery, вы не можете просто click() ссылка, чтобы следовать за ним так же, как click() на кнопке-вам нужно запустить собственное событие click на уровне браузера (я считаю, что последняя версия Selenium делает это, но это тестовая платформа, настолько неподходящая для этой проблемы). Поздравляю с возможностью достижения частичного результата в Хром! Однако вы не найдете универсального решения, которое использует реальные входные данные select.

Я бы предложил использовать другой тип управления - либо вертикальный стек кнопок, если вы хотите нажать один, чтобы активировать функцию, или стек переключателей, поддерживаемых метками (с небольшим CSS), если вы хотите формат с несколькими вариантами выбора.


у меня есть рабочее решение для этого, которое работает на последних версиях iOS и Android. Я еще не тестировал старые версии. Нет двух способов: это решение является взломом. Но он работает, если его тщательно реализовать.

в моей ситуации у меня был iOS 7, как элемент тумблера. Я хотел вид выбора для select быть представленным когда переключатель был повернут дальше. В моем случае нам не нужно или не нужно, чтобы пользователь видел . Мы просто хотели использовать iOS " хороший интерфейс scrolly-picker.

я использовал CSS для позиционирования и растяжения select полностью на выключатель. Затем я установил opacity в CSS что-то вроде opacity: .001; что делает его невидимым для всех намерений и целей. Он все еще может работать с непрозрачностью 0, но я чувствовал, что оставляя немного непрозрачности, может быть безопаснее,и вы действительно не можете видеть все это. Теперь, когда пользователь нажимает на область экрана, отображающую переключатель, события tap фактически переходят в select что приводит к отображению вида выбора.

на onchange событие select Я display: none; чтобы полностью скрыть select. Это означает, что когда пользователь касается переключателя, чтобы выключить его, они взаимодействуют с самим переключателем. Когда переключатель выключен, я устанавливаю display: block вернуть select в активное состояние.

мой вариант использования узкий, но метод позиции / непрозрачности должен быть адаптирован ко многим вариантам использования, хотя вам может потребоваться 2 select элементов в тех случаях, когда вы хотите, чтобы поле было видно.

вот скриншот, демонстрирующий технику. The opacity установлен в 0.25 на этом скриншоте для демонстрационных целей. Когда вы установите его в 0.001, вы не увидите select

Screenshot of technique with opacity set higher for demo purposes


элемент select должен быть видимым. Если вы используете jQuery, вы можете сделать это следующим образом:

$('mySelectElementSelector').focus();

на мобильном телефоне он покажет элемент управления select по умолчанию. На рабочем столе просто сосредоточьтесь на элементе управления select.


вы пробовали change() способ?