Спасибо, ребята, за все ваши предложения, Дарин, хотя ваше решение работает отлично, я хотел попробовать и использовать встроенные утилиты Ajax.
Я нашел обходной путь после просмотра Jquery.Ajax () Docs , а также проверка «jquery.unobtrusive-ajax.js» - это скорее взлом, чем правильное использование, я не уверен, кто соединил файл «jquery.unobtrusive-ajax.js», но если кто-нибудь знаеткак отправить их по электронной почте, возможно, отправьте им ссылку на эту страницу: -)
это интересная часть "jquery.unobtrusive-ajax.js" в этой функции "функции asyncRequest (element, options)"
$.extend(options, {
type: element.getAttribute("data-ajax-method") || undefined,
url: element.getAttribute("data-ajax-url") || undefined,
beforeSend: function (xhr) {
var result;
asyncOnBeforeSend(xhr, method);
result = getFunction(element.getAttribute("data-ajax-begin"), ["xhr"]).apply(this, arguments);
if (result !== false) {
loading.show(duration);
}
return result;
},
complete: function () {
loading.hide(duration);
getFunction(element.getAttribute("data-ajax-complete"), ["xhr", "status"]).apply(this, arguments);
},
success: function (data, status, xhr) {
asyncOnSuccess(element, data, xhr.getResponseHeader("Content-Type") || "text/html");
getFunction(element.getAttribute("data-ajax-success"), ["data", "status", "xhr"]).apply(this, arguments);
},
error: getFunction(element.getAttribute("data-ajax-failure"), ["xhr", "status", "error"])
});
Когда этот код вызывает метод apply на каждом шаге beforeSend, Complete, error, он передается в двух циклах: "this" и "arguments" ...
который создает, но в контексте "это" - это XHR (XMLHttpRequest), а не элемент, по которому щелкнули ... также, проверив заголовки функций, вы можете увидеть, что он передает объект XHR в качестве первой группы.Так почему же нам нужно, чтобы он был контекстом вызова?
Мое решение ... измените файлы "jquery.unobtrusive-ajax.js" и "jquery.unobtrusive-ajax-min.js"...
вместо того, чтобы передавать «this» (XHR) в методе apply, давайте вместо этого отправим реальный элемент!
Таким образом, вся функция теперь выглядит так:
function asyncRequest(element, options) {
var confirm, loading, method, duration;
confirm = element.getAttribute("data-ajax-confirm");
if (confirm && !window.confirm(confirm)) {
return;
}
loading = $(element.getAttribute("data-ajax-loading"));
duration = element.getAttribute("data-ajax-loading-duration") || 0;
$.extend(options, {
type: element.getAttribute("data-ajax-method") || undefined,
url: element.getAttribute("data-ajax-url") || undefined,
beforeSend: function (xhr) {
var result;
asyncOnBeforeSend(xhr, method);
result = getFunction(element.getAttribute("data-ajax-begin"), ["xhr"]).apply(element, arguments);
if (result !== false) {
loading.show(duration);
}
return result;
},
complete: function () {
loading.hide(duration);
getFunction(element.getAttribute("data-ajax-complete"), ["xhr", "status"]).apply(element, arguments);
},
success: function (data, status, xhr) {
asyncOnSuccess(element, data, xhr.getResponseHeader("Content-Type") || "text/html");
getFunction(element.getAttribute("data-ajax-success"), ["data", "status", "xhr"]).apply(element, arguments);
},
error: getFunction(element.getAttribute("data-ajax-failure"), ["xhr", "status", "error"])
});
options.data.push({ name: "X-Requested-With", value: "XMLHttpRequest" });
method = options.type.toUpperCase();
if (!isMethodProxySafe(method)) {
options.type = "POST";
options.data.push({ name: "X-HTTP-Method-Override", value: method });
}
$.ajax(options);
}
Теперь, когда вы создаете свои функции для обработки этих событий, вы можете использовать «this» для получения фактического элемента.
пример:
function BeginUpdatePage(xhr) {
$("#MainMenu li").removeClass('selected');
$(this).parent().addClass('selected');
$("#pageBody").fadeTo('slow', 0.5);
}
function EndUpdatePage(xhr,status) {
$("#pageBody").fadeTo('slow', 1);
}
function FailUpdatePage(data,status,xhr) {
alert('There has been an error loading this page please try again.');
}
Теперь для некоторых людей это будет прощепросто пойти с решением Дарина, просто написать свой собственный Jquery для обработки события click, эй, вы, вероятно, имеете лучший контроль над всем этим,
, но я верю, что встроенный материал должен работать тоже.без необходимости возиться с этим.Поэтому я надеюсь, что либо кто-то может доказать, что я неправ, и на самом деле есть лучший способ сделать это, либо ребята, которые соединили этот сценарий, могли бы его изменить.
разве у них есть веская причина для этого?объяснения приветствуются: -)
Еще раз спасибо всем, у кого были хорошие предложения по этому вопросу. Я надеюсь, что это поможет людям в будущем.