English 中文(简体)
Jquery .change() function not working with dynamically populated SELECT list
原标题:

I have a select field that is dynamically populated with an ajax call that simply returns all the HTML select options. Here is the part of the PHP that just echo s the select tags and dynamically fills out each option/value.

echo "<select name= player1  class= affector >";
echo "<option value=   selected>--".sizeof($start)." PLAYERS LOADED--</option>";

foreach ($start as $value) {
    echo "<option value= ".$value." >".$value."</option>";
 }  
  echo "</select>";
}  

After this list is populated, I m trying to call a change event, so that whenever the default option is changed in the SELECT list or in a text field with the same class, it disables a radio button set in another part of the form. (You can see the initial question I asked to get this part of the functionality working here)

$( .affector ).change(function(){
       $(this).parents( tr ).find( input:radio ).attr( disabled , false);
});

For some reason, even though I give the select field the proper class name (affector), when I select different options in the field, the other parts of the form do not disable. The static text field with the same class works fine. I m stumped.

Any ideas?

最佳回答

Just commented on your last question...Here s what I said:

Use jQuery bind

function addSelectChange() {
   $( select ).bind( change , function() {
       // yada yada
   });
} 

Call addSelectChange in your ajax success function. It should do the trick. Take a look at jQuery live event too (for when you want to set events for all current and future DOM elements in a later project or something). Unfortunately the change event and a few others aren t yet supported with live. Bind is the next best thing

问题回答

A more up to date answer..

Since the elements are dynamically populated, you are looking for event delegation.

Don t use .live()/.bind()/.delegate(), though. You should use .on().

According to the jQuery API docs:

As of jQuery 1.7, the .on() method is the preferred method for attaching event handlers to a document. For earlier versions, the .bind() method is used for attaching an event handler directly to elements. Handlers are attached to the currently selected elements in the jQuery object, so those elements must exist at the point the call to .bind() occurs. For more flexible event binding, see the discussion of event delegation in .on().

Therefore you would use something like this:

$(document).on( change ,  select , function (e) {
    /* ... */
});

An example using .live()

$( #my_form_id select[name^="my_select_name"] ).live( change , (function () {
    console.log( $("option:selected", this).val());
    })
 );

For items that are dynamically inserted into the DOM, their events must be bound with

$( .selector ).bind( change ,function() { doWork() });

This is because when you run $(function(){}); and bind events using $.click or $.change, etc., you are binding events to elements already existing in the DOM. Any manipulation you do after that does not get affected by whatever happens in the $(function(){}); call. $.bind tells your page to look for future elements in your selector as well as current ones.

try .live: http://docs.jquery.com/Events/live

From docs: Binds a handler to an event (like click) for all current - and future - matched element. Can also bind custom events.

I found as solution to make only

<select id="myselect"></select> 

in php/html file and then generate options for it by ajax:

$.post("options_generator.php", function (data) { $("#myselect").append(data); });

In options_generator.php echo options only:

echo "<option value= 1 >1</option>";
echo "<option value= 2 >2</option>";




相关问题
jquery change() on input box in IE6 - can t remove focus

I have a checkout page that unobtrusively checks to see whether a customer has ordered from us before. After they fill in their e-mail address and focus to the next box, I look up the e-mail and ...

Putting focus on a textbox in onchange event

I am trying to get it so that when a certain value is put into a textbox, the focus will stay on the textbox(and an alert will be shown in production). I am trying to get this to work in Firefox 3.5.7 ...

Javascript onchange different in IE and FireFox

When this onchange event in IE returns false, IE focus stays on that input box. In Firefox the focus always moves to the next field regardless. HTML: input name="seminar_donation" type="text" id="...

dojo dijit client side validation onchange

So I followed the example in the Dojo - Using the Dojo JavaScript Library to Build Ajax Applications to add server-side validation to the username validationtextbox field on my form. Basically I added ...

onchange attribute won t call function

I have an HTML document (here), which creates an iframe-based media player for a collection of songs within albums (I just used letters to define these albums and songs in the mymusic array, for ...

Internet Explorer file input onchange

I have these dynamically created file input HTML elements which are used with a jQuery-ajax file upload plug-in. I would like the file upload to start after the input value has been updated. However,...

热门标签