2011-03-14 23 views
41

tengo un botón:Cambio onclick acción con una función Javascript

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

Al hacer clic en este botón la primera vez, quiero que se ejecute Foo (que lo hace correctamente):

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

Lo que quiero que suceda cuando haga clic en el botón la primera vez es cambiar la función onclick de Foo() a Bar(). Hasta ahora, solo he podido lograr un ciclo infinito o ningún cambio en absoluto. Bar() sería algo como esto:

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

Por lo tanto, al hacer clic en este botón es sólo alterna cuya función es llamada. ¿Cómo puedo hacer que esto funcione? Alternativamente, ¿cuál es una mejor manera de mostrar/ocultar el texto completo de una publicación? Originalmente se inicia un cortocircuito, y proporciono un botón para "ver el texto completo". Pero cuando hago clic en ese botón, quiero que los usuarios puedan hacer clic nuevamente en el botón para que desaparezca la versión larga del texto.

Aquí está el código completo, si ayuda:

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)"; 
} 
+2

No estoy haciendo esto una respuesta ya que usted está preguntando específicamente sobre JavaScript vano, pero es posible que desee buscar en jQuery. Es una biblioteca de JavaScript que puede ayudarte a hacer lo que estás buscando hacer en tu pregunta. – JasCav

+0

Conozca JQuery, solo puede usar Javascript en este caso. Gracias. – sepiroth

+1

La propiedad 'onclick' debe estar en minúsculas. https://developer.mozilla.org/en/DOM/element.onclick –

Respuesta

67

Su código está llamando a la función y asignar el valor devuelto a onclick, también debe ser 'onclick '. Así es como debería verse.

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

En cuanto a su otro código que probablemente va a querer hacer algo como esto:

document.getElementById(id+"Button").onclick = function() { HideError(id); } 
+5

Solo quería agregar que Ryan no incluye los paréntesis después de Bar porque no es una llamada de función. – GoldfishGrenade

+0

... es probable que desee hacer algo como esto: .onclick = HideError; // si esto no funciona, ¿por qué no? ¿Cuál es la diferencia de la respuesta anterior? – pashute

10

no se debe invocar el método de la asignación del nuevo manejador onclick.

Simplemente quite el paréntesis:

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

ACTUALIZACIÓN (debido a new information):

document.getElementById("a").onclick = function() { Foo(param); }; 
+0

Lamentablemente, tengo un parámetro que debe estar allí. ¿Eso cambia tu respuesta? – sepiroth

+1

@hatorade: use onclick = function() {Foo (params); }; – Reid

+0

@hatorade - Sí 'document.getElement ... function() {Foo (param);};' –

7

recomiendo este enfoque:

En lugar de tener dos controladores de clic, tener sólo una función con una declaración if-else. Dejar que el estado del elemento BUTTON determinar qué rama de la instrucción if-else es ejecutado:

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'; 
    } 
} 

Demostración en directo:http://jsfiddle.net/simevidas/hPQP9/

2

Lo que podría ser más fácil, es tener dos botones y mostrarlos/esconderlos en sus funciones. (es decir, display:none|block;) Cada botón podría tener su propio clic con el código que necesite.

Por lo tanto, al principio button1 sería display:block y button2 sería display:none.Luego, cuando haga clic en button1, cambiaría button2 para que sea display:block y button1 para que sea display:none.

+0

¡Respuesta perfecta! Para alguien que no esté realmente familiarizado con javascript, este es un método muy útil. – RolandiXor

39
var Foo = function(){ 
    document.getElementById("a").setAttribute("onClick", "javascript: Boo();"); 
} 

var Boo = function(){ 
    alert("test"); 
} 
+2

Esta parece ser la mejor manera de hacerlo. Aunque otros funcionan, agregar una función directamente a onclick puede no funcionar en algunos escenarios. problema en un caso donde crear varios botones en un bucle y asignar una función para hacer clic en cada botón en el ciclo w como no funciona Asignaría la función para el último botón a todos los botones. Usar este método funciona como un encanto. Gracias Hor! –

+0

Debe ser 'onclick', no' onClick'. – user66001

+0

@ user66001 no importa, HTML no distingue entre mayúsculas y minúsculas – Kyle

2

Usted podría intentar cambiar el atributo botón de la siguiente manera:

element.setAttribute("onClick", "javascript: Boo();"); 
2

Gracias a João Paulo Oliveira, este fue mi solución que incluye una variable (que era mi objetivo).

document.getElementById("myID").setAttribute("onClick", "myFunction("+VALUE+");"); 
Cuestiones relacionadas