【问题标题】:How do I get element related to active input in jQuery UI Autocomplete?如何在 jQuery UI 自动完成中获取与活动输入相关的元素?
【发布时间】:2014-06-04 02:44:52
【问题描述】:

我正在尝试通过 jQuery UI 自动完成传递自定义表单属性(类别)以用于产品搜索。该表单看起来像 <form id="BulkOrderForm" category="samplecategory"><input></input>...</form> 并包含使用自动完成脚本的输入。每个页面上可以有多个表单,因此我需要能够从包含活动输入字段的表单中获取类别值。

这是我的来源:

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);
                }
            });
        }
    });
}

对如何实现这一点有任何想法吗?

【问题讨论】:

    标签: jquery-ui-autocomplete


    【解决方案1】:

    如果我理解正确,您正在尝试在 ajax 请求中使用活动的 input 的父 form。这是实现这一目标的一种方法:

    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]);
            }
        });
    });
    

    不要在从所有forms 中获取inputs 的包罗万象的选择器上使用自动完成,而是首先选择forms 本身。对于每一个,提取类别,然后选择所有子 inputs 并在该结果上调用自动完成。然后您可以在 ajax 调用中使用 category 变量 - 在示例中,我只是将它传递给回调以显示。

    http://jsfiddle.net/Fw2QA/

    【讨论】:

    • +1 好的解决方案。虽然我不知道 OP 是否愿意使用 jQuery 的“数据”功能。我的意见是使用它更好,因为将属性放在 html 中并手动处理它们看起来很怪异,但也可能是例外。
    • 是的,因为属性或数据方法都可用于获取类别,而数据方法是“正确”的 HTML5 方法(尽管实际上并没有真正的区别) ,我想我会把它扔在那里激起 OP 的好奇心 :)
    【解决方案2】:

    我会给你另一个解决方案,你可以查找活动输入的父表单,并从中提取属性。因为我不知道您表单中的这个类别是否是动态的,或者您是否可以控制代码中涉及的所有过程,所以我会给您一个更通用的解决方案,尽管如果该属性是动态的“Turch " 解决方案比我的要好得多,让 jquery 的data 功能处理属性更改,如果它是静态的,那么您可以这样做:

    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.
    }
    

    更新

    一个小例子说明我的建议(由@Turch 提供> 谢谢),可以在here 找到。

    【讨论】:

    • 这只有在有一种形式时才有效,因为所有对source 的调用都会引用相同的element 变量。查看jsfiddle.net/Fw2QA/1 - 所有输入都使用“formB”。您仍然可以自下而上(从元素查找表单)而不是自上而下(获取表单,为每个表单获取输入),但需要将其保存到封闭变量中,以便不同的输入可以使用不同的值.
    • 这是一个使用 .each() 的版本:jsfiddle.net/Fw2QA/2。现在每个输入的source都有一个变量的副本@
    • @Turch 这不正确。每个输入都会调用源代码,因为他直接根据 ID 将自动完成设置到输入上。我的代码假设设置是由 id 进行的,您的示例是错误的 (.../1),因为它通过指定更通用的选择器做出了不正确的假设!
    • 嗯,好的,您的最后评论清除了它。是的,这也是一种完全可行的方式(这就是我在上一个 .../2 fiddle 中所做的)。 Ed:评论编辑耶 :)
    • 感谢您的回答,非常感谢。我选择了 Turch 的答案,因为它开箱即用,Turch 首先回答。但是,你的答案是有效的,至少对于一个单一的形式!看起来需要对其进行一些修改才能使用多种表单,但我还没有机会对此进行调查......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-09
    • 1970-01-01
    相关资源
    最近更新 更多