2010-09-03 9 views
9

Próbuję edytować zdarzenie "onchange" istniejącego elementu "select".Jak edytować atrybut "onchange" w znaczniku "wybierz"? (używając jquery)

Na przykład celów Mam następujący kod:

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

i gdy próbuję zmienić jego 'onchange' atrybut używałem następujący:

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

FYI, to kod, który powinien w porządku nie działa, atrybut "onchange" pozostaje niezmieniony. Jak więc edytować?

AMMENDMENT:

można usunąć atrybut, a następnie powiązać inną funkcję jak:

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

ale problem pozostaje, czy jest możliwe, aby zmienić „onchange” atrybutu bez wyjmowania go na pierwszym miejscu?

Odpowiedz

17

Nie dokładną odpowiedź na pytanie, ale pewnie bym usunąć zdarzenie za pomocą tego:

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

(jak widać na How to Clear/Remove JavaScript Event Handler?)

a następnie iść z tym:

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

Tak, to jest poprawna odpowiedź, na pewno trzeba usunąć zdarzenie i wiązać własne przy użyciu jQuery. – vitorhsb

+1

'$ ('sel_id'). Attr ('onchange', undefined) .change (function() {foo_2();});' jest sposobem jQuery to zrobić. W ten sposób można po prostu wykonać obie operacje za pomocą jednego obiektu jQuery. – Muhd

+1

Również OP może prawdopodobnie zrobić '.change (foo_2)' zamiast owijać w anonimową funkcję. – Muhd

3

Działa dla mnie, jeśli używam natywnego setAttribute().

Pamiętaj też, że potrzebujesz cytatów wokół selektora.

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

Należy również pamiętać, aby określić foo_2 w globalnej przestrzeni nazw, a nie wewnątrz .ready() funkcji jQuery.

+0

Masz rację, zapomniałem cytatów z przykładu, ale zostały użyte w prawdziwym kodzie. (edytowane pytanie) 'setAttribute()' powinno być rozwiązaniem dla pytania, ale faktycznie ma ten sam problem, który przedstawiłem. Jeśli w elemencie zostanie zadeklarowany atrybut "onchange", nie zostanie on zastąpiony i zostanie wywołany stary kod zdarzenia. Ponadto wolałbym używać wewnętrznej funkcji zasięgu w zdarzeniu onchange. W ten sposób mogę faktycznie użyć kodu, który odnoszę w poprawce. – vitorhsb

+0

@vitorhsb - Z twojego dodatku do twojego pytania, pozostaje kwestia wywołania 'foo()'. Czy to jest w IE? Możesz spróbować ustawić właściwość 'onchange' na wartość null:' $ ("# sel_id") [0] .onchange = null; '. Nie jestem pewien, czy to pomoże, ale może warto spróbować. – user113716

+0

To jest świetne! Wygląda na to, że w IE8 występuje błąd związany z powiązaniem zdarzenia zmiany z zaznaczeniem. Próbowałem już prawie wszystkiego (addEventListener i jQuery .change i .bind.) Żaden nie działał, ale tak się stało. Dzięki! –

2

Użyj funkcji zmiany JQuery.

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

W ten sposób nadal wyzwala zdarzenie onchange zadeklarowane w znaczniku select – vitorhsb

+0

Następnie użyj $ ('# sel_id'). Unbind ('change ') najpierw – jcubic

+1

'$ (' # sel_id '). unbind (' change ')' faktycznie nie usuwa poprzedniego zdarzenia zadeklarowanego w znaczniku html, usuwa tylko zdarzenia bind zadeklarowane dinamicznie. – vitorhsb

0

Oto sposób to zrobić używając tylko 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> 
Powiązane problemy