【问题标题】:Having trouble with Javascript autocomplete library when getting data with getJSON使用 getJSON 获取数据时遇到 Javascript 自动完成库问题
【发布时间】:2012-04-11 13:20:30
【问题描述】:

我遇到了以下代码的问题:

var setupSearch = {

searchSuggest: function(field) {
    $.getJSON('/get-all-journals', {'url':'on'}, function(data) {

        var SHCount = Number($.cookie('SHCount'));
        var SHArray = new Array();
        for (i=1; i <= SHCount; i++) {
            SHArray.push($.cookie('SH'+i));
        }
        $(field).ddautocomplete(removeDuplicate(SHArray), data.response.docs, {
            matchContains: true,
            max: 5,
            cacheLength: 5000,
            selectFirst: false,
            scroll: false,
            formatResult: function(str) { return str; },
            formatItem2: function(item) {
                return item.journal_display_name;
            },  
            formatMatch2: function(item) {
                return item.journal_display_name;
            },  
            formatResult2: function(item) {
                return item.journal_display_name;
            }   
        }); 
    }); 
},  
                
                        
searchForm: function(form) {

    var field = form.find('textarea');
    // Setup query field for default text behavior
    // setupField(field);

    setupSearch.searchSuggest(field);
    field.autogrow();
        
    field.keydown(function(e) {
        if (e.keyCode == 13) {
            form.submit();
            return false;
        }   
    }); 

    // Make all forms submitting through Advanced Search Form
    form.submit(function(e) {
        e.preventDefault();
        setupSearch.submitSearch(form, field);
    });
}, 


 submitSearch: function(form, field) {
    if (advancedSearch.checkMinFields() || (!field.hasClass('defaultText') && field.val() != '')) {
        // Sync the refine lists
        // syncCheckboxLists($('#refineList input'), $('#advancedRefineList input'));
        form.find('button').addClass('active');
        $('#advancedSearchForm').submit();
    } else {
        $('#queryField').focus();
    }
},

当我尝试通过按 Enter 使用自动完成下拉菜单时,它似乎遇到了“竞争条件”,表单将提交我输入的内容,而不是自动完成在文本字段中放置的内容。有什么方法可以控制事件的顺序,以便form.submit() 将使用自动完成填充到文本字段中的内容?

【问题讨论】:

    标签: javascript jquery-events jquery-ui-autocomplete race-condition getjson


    【解决方案1】:

    实际的自动完成下拉菜单很可能表示为一个样式列表(或其他一些元素),该列表浮动以定位在文本框下方。提交时,让您的函数等待(最多一两秒)自动完成菜单被销毁或隐藏。这将确保插件在提交数据之前有时间填写文本框。

    编辑

    试试这样的:

    $("#myDropdown").bind("autocompleteclose", function(){
        // Continue with submitting your form
    });
    

    在提交表单的地方使用它,并将提交代码放在回调中。这样,它会在提交表单之前等待自动完成关闭。您需要为此添加某种超时,以防止它在长时间延迟后提交(但不确定何时会发生这种情况)。

    【讨论】:

    • 我正在使用 jQuery 自动完成插件,但经过修改以允许 2 个数据集。您建议等待哪个功能?表单提交功能?我会使用 setTimeout 来做到这一点吗?
    • 有几十个。是 jQuery UI 内置的吗(jqueryui.com/demos/autocomplete)?
    • 好的。我会试试看。什么会触发“autocompleteclose”事件?当我回车时,是否需要向自动完成插件添加触发器?
    • 不,jQuery UI 会在菜单关闭时自动触发。
    • 感谢它的工作!但是,它引入了一个新问题,如果用户尝试在自动完成加载之前使用 enter 提交表单,那么他们将无法提交表单。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-14
    • 2022-01-02
    • 2019-11-14
    • 2021-03-03
    • 2012-03-09
    • 1970-01-01
    • 2020-12-11
    相关资源
    最近更新 更多