I am using the [Typeahead](http://twitter.github.com/bootstrap/javascript.html#typeahead) component of Twitter Bootstrap 2.1.1, and jQuery 1.8.1

I am trying to access the text box element from within typeahead's `updater` function. Here is my current code, which works great:

```
$('#client-search').typeahead({
    source: function (query, process) {
        $.get(url, { query: query }, function (data) {
            labels = [];
            mapped = {};
            $.each(data, function(i,item) {
                mapped[item.label] = item.value;
                labels.push(item.label);
            });
            process(labels);
        });
    }
    ,updater: function (item) {
        $('#client-id').val(mapped[item]);
        return item;
    }
    ,items: 10
    ,minLength: 2
});

```

I have many typeahead search boxes on the same page. Each search box has an id `#xxx-search` and a corresponding hidden input with id `#xxx-id`. I'd like to re-use the same code for everything by doing something like this:

```
$('#client-search, #endClient-search, #other-search').typeahead({

    ...

    ,updater: function (item) {
        var target = $(this).attr('id').split('-')[0] + '-id';
        $('#'+target).val(mapped[item]);
        return item;
    }

    ...

```

I thought that `this` would refer to the text box element in use, but apparently not, because I get an undefined error in firebug:

```
$(this).attr("id") is undefined

```

When I use `this` instead of `$(this)`, I get:

```
this.attr is not a function

```

Can anyone help make this work?

---

**UPDATE: THE ANSWER, AND MORE!**

Thanks to benedict\_w's answer below, not only does this work perfectly now, but I have also made this much better in terms of re-usability.

Here is what my `<input>`s look like:

```
<input type="text" autocomplete="off"
    id="client-search"
    data-typeahead-url="/path/to/json"
    data-typeahead-target="client-id">
<input type="hidden" id="client-id" name="client-id">

```

Notice how the search box references the hidden id. Here's the new js:

```
$(':input[data-typeahead-url]').each(function(){
    var $this = $(this);
    $this.typeahead({
        source: function (query, process) {
            $.get($this.attr('data-typeahead-url'), { query: query }, function (data) {
                labels = [];
                mapped = {};
                $.each(data, function(i,item) {
                    mapped[item.label] = item.value;
                    labels.push(item.label);
                });
                process(labels);
            });
        }
        ,updater: function (item) {
            $('#'+$this.attr('data-typeahead-target')).val(mapped[item]);
            return item;
        }
        ,items: 10
        ,minLength: 2
    });
});

```