Отключить возврат в текстовом поле с помощью JavaScript - PullRequest
11 голосов
/ 21 декабря 2009

У меня есть текстовое поле, которое расширяется календарем Ajax Control Toolkit.

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

Мне удалось заблокировать все ключи, кроме возврата!

Это то, что я имею до сих пор:

<asp:TextBox ID="TextBox1" runat="server" onKeyPress="javascript: return false;" onKeyDown="javascript: return false;" onPaste="javascript: return false;" />

Как бы я также отключил возврат в текстовом поле с помощью JavaScript?

EDIT

Внес изменения, так как мне нужно решение в javascript.

EDIT

Оказывается, что onKeyDown = "javascript: return false;" Работает. Я понятия не имею, почему это не работало раньше. Я попытался использовать новое текстовое поле, и он прекрасно заблокировал пробелы. Извините всех, кто оставил ответ в надежде получить ответ. после того, как я отметил это для щедрости.

Мои текстовые поля теперь (кажется) блокируют ВСЕ нажатия клавиш, а также все еще работают с расширителем календаря.

Ответы [ 10 ]

36 голосов
/ 05 марта 2010

ZX12R был близко. Это правильное решение:

Текстовое поле выглядит так:

    <asp:TextBox ID="TextBox1" runat="server" onKeyDown="preventBackspace();"></asp:TextBox>

и скрипт выглядит так:

<script type="text/javascript">
    function preventBackspace(e) {
        var evt = e || window.event;
        if (evt) {
            var keyCode = evt.charCode || evt.keyCode;
            if (keyCode === 8) {
                if (evt.preventDefault) {
                    evt.preventDefault();
                } else {
                    evt.returnValue = false;
                }
            }
        }
    }
</script>

Прежде всего, Backspace не будет проходить при нажатии клавиш, поэтому вам придется использовать Key Down.

8 голосов
/ 21 декабря 2009

Разве вы не можете просто использовать атрибут HTML readonly="readonly"?

<input type="text" name="country" value="Norway"   readonly="readonly" />

<textarea rows="3" cols="25" readonly="readonly">
It should work! :)
</textarea>
4 голосов
/ 21 декабря 2009

Как насчет использования метки для дисплея и скрытого текстового поля для возврата значения на сервер?

2 голосов
/ 06 марта 2010

Вам нужно применять ТОЛЬКО для чтения на клиентском контроллере ТОЛЬКО, чтобы asp.net не видел его и все же считывал данные при обратной передаче. Вы можете сделать это несколькими способами, один из самых простых, если вы используете jQuery, это добавить класс в текстовые поля, например. cssclass="readonly" в вопросе и $(".readonly").attr("readonly", true);.

1 голос
/ 23 декабря 2009

Как говорили другие, ReadOnly = "True" сломает механизм обратной передачи.

Я полагаю, что вы можете обойти это в своем коде, обратившись к объекту Request непосредственно во время PageLoad:

//assuming your textbox ID is 'txtDate'
if(Page.IsPostBack)
{
   this.txtDate.Text = Request[this.txtDate.UniqueID];
}

Другой вариант - разрешить отправку элементов управления отключенным элементам в форме, но это является проблемой безопасности, поскольку поля, доступные только для чтения, измененные с помощью сценария, потенциально могут вернуться:

<form id="MyForm" runat="server" SubmitDisabledControls="True">
..
</form>

http://msdn.microsoft.com/en-us/library/system.web.ui.htmlcontrols.htmlform.submitdisabledcontrols.aspx

Я не уверен, что это свойство влияет на элементы управления ReadOnly (vs Enabled = "False"), но стоит попробовать.

И, наконец, я столкнулся с той же проблемой, с которой вы столкнулись несколько лет назад, и из того, что я помню, есть разница между использованием ввода html, помеченного как readonly и runat = "server", и реальной серверной стороной. контроль, где ReadOnly = "true".

Я чувствую, что делаю:

<input type="text" readonly="readonly" runat="server" id="myTextBox" />

, возможно, все еще позволял проходить данным, хотя в коде позади вы должны рассматривать элемент управления как HtmlInputText или HtmlGenericControl против TextBox. Вы по-прежнему можете получить доступ к нужным вам свойствам.

Всего несколько идей ...

0 голосов
/ 30 ноября 2012

Мне удалось сделать что-то подобное с Jquery. Просто выложу сюда для справки!

$("#inputID").keypress(function (e)
{e.preventDefault();});

$("#inputID").keydown(function (e)
{e.preventDefault();});

первое предотвращает нажатия клавиш, а второе предотвращает события нажатия клавиш.

Все еще JS Noob, так что не стесняйтесь указывать хорошие / плохие вещи с этим.

0 голосов
/ 01 марта 2012

Нет необходимости вызывать любую функцию, и все просто попробуйте это:

<asp:TextBox runat="server" ID="txt" onkeydown="return false;" 
    onpaste = "return false;" onkeypress="return false;" />
0 голосов
/ 03 апреля 2011

использовать обычные текстовые поля не только для чтения и не отключено, просто используйте клиентский JavaScript, чтобы игнорировать нажатия клавиш. Это будет игнорировать все нажатия клавиш, так что вы будете вести себя ГОТОВО, и также будет игнорировать возврат.

<input type="text" value="Your Text Here" onkeydown="return false;" />
0 голосов
/ 08 марта 2010

Атрибут ReadOnly не помогает.Backspace все еще переносит ваш браузер на заднюю страницу, даже если ваше текстовое поле доступно только для чтения.

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

вот возможное решение ... добавьте прослушиватель событий ...

<asp:TextBox ID="TextBox1" runat="server" onKeyPress="KeyCheck;" />

, и тогда функция может быть такой:

function KeyCheck(e) {
 var KeyID = (window.event) ? event.keyCode : e.keyCode;
 if (KeyID == 8 ) {
    alert('no backspaces!!);
 }
}

сомневаюсь, чтобыть на ключе или на ключе ...

...