Wie kann verhindert werden, dass Benutzer ein Textfeld eingeben, ohne das Feld zu deaktivieren?

79

Ich habe es versucht:

$('input').keyup(function() {

   $(this).attr('val', '');

});

Der eingegebene Text wird jedoch nach der Eingabe eines Buchstabens leicht entfernt. Gibt es eine Möglichkeit, den Benutzer daran zu hindern, Text vollständig einzugeben, ohne das Textfeld zu deaktivieren?

Jakob
quelle
ist keydown()oder keypress()effektiver?
Verkaufen

Antworten:

185

Eine Nicht-Javascript-Alternative, die leicht übersehen werden kann: Können Sie das readonlyAttribut anstelle des disabledAttributs verwenden? Es verhindert, dass der Text in der Eingabe bearbeitet wird, aber Browser gestalten die Eingabe anders (weniger wahrscheinlich, dass sie "grau wird"), z<input readonly type="text" ...>

Mike Mertsock
quelle
3
Ehrlich gesagt würde ich sagen, dass dies die beste Lösung ist.
Christian Mann
3
Das readonly-Attribut hat keinen Wert, sondern muss nur in HTML 4.01 und HTML5 vorhanden sein . Ein Wert wird nur in gültigen XHTML-Dokumenten benötigt (die im Web äußerst selten sind).
RobG
Das ist genau richtig, RobG, das hätte ich erwähnen sollen. Ich möchte auch erwähnen, dass dieses Attribut für Textarea-Elemente funktionieren sollte, und ich denke, dass es auch für Checkbox- / Radio-Eingänge funktioniert.
Mike Mertsock
4
Diese Methode hat einen Nachteil. Der Benutzer kann weiterhin in das Feld klicken, sodass es so aussieht, als ob es bearbeitet werden kann. Wenn sie die Rücktaste drücken, um zu entfernen, was sich dort befindet, wird möglicherweise die "Zurück" -Funktion des Browsers ausgelöst. Keine gute Erfahrung.
Caltrop
Wenn Bedenken hinsichtlich der Benutzererfahrung bestehen oder wenn die Standardeinstellung eines schreibgeschützten Felds einfach nur hässlich ist, verwenden Sie den progressiven Verbesserungsansatz und verwenden Sie CSS, um zu verdeutlichen, dass es nicht bearbeitet werden kann: jsfiddle.net/eBh5N
Mike Mertsock
63

Wenn Sie nicht möchten, dass das Feld "deaktiviert" oder "smth" aussieht, verwenden Sie einfach Folgendes:

onkeydown="return false;"

Es ist im Grunde das gleiche, was Greengit und Derek sagten, aber etwas kürzer

Kunst
quelle
Ich musste e.preventDefault();in addEventListener
Jim Jones
3
noch kürzer:onkeydown="return false"
CoderPi
4
Beachten Sie jedoch, dass dies den Benutzer nicht daran hindert, Text mit der Maus einzufügen.
Gsanta
2
Dies ist perfekt, wenn Sie beispielsweise einen Datepicker verwenden, um zu verhindern, dass der Benutzer das Datum eingibt und den Datepicker tatsächlich verwendet. Aber wie @gsanta sagte, können sie weiterhin Text einfügen, stellen Sie also sicher, dass Sie auch eine Back-End-Validierung haben :)
MattiasH
1
Wenn Sie auf einer ASP.NET-Website ein Textfeld so einstellen, dass es schreibgeschützt ist, geht der Text in einem Post-Back verloren. Dies ist in solchen Fällen die bessere Lösung.
Yass
30
$('input').keydown(function(e) {
   e.preventDefault();
   return false;
});
Baumkodierer
quelle
2
Eigentlich habe ich ein Geburtsdatum und ich möchte verhindern, dass Benutzer es eingeben. Für mich ist Ihre Antwort also GUT !! Wenn ich das Attribut "schreibgeschützt" verwende, kann der Benutzer nicht auf die Eingabe klicken und das DOB-Popup wird angezeigt. Klicken Sie auf die Eingabe. :) CHEERS !!!! und danke
Neeraj Singh
16
$('input').keypress(function(e) {
    e.preventDefault();
});
Derek Hunziker
quelle
2
Dies verhindert nur die Eingabe, solange Sie weiterhin die Pfeiltasten usw. verwenden können. Vielen Dank!
CoderPi
7

Wenn Sie den Benutzer daran hindern möchten, etwas hinzuzufügen, ihm aber die Möglichkeit geben möchten, Zeichen zu löschen:

