感谢大家提出的所有建议,Darin,尽管您的解决方案运行良好,但我想尝试使用内置的 Ajax 实用程序。
在查看Jquery.Ajax() Docs并检查“jquery.unobtrusive-ajax.js”后,我找到了一个解决方法,这更像是一个 Hack,而不是正确使用,我不确定是谁放置了“jquery.unobtrusive-ajax.js”。 js" 文件在一起,但如果有人知道如何通过电子邮件发送给他们,也许可以给他们发送一个指向此页面的链接 :-)
这是函数“function asyncRequest(element, options)”中“jquery.unobtrusive-ajax.js”的有趣部分
$.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"])
});
当此代码在每个步骤 beforeSend、Complete、error 中调用apply方法时,它会传入两个参数,“this”和“arguments”...
Wich 作品创建,但在上下文中,“this”是 XHR(XMLHttpRequest)而不是被点击的元素......同样通过检查函数头,您可以看到它将 XHR 对象作为第一个 peram 传递。那么为什么我们也需要它作为调用上下文呢?
我的解决方案...更改“jquery.unobtrusive-ajax.js”和“jquery.unobtrusive-ajax-min.js”文件...
与其在 apply 方法上传递“this”(XHR),不如发送实际的元素!
所以整个函数现在看起来像这样:
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.');
}
现在对于某些人来说,使用 Darin 的解决方案会更容易,只需编写自己的 Jquery 来处理点击事件,嘿,你可能对这一切有更好的控制,
但我相信内置的东西也应该起作用。而不必弄乱它。所以我希望有人能证明我错了,实际上有更好的方法来做到这一点,或者把这个脚本放在一起的人可以改变它。
除非他们有充分的理由这样做?欢迎解释:-)
再次感谢所有对这个问题提出好的建议的人,我希望这对未来的人们有所帮助。