jquery-1.5.2.min.js でアプリケーションを実行しています。IE9、8、7、FF、および Chrome で正常に動作します。
しかし、この問題があります。非表示フィールドの動作を制御する jQuery を使用して、カスタム .js ファイルに JavaScript 関数があります。ボタンがクリックされるたびに、隠しフィールドが 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() とハードコードされた別の変数で埋められます。