<input value="CAN'T ADD TO THIS" maxlength="0" />

Wenn Sie das maxlengthAttribut einer Eingabe so "0"einstellen, dass der Benutzer keinen Inhalt hinzufügen kann, aber dennoch den gewünschten Inhalt löscht .


Aber wenn Sie möchten, dass es wirklich konstant und unveränderlich ist:

<input value="THIS IS READONLY" onkeydown="return false" />

Wenn Sie das onkeydownAttribut so einstellen , return falsedass die Eingabe den Benutzer ignoriert keypresses, wird verhindert, dass er den Wert ändert oder beeinflusst.

Mystisch
quelle
2

Eine andere Methode, die je nach Bedarf verwendet werden könnte, ist $('input').onfocus(function(){this.blur()}); meiner Meinung nach die Art und Weise, wie Sie sie schreiben würden. Ich beherrsche jquery nicht.

qw3n
quelle
1

Markup

<asp:TextBox ID="txtDateOfBirth" runat="server" onkeydown="javascript:preventInput(event);" onpaste="return false;"
                                TabIndex="1">

Skript

function preventInput(evnt) {
//Checked In IE9,Chrome,FireFox
if (evnt.which != 9) evnt.preventDefault();}
Biju Kalanjoor
quelle
Auf diese Weise können Sie die Registerkartenfunktion in Ihrem DatePicker Filed implementieren und die Bearbeitung verhindern.
Biju Kalanjoor
1

Ich möchte eine hinzufügen, die auch mit dynamischer Javascript-DOM-Erstellung wie D3 funktioniert, wo es unmöglich ist, Folgendes hinzuzufügen:

//.attr(function(){if(condition){"readonly"]else{""}) //INCORRECT CODE !

Um Aktionen für ein HTML-Eingabe-DOM-Element zu verhindern, fügen Sie schreibgeschützt zur Klasse hinzu:

var d = document.getElementById("div1");
d.className += " readonly";

ODER in D3:

 .classed("readonly", function(){
   if(condition){return true}else{return false}
 })

UND zu CSS oder weniger hinzufügen:

.readonly {
  pointer-events: none;
}

Das Schöne an dieser Lösung ist, dass Sie sie dynamisch ein- und ausschalten können, damit sie zum Zeitpunkt der Erstellung in beispielsweise D3 integriert werden kann (mit dem einzelnen Attribut "readonly" nicht möglich).

So entfernen Sie das Element aus der Klasse:

document.getElementById("MyID").className =
  document.getElementById("MyID").className.replace(/\breadonly\b/,'');

oder benutze Jquery:

$( "div" ).removeClass( "readonly" )

oder schalten Sie die Klasse um:

$( "div" ).toggleClass( "readonly", addOrRemove );

Nur um vollständig zu sein, viel Glück = ^)

irJvV
quelle
1

Verwenden Sie einfach onkeydown = "return false" für das Steuerelement-Tag, wie unten gezeigt. Es akzeptiert keine Werte vom Benutzer.

    <asp:TextBox ID="txtDate" runat="server" AutoPostBack="True"
ontextchanged="txtDate_TextChanged" onkeydown="return false" >
    </asp:TextBox>
anandd360
quelle
0

Eine Möglichkeit besteht darin, einen Handler an das inputEreignis zu binden .

Der Vorteil dieses Ansatzes besteht darin, dass das vom Benutzer erwartete Tastaturverhalten (z. B. Tabulator, Bild auf / ab usw.) nicht verhindert wird.

Ein weiterer Vorteil besteht darin, dass auch der Fall behandelt wird, wenn der Eingabewert durch Einfügen von Text über das Kontextmenü geändert wird.

Dieser Ansatz funktioniert am besten, wenn Sie nur die Eingabe leer lassen möchten. Wenn Sie einen bestimmten Wert beibehalten möchten, müssen Sie diesen an einer anderen Stelle (in einem Datenattribut?) Verfolgen, da er beim inputEmpfang des Ereignisses nicht verfügbar ist.

const inputEl = document.querySelector('input');

inputEl.addEventListener('input', (event) => {
  event.target.value = '';
});
<input type="text" />

Getestet in Safari 10, Firefox 49, Chrome 54, IE 11.

JKS
quelle
0

Versuchen Sie für eine reine CSS-Lösung, pointer-events: nonedie Eingabe festzulegen.

Stephen L.
quelle