Настройка фокуса с помощью ASP.NET AJAX Control Toolkit - PullRequest
5 голосов
/ 04 сентября 2008

Я использую элемент управления Автозаполнение из ASP.NET AJAX Control Toolkit, и у меня возникла проблема, при которой автозаполнение не заполняется, когда я устанавливаю фокус на назначенное текстовое поле.

Я попытался установить фокус в событиях Page_Load, Page_PreRender и Page_Init, и фокус был установлен правильно, но автозаполнение не работает. Если я не установил фокус, все работает нормально, но я бы хотел установить его, чтобы у пользователей не было лишнего клика.

Есть ли какое-то особое место, в котором мне нужно установить фокус, или что-то еще, что мне нужно сделать, чтобы эта работа работала? Спасибо.

Ответы [ 5 ]

3 голосов
/ 04 сентября 2008

У нас была точно такая же проблема. Нам нужно было написать скрипт внизу страницы, который быстро размывается, затем перефокусируется на текстовое поле. Вы можете взглянуть на (ужасно хакерское) решение здесь: http://www.drive.com.au

Идентификатор текстового поля: MainSearchBox_SearchTextBox. Посмотрите на строку 586, и вы увидите, где я собираю все события (на самом деле я использую прототип для этого бита.

В основном для события focus текстового поля я установил глобальную переменную с именем textBoxHasFocus в значение true, а для события размытия - в false. Событие загрузки страницы, которую я называю этим скриптом:

if (textBoxHasFocus) {
    $get("MainSearchBox_SearchTextBox").blur();
    $get("MainSearchBox_SearchTextBox").focus();
}  

Сбрасывает текстовое поле. Это действительно хитроумно, но это единственное решение, которое я смог найти

1 голос
/ 02 января 2012

это пустая трата времени, просто

это то, что вам нужно сделать

controlId.focus (); в C # controlID.focus () в VB

Поместите это в раздел загрузки страницы или click_click

например. panel1.focus (); если к Panel1 подключен модельный всплывающий экстендер, мы помещаем этот код в раздел загрузки страницы

0 голосов
/ 23 марта 2010

Я нашел ответы от Гленна Слэйвена и Криса / Алекса, чтобы приблизить меня к решению моей конкретной проблемы с настройкой фокуса на элемент управления TextBox ASP.NET, к которому был присоединен AutoCompleteExtender. Document.getElementById (focusControlID) .focus () продолжал выдавать ошибку javascript, из-за которой document.getElementById возвращал нулевой объект. Переменная focusControlID возвращала правильное значение ClientID времени выполнения для элемента управления TextBox. Но по какой-то причине функции document.getElementById это не понравилось.

Мое решение состояло в том, чтобы добавить jQuery в микс, поскольку я уже использовал его для рисования фона любого элемента управления, на котором был фокус, плюс принудительное нажатие клавиши Enter для перехода по форме вместо запуска обратной передачи.

Моя функция setFocus в итоге выглядела так:

function setFocus(focusControlID) {
    $('#' + focusControlID).blur();
    $('#' + focusControlID).focus();
}

Это избавило от ошибки времени выполнения javascript, поместило фокус на нужный элемент управления TextBox и поместило курсор в элемент управления. Без размытия, а затем фокусировки элемент управления будет выделен, как если бы он имел фокус, но курсор еще не будет находиться в элементе управления. Пользователю все равно придется щелкнуть внутри элемента управления, чтобы начать редактирование, что будет раздражать UX.

Мне также пришлось увеличить тайм-аут со 100 до 300. Ваш пробег может варьироваться ...

Я согласен со всеми, что это взлом. Но с точки зрения конечного пользователя они не видят этот код. Хак для них, если они вынуждены вручную щелкнуть внутри элемента управления вместо того, чтобы просто автоматически поместить его в элемент управления и набрать первые несколько букв, чтобы активировать функцию автоматического поиска. Итак, снимаю шляпу перед всеми, кто предоставил свои хаки.

Надеюсь, это поможет кому-то еще.

0 голосов
/ 29 июня 2009

Что я обычно делаю, это регистрирую скрипт на стороне клиента, чтобы запустить метод setFocusTimeout, указанный ниже, из моего метода codebehind. Когда это выполняется, он ждет некоторое время и затем вызывает метод, который фактически устанавливает фокус (setFocus). Это ужасно хакерски, но, похоже, вам нужно идти по этому пути, чтобы AJAX не мог украсть ваше внимание.

function setFocusTimeout(controlID) {
    focusControlID = controlID;
    setTimeout("setFocus(focusControlID)", 100);
}

function setFocus() {
    document.getElementById(focusControlID).focus();
}
0 голосов
/ 04 сентября 2008

Как вы настраиваете фокус? Я не пробовал конкретный сценарий, который вы предложили, но вот как я сфокусировался на своих элементах управления:

Public Sub SetFocus(ByVal ctrl As Control)
    Dim sb As New System.Text.StringBuilder
    Dim p As Control
    p = ctrl.Parent
    While (Not (p.GetType() Is GetType(System.Web.UI.HtmlControls.HtmlForm)))
        p = p.Parent
    End While
    With sb
        .Append("<script language='JavaScript'>")
        .Append("function SetFocus()")
        .Append("{")
        .Append("document.")
        .Append(p.ClientID)
        .Append("['")
        .Append(ctrl.UniqueID)
        .Append("'].focus();")
        .Append("}")
        .Append("window.onload = SetFocus;")
        .Append("")
        .Append("</script")
        .Append(">")
    End With
    ctrl.Page.RegisterClientScriptBlock("SetFocus", sb.ToString())
End Sub

Итак, я не уверен, какой метод вы используете, но если он отличается от моего, попробуйте и посмотрите, есть ли у вас проблемы или нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...