Я разрабатываю сайт интрасети, в котором используется тег меню asp.net, и при наведении указателя мыши на конкретную ссылку появляется подменю.
Единственное, что мы должны включить, - это поддержка iPhone и iPad.Сайт для iPhone будет совершенно другим, так что это не будет проблемой.Тем не менее, на iPad нет существенных изменений в самом сайте по сравнению с пользователем настольного компьютера / ноутбука.
Проблема, с которой я столкнулся, заключалась в том, что после обновления до iOS 5 встроенное событие onMouseOver из меню asp не срабатывает (это означает, что когда я один раз касаюсь элемента меню, он будет действовать какдважды постучал)В iOS 4. + элемент управления будет работать нормально (нажмите один раз, чтобы получить список пунктов меню, а затем снова нажмите, чтобы перейти по ссылке).
Я реализовал обходной путь, предложенный в этом посте Project Code , реализующий событие mouseover, которое вызывает нулевую функцию javascript.
Небольшая разметка для иллюстрации проблемы:
<asp:Menu runat="server" ID="Menu1" /* Any other control additions here */>
<Items>
<asp:MenuItem Text="MenuItem1" Value="MenuItem1" />
<asp:MenuItem Text="MenuItem2" Value="MenuItem2" />
</Items>
</asp:Menu>
И как я реализовал исправление:
MenuItem mnu_itm = new MenuItem();
mnu_itm.Text = "ADMIN";
mnu_itm.Value = "";
mnu_itm.NavigateUrl = "javascript:(function(){})();";
Также: Извините, если есть похожий вопрос, яне мог найти это.
Редактировать
После небольшого тестирования этого я обнаружил, что это будет работать только в том случае, если исходный пункт меню не предназначен для чего-либо.Однако это не всегда так.Так что это на самом деле большая проблема, чем я думал.
Я изменил (теперь не так просто) обходной путь, чтобы охватить эту ситуацию, используя событие MenuItemClick, ViewState и проверяя UserAgent (возможно, не самое элегантное решение, но оно соответствует моим потребностям)
string ItemNavUrl = Menu1.SelectedItem.NavigateUrl;
string ItemName = Menu1.SelectedItem.Text;
//Check the ViewState first, just in case another menu item was clicked.
if (ViewState["MenuItemNav"] != null && Menu1.SelectedItem.NavigateUrl == "" && ViewState["MenuItemName"] != null && (string)ViewState["MenuItemName"] == Menu1.SelectedItem.Text)
{
Menu1.SelectedItem.NavigateUrl = (string)ViewState["MenuItemNav"];
}
//Check to see if: 1. The item has a submenu
//2. The Item also has a valid URL to send to, and
//3. If the device is an iPad
else if(Menu1.SelectedItem.ChildItems.Count > 0 && Menu1.SelectedItem.NavigateUrl != "" && Request.UserAgent.IndexOf("iPad") > -1)
{
//Set the URL to nothing and save the values for later.
Menu1.SelectedItem.NavigateUrl = "";
ViewState.Add("MenuItemNav", ItemNavUrl);
ViewState.Add("MenuItemName", ItemName);
}
Это даже менее "элегантно", чем предыдущее решение (хотя оно и более всеобъемлющее, хотя, честно говоря, я не бросил в него столько испытаний, сколько хотел бы).
ИтакУ меня есть несколько вопросов здесь.А именно:
Есть ли лучший способ сделать это, который не выглядит таким хакерским?
Это ошибка в iOS или просто в меню asp.net (или вообще?). Есть ли другие элементы управления, на которых это понадобится (о которых вы знаете)?
Редактировать (21.03.2012): Я подтвердил, что это все еще проблема для iOS 5.1.Мой обходной путь все еще дает мне то, что мне нужно, но все равно кажется, что я работаю над ошибкой или чем-то подобным.