Ändern Sie die On-Click-Aktion mit einer Javascript-Funktion

69

Ich habe einen Knopf:

<button id="a" onclick="Foo()">Button A</button>

Wenn ich zum ersten Mal auf diese Schaltfläche klicke, soll Foo ausgeführt werden (was korrekt ausgeführt wird):

function Foo() {
  document.getElementById("a").onclick = Bar();
}

Wenn ich zum ersten Mal auf die Schaltfläche klicke, möchte ich die Onclick-Funktion von Foo()auf ändern Bar(). Bisher konnte ich nur eine Endlosschleife oder gar keine Änderung erreichen. Bar()würde ungefähr so ​​aussehen:

function Bar() {
  document.getElementById("a").onclick = Foo();
}

Wenn Sie also auf diese Schaltfläche klicken, wird nur abgewechselt, welche Funktion aufgerufen wird. Wie kann ich das zum Laufen bringen? Was ist alternativ eine bessere Möglichkeit, den vollständigen Text eines Beitrags ein- oder auszublenden? Es beginnt ursprünglich kurz und ich biete eine Schaltfläche, um "den vollständigen Text zu sehen". Wenn ich jedoch auf diese Schaltfläche klicke, möchte ich, dass Benutzer erneut auf die Schaltfläche klicken können, damit die lange Version des Textes verschwindet.

Hier ist der vollständige Code, wenn es hilft:

function ShowError(id) {
    document.getElementById(id).className = document.getElementById(id).className.replace(/\bheight_limited\b/, '');
    document.getElementById(id+"Text").className = document.getElementById(id+"Text").className.replace(/\bheight_limited\b/, '');
    document.getElementById(id+"Button").innerHTML = "HIDE FULL ERROR";
    document.getElementById(id+"Button").onclick = HideError(id);
}

function HideError(id) {
    document.getElementById(id).className += " height_limited";
    document.getElementById(id+"Text").className += " height_limited";
    document.getElementById(id+"Button").innerHTML = "SHOW FULL ERROR";
    document.getElementById(id+"Button").onclick = "ShowError(id)";
}
Tony Stark
quelle
2
Ich mache dies nicht zu einer Antwort, da Sie speziell nach Vanille-JavaScript fragen, aber vielleicht möchten Sie sich mit jQuery befassen. Es ist eine JavaScript-Bibliothek, die Ihnen dabei helfen kann, das zu tun, was Sie in Ihrer Frage suchen.
JasCav
Kennen Sie JQuery, können Sie in diesem Fall nur Javascript verwenden. Vielen Dank.
Tony Stark
1
Die onclickEigenschaft sollte in Kleinbuchstaben angegeben werden. developer.mozilla.org/en/DOM/element.onclick
Matt Ball
Werden keine Ereignishandler mit + = hinzugefügt? Und vielleicht müssen Sie dies sogar tun:myobject.onclick += function() { Foo(); }
Mikael Östberg
1
Es stellte sich heraus, dass ich das + = nicht brauchte. Ich denke, + = würde die vorhandene Onclick-Funktion nicht entfernen, oder?
Tony Stark

Antworten:

106

Ihr Code ruft die Funktion auf und weist onClick den Rückgabewert zu. Außerdem sollte er 'onclick' sein. So sollte es aussehen.

document.getElementById("a").onclick = Bar;

Wenn Sie sich Ihren anderen Code ansehen, möchten Sie wahrscheinlich Folgendes tun:

document.getElementById(id+"Button").onclick = function() { HideError(id); }
Ryan
quelle
10
Ich wollte nur hinzufügen, dass Ryan die Klammern nach Bar nicht enthält, da es sich nicht um einen Funktionsaufruf handelt.
GoldfishGrenade
... Sie möchten wahrscheinlich so etwas tun: .onclick = HideError; // Wenn dies nicht funktioniert, warum nicht? Was ist der Unterschied zur obigen Antwort?
Pashute
@pashute Der Unterschied besteht darin , dass .onclick = HideErrorberufen wird , HideError(event: MouseEvent)während die oben genannte Antwort aufruft HideError(id). Wenn Sie sich nicht für Parameter interessieren, können Sie die kürzere Version verwenden und das Ereignis ignorieren, das
Patrick
65
var Foo = function(){
    document.getElementById( "a" ).setAttribute( "onClick", "javascript: Boo();" );
}

