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