Jeremiah Prummer
Jeremiah Prummer

Reputation: 180

How do I get element related to active input in jQuery UI Autocomplete?

I'm trying to pass a custom form attribute (category) through jQuery UI Autocomplete to use in a product search. The form looks like <form id="BulkOrderForm" category="samplecategory"><input></input>...</form> and contains inputs that use the autocomplete script. There can be several forms on each page, so I need to be able to get the category value from the form that contains the active input field.

Here's my source:

function autocomplete() {
    $("input.wcbulkorderproduct").autocomplete({
        element: function(){
            var element = $('form#BulkOrderForm').attr('category');
            return element;
        },
        source: function(request, response, element){
            $.ajax({
                url: WCBulkOrder.url+'?callback=?&action='+acs_action+'&_wpnonce='+WCBulkOrder.search_products_nonce,
                dataType: "json",
                data: {
                    term: request.term,
                    category: element
                },
                success: function(data) {
                    response(data);
                }
            });
        }
    });
}

Any thoughts on how this can be acheived?

Upvotes: 1

Views: 993

Answers (2)

Jo&#227;o Pinho
Jo&#227;o Pinho

Reputation: 3775

I'll give you another solution, you can lookup the parent form of the active input, and extract the attribute from it. Because I don't know if this category in your form is dynamic or no, or either if you can control all of the process involved in your code, I'll give you a more generic solution, although if that attribute is dynamic "Turch" solution is way better than mine, by letting the data functionality of jquery handle the attribute changes, if it's static, than you can just do it like this:

function autocomplete() {
    var element = $("input.wcbulkorderproduct").autocomplete({
        source: function(request, response){
            $.ajax({
                url: WCBulkOrder.url+'?callback=?&action='+acs_action+'&_wpnonce='+WCBulkOrder.search_products_nonce,
                dataType: "json",
                data: {
                    term: request.term,
                    category: element
                },
                success: function(data) {
                    response(data);
                }
            });
        }
    }).parents('form').first().attr('category'); 

    //chained call, sets autocomplete, grabs the parent form and the attribute
    //which is saved on the variable element, and is used on every call through
    //javascript context inheritance.
}

UPDATE

A little example illustrating my suggestion (provided by @Turch > thanks), can be found here.

Upvotes: 2

Turch
Turch

Reputation: 1546

If I'm understanding correctly, you're trying to use the active input's parent form in the ajax request. Here's a way to achieve that:

Html:

<form data-category="form1">
    <input type="text" />
    <input type="text" />
</form>
<form data-category="formB">
    <input type="text" />
    <input type="text" />
</form>

JS:

$('form').each(function () {
    var category = $(this).data('category');

    $(this).find('input').autocomplete({
        source: function (request, response) {
            response([category]);
        }
    });
});

Instead of using autocomplete on a catch-all selector that gets inputs from all forms, first select the forms themselves. For each one, extract the category, then select all child inputs and call autocomplete on that result. Then you can use the category variable in the ajax call - in the example I'm simply passing it to the callback to display.

http://jsfiddle.net/Fw2QA/

Upvotes: 2

Related Questions