2010-09-03 19 views
9

Sto provando a modificare l'evento 'onchange' di un elemento 'select' esistente.Come modificare l'attributo 'onchange' in un tag 'select'? (usando jquery)

Per esempio fini Ho il codice seguente:

<select id="sel_id" onchange="javascript:foo();" > 

e ogni volta che provo a cambiare il suo 'onchange' attributo Sono stato con il seguente:

$("#sel_id").attr("onchange", "foo_2()"); 

proposito, questo codice che dovrebbe va bene, non funziona, l'attributo 'onchange' rimane invariato. Quindi come dovresti modificarlo?

AMMENDMENT:

È possibile rimuovere l'attributo e quindi associare una funzione diversa, come:

$("#sel_id").removeAttr("onchange").bind("change", function(){ foo_2(); }); 

ma il problema rimane, è possibile cambiare il 'onchange' attributo senza rimuoverlo innanzitutto?

risposta

17
Non

una risposta esatta alla domanda, ma probabilmente avrei rimuovere l'evento usando questo:

document.getElementById('sel_id').onchange = undefined; 

(come si vede in How to Clear/Remove JavaScript Event Handler?)

e poi andare con questo:

$('#sel_id').change(function() { foo_2(); }); 
+0

Sì, questa è la risposta corretta, ho certo bisogno di rimuovere l'evento e legare il mio utilizzando jQuery. – vitorhsb

+1

'$ ('sel_id'). Attr ('onchange', undefined) .change (function() {foo_2();});' è il modo jQuery per farlo. In questo modo puoi semplicemente eseguire entrambe le operazioni con un oggetto jQuery. – Muhd

+1

Anche OP potrebbe probabilmente solo eseguire ".change (foo_2)" invece di eseguire il wrapping in una funzione anonima. – Muhd

3

Funziona per me se utilizzo il codice nativo setAttribute().

Inoltre, ricorda che hai bisogno di virgolette attorno al selettore.

$("#sel_id")[0].setAttribute("onchange", "foo_2()"); 

Ricordo anche per definire foo_2 nel namespace globale, e non all'interno la funzione di jQuery .ready().

+0

Hai ragione, ho dimenticato le virgolette nell'esempio ma sono state usate nel codice reale. (modifica la domanda) 'setAttribute()' dovrebbe essere la soluzione per la domanda, ma in realtà ha lo stesso problema che ho presentato. Se un attributo 'onchange' è dichiarato nell'elemento, non viene sostituito e viene attivato il vecchio codice evento. Inoltre, preferirei utilizzare una funzione di ambito interno nell'evento onchange. Quindi, potrei effettivamente usare il codice che mi riferisco all'ammendamento. – vitorhsb

+0

@vitorhsb - Dalla tua aggiunta alla tua domanda, rimane il problema della chiamata di 'foo()'. È questo in IE? Si potrebbe provare a impostare la proprietà 'onchange' su null:' $ ("# sel_id") [0] .onchange = null; '. Non sono sicuro se ciò aiuterà, ma forse vale la pena provare. – user113716

+0

Questo è fantastico! Sembra esserci un bug in IE8 associato all'associazione di un evento di modifica a una selezione. Ho provato quasi tutto (addEventListener e jQuery .change e .bind.) Nessuno ha funzionato, ma questo ha funzionato. Grazie! –

2

Utilizzare la funzione di modifica JQuery.

 
$('#sel_id').change(function() { 
    //your code 
}); 
+0

In questo modo si attiva ancora l'evento onchange dichiarato nel tag select – vitorhsb

+0

Quindi usa $ ('# sel_id'). Unbind ('cambia ') first – jcubic

+1

'$ (' # sel_id '). unbind (' change ')' in realtà non rimuove l'evento precedente dichiarato nel tag html, rimuove solo gli eventi di bind dichiarati dinamicamente. – vitorhsb

0

Ecco un modo per farlo utilizzando solo javascript:

<html> 
<head> 
<script type = "text/javascript" langauge="JavaScript"> 
function foo(){ 
    alert("foo"); 
} 
function fi() { 
    alert('fi'); 
} 
</script> 
</head> 
<body> 
<select id = "select_list" onchange="foo();"> 
<option value = "1">1</option> 
<option value = "2">2</option> 
</select> 
<input type = "button" value = "change" onclick = "document.getElementById('select_list').onchange = fi;"> 
</body> 
</html>