Nicolas de Fontenay
Nicolas de Fontenay

Reputation: 2200

How to get element Id from dynamically generated form elements with jquery?

To try the concept, I'm doing a very simple test.

I got a form with some text input showing up from the start. When I click on a field, I want to capture its Id, and add a value to the input text.

$(document).ready(function() {
    $('input').focus(function() {
        var currentId = $(this).attr('id');
       $("#"+currentId).val('blah');
    });
});

This works great with the initial fields, but it stops working with the fields added using ajax calls.

The trick is, users are able to click on any field and I don't know which until they click. My Ids looks like this:

experience0-CompanyName //(original one)
experience[n]-CompanyName

(the [n] part is also used to order the fields in the form as elements are grouped by experience, education skills etc...

how can I achieve this?

Upvotes: 4

Views: 32226

Answers (4)

bittids
bittids

Reputation: 150

The previous answers are no longer appropriate. They rely on jQuery.live, which is now deprecated. In jQuery 1.11, a call to jQuery.live produces an error. The current preferred solution is to use jQuery.on . The implementation of the jQuery.live code, above, would be as follows. The second parameter, currently set to ":input", can be replaced by a selector that conforms to your needs.

$( "body" ).on('focus', ":input", function() {
    var currentId = $(this).attr('id');
    $("#"+currentId).val('blah');
});

Upvotes: 3

bjornd
bjornd

Reputation: 22951

It can be simpler (no need to get id and search by it):

$(document).ready(function() {
    $('input').live('focus', function() {
        $(this).val('blah');
    });
});

Upvotes: 1

Andrew Cooper
Andrew Cooper

Reputation: 32596

A simple change:

$(document).ready(function() {
    $('input').live("focus", function() {
        var currentId = $(this).attr('id');
       $("#"+currentId).val('blah');
    });
});

.focus only binds to elements that exist at the time it's called. .live() binds a function to an event for all existing elements, and any that are added to the DOM later.

Upvotes: 5

Mayank
Mayank

Reputation: 5738

I belive you are using $("<someid>").focus(<function>). This works on document already loaded and not on new tags added.

Try using $("<someid>").live("focus", <function>);

Also do have a look at jquery website. They got quite nice documentation with examples. For live check this out http://api.jquery.com/live/

Upvotes: 0

Related Questions