2008-09-28 3 views
7

Ich habe folgendes Problem:Javascript Veranstaltungen: Erste über Änderungen in einem <input> Steuerwert

Ich habe ein HTML-Textfeld (<input type="text">), deren Inhalt durch ein Skript geändert ich nicht berühren kann (es ist meine Seite, aber Ich verwende externe Komponenten).

Ich möchte in meinem Skript jedes Mal benachrichtigt werden, wenn sich der Wert dieser Textbox ändert, damit ich darauf reagieren kann.

Ich habe dies versucht:

txtStartDate.observe('change', function() { alert('change' + txtStartDate.value) }); 

die (vorhersagbar) funktioniert nicht. Es wird nur ausgeführt, wenn ich selbst den Textbox-Wert mit der Tastatur ändere und dann den Fokus an anderer Stelle verschiebe, aber es wird nicht ausgeführt, wenn das Skript den Wert ändert.

Gibt es ein anderes Ereignis, das ich hören kann, das mir nicht bekannt ist?



ich die Prototype-Bibliothek verwenden, und in Fall ist es relevant, die externe Komponente der Textbox Wert modifizierende Grund Date Picker (www.basicdatepicker.com)

Antwort

5

Wie Sie haben Implizierte Änderung (und andere Ereignisse) werden nur ausgelöst, wenn der Benutzer etwas unternimmt. Ein Skript, das Dinge verändert, löst keine Ereignisse aus. Ihre einzige Lösung besteht darin, einen Haken in das Steuerelement zu finden, den Sie an Ihren Listener anschließen können.

Hier ist, wie ich es tun würde:

basicDatePicker.selectDate = basicDatePicker.selectDate.wrap(function(orig,year,month,day,hide) { 
    myListener(year,month,day); 
    return orig(year,month,day,hide); 
}); 

, die auf einem summa mit Firebug basiert (Ich bin nicht mit der Komponente vertraut). Wenn es andere Möglichkeiten gibt, ein Datum auszuwählen, müssen Sie diese Methoden ebenfalls umbrechen.

+1

Gibt es eine Möglichkeit, das Gleiche in jQuery zu tun? –

1

Je nachdem, wie das externe Javascript geschrieben wurde, könnten Sie die relevanten Teile des externen Skripts immer in Ihr Skript schreiben und die externe Definition überschreiben, damit das Änderungsereignis ausgelöst wird.

Ich musste das vorher mit Skripten machen, die außerhalb meiner Kontrolle waren.

Sie müssen nur die externe Funktion finden, sie in ihrer Gesamtheit als neue Funktion mit dem gleichen Namen kopieren und das Skript neu schreiben, um das zu tun, was Sie wollen.

Natürlich, wenn das Skript geschrieben wurde korrekt Verschlüsse verwendet, werden Sie nicht in der Lage sein, es leicht zu ändern ...

+0

Ich dachte darüber nach. Mein Problem ist, dass es ein großes minimiertes Skript ist. Es könnte Stunden dauern, bis ich den richtigen Ort gefunden habe, um mich zu ändern. Ich bin auf der Suche nach einem schnellen Weg, um das zu erreichen. Wenn es zwei Stunden dauert, ist das kleine Feature, das ich versuche, nicht die Mühe wert :-) –

2

IE hat ein onpropertychange Ereignis, das für diesen Zweck verwendet werden könnte.

Für echte Webbrowser (;)) gibt es eine DOMAttrModified mutation event, aber in ein paar Minuten experimentierfreudig in Firefox, konnte ich es nicht auf eine Texteingabe auslösen, wenn der Wert programmatisch geändert wird (oder durch normale Tastatureingabe), aber es wird ausgelöst, wenn ich den Namen der Eingabe programmatisch ändere. Neugieriger und neugieriger...

Wenn Sie nicht bekommen, dass zuverlässig arbeiten, können Sie immer nur den Wert der Eingabe abzufragen regelmäßig:

var value = someInput.value; 

setInterval(function() 
{ 
    if (someInput.value != value) 
    { 
     alert("Changed from " + value + " to " + someInput.value); 
     value = someInput.value; 
    } 
}, 250); 
+1

Die 'value' Eigenschaft eines Formularelements unterscheidet sich von seinem Attribut' value = "... "Wert, der nur den Anfangswert vorgibt. Wenn Sie den Wert per Skript oder Benutzeraktion festlegen, wird das Attribut 'value' (*) nicht aktualisiert, sodass kein DOMAttrModified vorhanden ist. (*: außer in IE, wegen eines Fehlers. Aber IE unterstützt DOMAttrModified nicht.) – bobince

0

Abgesehen davon ab, um das Problem, wie wie noah erklärt, könnten Sie auch erstellen Sie einfach einen Timer, überprüft den Wert alle paar hundert Millisekunden.

0

Ich musste die YUI datable Paginator Kontrolle einmal in der von Dan beraten Weise ändern. Es ist rohe Gewalt, aber es hat mein Problem gelöst. Das heißt, suchen Sie die Methode, die in das Feld schreibt, kopieren Sie ihren Code und fügen Sie eine Anweisung hinzu, die das Änderungsereignis auslöst und in Ihrem Code nur das Änderungsereignis behandelt. Sie müssen nur die ursprüngliche Funktion mit dieser neuen Version überschreiben. Polling, obwohl es gut funktioniert, scheint mir eine viel ressourcenintensivere Lösung zu sein.

4

addEventListener („DOMControlValueChanged‚ wenn der Wert eines Steueränderungen ausgelöst wird, auch wenn es von einem Skript ist.

addEventListener (‘input“ ist ein Direktbenutzerinitiierte gefilterte Version von DOMControlValueChanged.

Leider , DOMControlValueChanged wird derzeit nur von Opera unterstützt und die Eingabe von Ereignisunterstützung ist in Webkit unterbrochen. Das Eingabeereignis hat auch verschiedene Bugs in Firefox und Opera.

Dieses Zeug wird wahrscheinlich bald in HTML5 geklärt, fwiw.

Update:

Ab 2012.09.08 hat DOMControlValueChanged Unterstützung von Opera abgeworfen worden und 'Input' Event-Support ist viel besser in Browsern (einschließlich weniger Bugs) jetzt (weil es von HTML5 entfernt wurde).