1

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

但是有这个问题。我在自定义 .js 文件中有一个 JavaScript 函数,它使用 jQuery 来规则隐藏字段的行为。每当单击按钮时,隐藏字段都会变成一个 jQuery Autocomplete 控件,并通过 Ajax 调用加载 Autocomplete 信息。函数是这样的:

$.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 的运行时错误:无法获取属性“类型”的值:对象为空或未定义

供参考:

  • 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() 和硬编码为一个的另一个变量填充。

4

0 回答 0