Javascript JQuery自动完成帮助

Javascript JQuery自动完成帮助,javascript,jquery,jquery-ui,javascript-events,Javascript,Jquery,Jquery Ui,Javascript Events,我有一个定制的JQuery自动完成控件,声明如下 $('#SystemCode_Autocomplete').autocomplete({ source: [{"label":"Access","value":0},{"label":"Documentum","value":0}], //move values minLength: 1, change: function(event, ui) {// some function}, select: functio

我有一个定制的JQuery自动完成控件,声明如下

$('#SystemCode_Autocomplete').autocomplete({
    source: [{"label":"Access","value":0},{"label":"Documentum","value":0}], //move values
    minLength: 1,
    change: function(event, ui) {// some function},
    select: function(event, ui) {// some function}
});
更改和选择事件是自定义的。 问题是,如果我在文本框中键入内容,然后单击“提交”按钮(即,没有制表符,或失去焦点),或者如果我在文本框中键入内容后按键提交,则不会触发更改事件,并且必须在提交之前触发

我希望在不将javascript放在submit按钮后面的情况下完成它,并且理想情况下,在autocomplete控件本身中完成它。我尝试将更改添加到模糊事件中

${'foo').blur(function() { $('bar').trigger('autocompletechange');
// or
${'foo').blur(function() { $('bar').change();

但是没有一个有效,有人有什么想法吗?

聚焦功能自动完成功能

在焦点移动到某个项目(不选择)之前,ui.item指的是焦点项目。焦点的默认操作是将文本字段的值替换为焦点项目的值,但仅当焦点事件由键盘交互触发时。取消此事件会阻止更新值,但不会阻止聚焦菜单项

解决问题:

    $('#SystemCode_Autocomplete').autocomplete({
        source: [{"label":"Access","value":0},{"label":"Documentum","value":0}], //move values
        minLength: 1,
        focus: function( event, ui ) {
            return false;
        },
        select: function(event, ui) {
            alert('Select Event:'+ui.item.value);
        }
    });

所以,您的问题是,您必须确保操作a发生在操作b之前,并且您在协调两个事件处理程序之间存在问题?这听起来像是一个非常常见的UI问题,而不仅仅限于jQuery

在任何其他情况下,您将如何解决此问题?如果我建议您使用对象附加到元素,然后在每个方法中执行某种信号量检查,比如在一个方法中设置标志,在另一个方法中检查标志是否已设置,该怎么办


如果是我的话,我会这么做。

你可以试试这样的东西:

$('#SystemCode_Autocomplete').autocomplete({
    source: [{"label":"Access","value":0},{"label":"Documentum","value":0}], //move values
    minLength: 1,
    change: function(event, ui) {/* some function */},
    select: function(event, ui) {/* some function */}
}).each(function(){
    var self = $(this).closest("form").submit(function(e){
        self.trigger("change");

        // you may not need anything like this...but whatever
        if(!functionToCheckIfFormIsValid()){
            e.preventDefault();
        }
    });
});
  • 演示:

好的,我完全同意将这个更新到我们实际做的工作。 基本上,我们编辑了autocomplete.js文件,以使其符合我们的要求。 具体来说,我们将自己的选项添加到autocomplete中,然后我们编辑了类似这样的响应方法

_response: function (content) {
        if (content.length) {
            content = this._normalize(content);
            this._suggest(content);
            this._trigger("open");

            this.options.isInError = false;
            this.element.removeClass("input-validation-error");
        } else {
            this.close();

            if (this.element.val() == '') {
                this.options.hiddenField.val('');
            } else {
                this.options.hiddenField.val('-1');
            }
            if (this.options.mustBeInList) {
                this.options.isInError = true;
                this.element.addClass('input-validation-error');
            }
        }
        this.element.removeClass("ui-autocomplete-loading");
    },
这样,我们就知道用户在键入时是否输入了“垃圾”,控件是否变为红色并进入“错误”模式。为了阻止他们发回我们这样做

case keyCode.ENTER:
                case keyCode.NUMPAD_ENTER:
                    // when menu is open or has focus

                    if (self.options.isInError == true) {
                        return false;
                    }

                    if (self.menu.element.is(":visible")) {
                        event.preventDefault();
                    }
                    //passthrough - ENTER and TAB both select the current element
                case keyCode.TAB:
                    if (!self.menu.active) {
                        return;
                    }
                    self.menu.select(event);
                    break;

您实际上是从自动完成列表中选择项目,还是在框中键入完整值?您好。我正在文本框中输入值。您是否成功解决了此问题?你还需要帮助吗?是的,对不起,我忘了添加分辨率。见下:-)@TAkinremi:嗨,伙计,你考虑过检查我的答案吗?我现在知道它有点老了,但这是为了看在上帝的份上嗨,谢谢你的回复。我会试试看,但我觉得专注于“项目”而不是文本框?是的,那不起作用。当选择ui.item时,将触发焦点事件。我的问题是,如果我没有从文本框中选择tab(通过按提交或直接单击提交按钮),我的更改并选择events dont fire.Hi。不,我的问题是,我的更改事件不会触发,除非我标记为失控。我需要在提交表单时触发更改事件,以便它运行其有效性。我可以将它添加到subbmit按钮中,但我想知道是否有更好的方法。例如,关于JQuery,我还不知道。无法强制在非UI事件边界上触发UI事件。考虑到每三十秒引起鼠标失灵的后果,即使你故意咬住鼠标。“德拉克斯顿,你的观点是正确的,但是存在一个解决方案,测试我的回答。”AssiTik~你承认没有办法强制UI事件触发事件边界,除了手动调用代码之外,但是你想让我考虑一下我所维护的代码吗?我相信这是可能的,并且知道这是唯一的解决办法。我的观点是,他将被迫在某个时候调用事件处理程序。就这些。所以,是的,很棒,你做了我告诉他必须做的事,但是你如何追踪语义信号?“Drkjtern:LOL,我必须承认,我没有读你的回答,我只是指你的评论……考虑每三十秒引起鼠标的燃烧的后果……”并且再一次我说:你是对的;我猜每次autocomplete小部件根据json检查键入的单词时,都会触发鼠标,所以,在执行此操作时,我们可以执行您所说的信号量?看起来不错,谢谢。明天上班的时候我会试试,让你知道!只是想让你知道我还没试过。我会尽快让你知道的!看起来不错,谢谢。明天上班的时候我会试试,让你知道!只是想让你知道我还没试过。我会尽快让你知道的!
case keyCode.ENTER:
                case keyCode.NUMPAD_ENTER:
                    // when menu is open or has focus

                    if (self.options.isInError == true) {
                        return false;
                    }

                    if (self.menu.element.is(":visible")) {
                        event.preventDefault();
                    }
                    //passthrough - ENTER and TAB both select the current element
                case keyCode.TAB:
                    if (!self.menu.active) {
                        return;
                    }
                    self.menu.select(event);
                    break;