var Boo = function(){
    alert("test");
}
Otuyh
quelle
2
Dies scheint der beste Weg zu sein. Obwohl andere funktionieren, funktioniert das Hinzufügen einer Funktion direkt zu onclick in einigen Szenarien möglicherweise nicht. Ich hatte ein Problem in einem Fall, in dem das Erstellen mehrerer Schaltflächen in einer Schleife und das Zuweisen einer Funktion für einen Klick für jede Schaltfläche in der Schleife nicht funktionierte. Es würde allen Tasten die Funktion für die letzte Taste zuweisen. Diese Methode funktioniert wie ein Zauber. Danke Hor!
Deepak GM
1
Sollte onclicknicht sein onClick.
user66001
@ user66001 es spielt keine Rolle, HTML unterscheidet nicht zwischen Groß- und Kleinschreibung
Kyle
@Calne - Kamelfall könnte die Leute denken lassen, dass es sein muss.
user66001
2
Ist das noch wahr? 'onClick' hat bei mir nicht funktioniert, 'onclick' jedoch. Mit Chrome 47 unter Windows 7 64-Bit.
Sujay Phadke
21

Rufen Sie die Methode nicht auf, wenn Sie den neuen onclickHandler zuweisen .

Entfernen Sie einfach die Klammer:

document.getElementById("a").onclick = Foo;

UPDATE (aufgrund neuer Informationen ):

document.getElementById("a").onclick = function () { Foo(param); };
John Giotta
quelle
Leider habe ich einen Parameter, der da sein muss. Ändert das Ihre Antwort?
Tony Stark
1
@hatorade: benutze onclick = function () {Foo (params); };
Reid
@hatorade - Jadocument.getElement... function() { Foo(param);};
John Giotta
Vielen Dank für die Hilfe. Ich würde dir die Antwort geben, wenn ich könnte, aber Ryan hat sie ein paar Minuten früher bekommen. Entschuldigung :(. Ich habe aber +1 gemacht!
Tony Stark
1
sollte das .onclick sein, nicht .onClick?
GlennG
10

Ich empfehle diesen Ansatz:

Verwenden Sie anstelle von zwei Klick-Handlern nur eine Funktion mit einer if-else-Anweisung. Lassen Sie den Status des BUTTON-Elements bestimmen, welcher Zweig der if-else-Anweisung ausgeführt wird:

HTML:

<button id="a" onclick="toggleError(this)">Button A</button>

JavaScript:

function toggleError(button) { 
    if ( button.className === 'visible' ) {
        // HIDE ERROR
        button.className = '';
    } else {
        // SHOW ERROR
        button.className = 'visible';
    }
}

Live-Demo: http://jsfiddle.net/simevidas/hPQP9/

Šime Vidas
quelle
Ich persönlich mag diese Lösung, weil sie den Code für die Schaltfläche zusammenhält (und als Umschalter, wenn Sie eine Seite aktualisieren, möchten Sie normalerweise die andere Seite aktualisieren), aber ich habe auch mit Vue gearbeitet und v-on: click verwendet Die beste Antwort schien also nicht für mich zu funktionieren. Danke Sime!
OhFiddleDiddle
10

Dank João Paulo Oliveira war dies meine Lösung, die eine Variable enthält (was mein Ziel war).

document.getElementById( "myID" ).setAttribute( "onClick", "myFunction("+VALUE+");" );
TheSatinKnight
quelle
5

Sie können versuchen, das Schaltflächenattribut folgendermaßen zu ändern:

element.setAttribute( "onClick", "javascript: Boo();" );
João Paulo Oliveira
quelle
3

Was einfacher sein könnte, ist, zwei Schaltflächen zu haben und sie in Ihren Funktionen ein- / auszublenden. (dh display:none|block;) Jede Schaltfläche kann dann einen eigenen Klick mit dem von Ihnen benötigten Code haben.

Also button1wäre display:blockund button2wäre es zuerst display:none. Wenn Sie dann auf klicken, wechselt button1es button2zu sein display:blockund button1zu sein display:none.

Richard Marskell - Drackir
quelle
Perfekte Antwort! Für jemanden, der mit Javascript nicht wirklich vertraut ist, ist dies eine sehr hilfreiche Methode.
RolandiXor
0

Für jeden wie mich, der versucht, eine Abfragezeichenfolge für die Aktion festzulegen, und sich fragt, warum sie nicht funktioniert.

Sie können keine Abfragezeichenfolge für eine GET-Formularübermittlung festlegen, aber ich habe festgestellt, dass dies für einen POST möglich ist.

Für eine GET-Übermittlung müssen Sie die Werte in versteckten Eingaben festlegen, z

Eine Aktion von: "/handleformsubmission?foo=bar" wäre als verstecktes Feld hinzugefügt worden wie:<input type="hidden" name="foo" value="bar" />

Dies kann dynamisch in JavaScript hinzugefügt werden als (wobei clickedButton die übermittelte Schaltfläche ist, auf die geklickt wurde:

var form = clickedButton.form;
var hidden = document.createElement("input");
hidden.setAttribute("type", "hidden");
hidden.setAttribute("name", "foo");
hidden.setAttribute("value", "bar");
form.appendChild(hidden);

Weitere Informationen zum Senden eines GET-Formulars mit Abfragezeichenfolgenparametern und ausgeblendeten Parametern finden Sie in dieser Frage

anotheruser1488182
quelle