jQuery异常,可能与自动填充字段的AJAX相关

时间:2012-08-23 15:50:03

标签: javascript jquery ajax jquery-ui internet-explorer

我有一个运行jquery-1.5.2.min.js的应用程序。它在IE9,8,7,FF和Chrome中运行良好。

但是有这个问题。我在自定义.js文件中使用jQuery来管理隐藏字段的行为。只要单击一个按钮,隐藏字段就会变成jQuery自动完成控件,并通过Ajax调用加载自动完成信息。功能是这样的:

$.ajax({
        type: "POST",
        url: action,
        dataType: "json",
        data: "{type: '" + control + "', param:" + params + "}",
        contentType: "application/json; charset=utf-8",
        success: function (data) {
            var dataTable = data;
            $(selector).autocomplete({
                minLength: 2,
                source: dataTable,
                open: function (e, ui) {
                    var options = $(this).data('autocomplete');

                    options.menu.element.find('a').each(function () {
                        var this_ = $(this);
                        var regex = new RegExp(options.term, "gi");
                        this_.html(this_.text().replace(regex, function (matched) {
                            return autocompleteTemplate.replace('%s', matched);
                        }));
                    });
                },
                focus: function (event, ui) {
                    $(selector).val(ui.item.label);
                    return false;
                },
                change: function (event, ui) {
                    if (!ui.item) {
                        var options = $(this).data('autocomplete');
                        var matcher = new RegExp("^" + $.ui.autocomplete.escapeRegex($(this).val()) + "$", "i"),
                            valid = false;
                        options.menu.element.find('a').each(function () {
                            if ($(this).text().match(matcher)) {
                                valid = true;
                                return false;
                            }
                        });
                        if (!valid) {
                            if (control == "ProjectType") {
                                $('#selector').val("...");
                                $('#selector').attr('disabled', 'disabled');
                                $('#another.selector').val("");
                            }
                            // Remueve los valores inválidos.
                            $(this).val("");
                            $(selector).val("");
                            $(selector).data("autocomplete").term = "";
                            return false;
                        }
                    }

                    if (control == "ProjectType") {
                        $('#selector').val("");
                    }
                },
                select: function (event, ui) {
                    $(selector).val(ui.item.label);

                    $(hidden).val(ui.item.value);

                    if (control == "ProjectType") {
                        Autocomplete("ProjectSubType", action, ui.item.value);
                        // This is a function that changes the CSS for another HTML control
                        ProjectSubType(false);
                    }
                    return false;
                }
            });
        }
    });

因此,每当我将浏览器类型从IE8更改为IE7或IE9,或从IE7更改为IE8或IE9时,激活此字段后,将从jquery-1.5.2.min.js抛出以下异常

  

Microsoft JScript的运行时错误:无法获取属性值   'type':对象为null或未定义

供参考:

  • AJAX调用工作。自动完成功能正常工作,并按照必须触发的顺序触发完成时必须触发的事件。
  • 还有另一个控件触发另一个AJAX事件(填充jqGrid),这不会产生任何错误。
  • 您在代码中看到的条件子句“if(control ==”ProjectType“)”,如果使用此控件并填充了自动填充选项,则允许其他控件变为自动填充。否则,正如您所见,它被禁用(我将其名称更改为'#selector')。这也可以正常工作:如果您在自动填充中填写一个值,则另一个控件将填充所需的选项。

由于

UDP

调用AJAX函数的函数如下:

function SetSearchMenu(url, local) {
    $('#advancedSearch').hide();
    $('#advSearch').click(function () {
        if ($('#advancedSearch').css("display") == "none") {
            $('#advancedSearch').show();
            $('#generalSearch').val("...");
            $('#generalSearch').attr('disabled', 'disabled');
            ProjectSubType(true);
        }
        else {
            $('#dAdvancedSearch').hide();
            $('#General').val("");
            $('#General').removeAttr('disabled');
        }

        if (alreadyOpen == false) {
            Autocomplete("SelectorOne", url, null);
            Autocomplete("ProjectType", url, null);
            Autocomplete("Selector", url, local);
            alreadyOpen = true;
        }
    });
}

参数url和local从$(document).ready()函数发送,并以字符串格式填充@ Url.Action(),另一个变量硬编码为一个。

0 个答案:

没有答案