对话错误中的JQuery自动完成

时间:2009-05-14 15:05:54

标签: jquery asp.net-mvc ajax jquery-ui autocomplete

所有

我在JQuery UI对话框中使用JQuery Autocomplete Plugin 1.0.2。不幸的是,在IE和FireFox中有 2个导致脚本错误的方案。我将提供FireFox Firebug错误,因为它们更具描述性。

首先,这里是JQuery Autocomplete脚本,它允许选择多个名称:

var queues = <% Html.RenderAction("AvailableQueues"); %>;
$($.jqId("requestQueuesText"), $theForm).autocomplete(queues, {
    minChars: 1,
    formatItem: function(row) {
        return row.Description;                
    },
    multiple: true,
    multipleSeparator: ";"
 });

现在,以下是导致错误发生的两种情况:


1)在其他任何事情之前键入一个空格“”我立即得到

错误: currentValue未定义; onChange()jquery.a ... mplete.js(第239行); [打破此错误] if(currentValue.length&gt; = options.minChars){

2)在自动填充下拉列表打开时关闭对话框,但不选择项目

* 这是我应该修复的报告错误。对话框关闭后,自动完成框将在几毫秒到几秒的任何时间内保持在视图中。主要目标是在对话框关闭的同时自动完成下拉菜单关闭,而不返回任何错误。我打赌,解决错误将解决整体问题。

错误:未捕获异常:[例外...“组件返回失败代码:0x80004005(NS_ERROR_FAILURE)[nsIDOMNSHTMLTextAreaElement.setSelectionRange]”nsresult:“0x80004005(NS_ERROR_FAILURE)”位置:“JS框架: :http://localhost:2659/Scripts/jquery.autocomplete.js :: anonymous :: line 752“data:no]


仅仅通过查看autocomplete documentation,我发现我可能需要以不同方式使用 formatItem 选项。

另外,我遇​​到了BGIFRAME,它看起来可能会以这种或那种方式提供帮助。

提前感谢您的任何帮助!

1 个答案:

答案 0 :(得分:1)

我能够通过将keydown事件链接到自动完成代码来解决第一个问题:

var queues = <% Html.RenderAction("AvailableQueues"); %>;
    $($.jqId("requestQueuesText"), $theForm).autocomplete(queues, {
        minChars: 1,
        formatItem: function(row) {
            return row.Description;                
        },
        multiple: true,
        multipleSeparator: ";",
        selectFirst: false
    }).keydown(function(event) {
        if (this.value != "" && this.value.charAt(this.value.length-1) != ";")
            return true;

        var keycode = $.browser.msie ? event.keyCode : event.which;
        return !/\s/.test(String.fromCharCode(keycode));
    });

这会在最初输入文本区域时禁止使用空格,并且还会在分号(multipleSeparator)之后阻止空白。

仍然遇到#2的问题。我想我需要在关闭属性或 $('a.close-trigger')上添加悬停或点击事件,这将从文本中删除focus()区域反过来强制自动完成下拉列表消失...还不知道如何使用以下对话框代码完成该操作:

$(".requestLink").click(function(event) {
        event.preventDefault();
        var $this = $(this);
        $this.addClass("loading");
        $.get(this.href, function(data) {
            $this.removeClass("loading");
            var $req = $("<div></div>").dialog({
                autoOpen: true,
                height: 650,
                width: 750,
                modal: true,
                title: "Request",
                overlay: { "background-color": "#d2d2d2", "opacity": "0.40"}
            }).html(data);
        });
    });