Ответ 1
Спасибо, ребята, за все ваши предложения, Дарин, хотя ваше решение работает отлично, я хотел попробовать использовать встроенные утилиты Ajax.
Я нашел работу после просмотра Jquery.Ajax() Docs, а также проверки "jquery.unobtrusive-ajax.js" this это скорее хак, чем правильное использование, я не уверен, кто ставит файл jquery.unobtrusive-ajax.js вместе, но если кто-нибудь знает, как отправить их по электронной почте, возможно, отправьте им ссылку на эту страницу: -)
это интересная часть "jquery.unobtrusive-ajax.js" в этой функции "функция asyncRequest (элемент, параметры)"
$.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, он проходит в двух perams, "this" и "аргументы"...
Работает создание, но в контексте "this" находится XHR (XMLHttpRequest), а не тот элемент, который был нажат... также путем проверки заголовков функций вы можете видеть, что он передает объект XHR в качестве первого peram. Так зачем же нам это быть вызывающим контекстом?
Мое решение... измените файлы 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, потому что вы, вероятно, лучше контролируете все это,
но я верю, что встроенный материал тоже должен работать. без необходимости возиться с ним. Поэтому я надеюсь, что кто-то может доказать, что я ошибаюсь, и на самом деле это лучший способ сделать это, или ребята, которые помещают этот script вместе, могут его изменить.
если у них нет веских оснований для этого? объяснения приветствуются: -)
Спасибо всем, у кого были хорошие предложения по этому вопросу Надеюсь, это поможет людям в будущем.