triggerElement
関数内で Ajax リクエストを呼び出したへの参照を取得することはできonSuccess
ますか?
<%=Ajax.ActionLink("x", a, r, New AjaxOptions With {.OnSuccess = _
"function(context) {alert('get triggerElement reference here?');}" })%>
triggerElement
関数内で Ajax リクエストを呼び出したへの参照を取得することはできonSuccess
ますか?
<%=Ajax.ActionLink("x", a, r, New AjaxOptions With {.OnSuccess = _
"function(context) {alert('get triggerElement reference here?');}" })%>
ページは次のようにレンダリングされます:
<a href="/<whatever>/<action>" onclick=" Sys.Mvc.AsyncHyperlink.handleClick(this、new Sys.UI.DomEvent(event)、{insertionMode:Sys.Mvc。 InsertionMode.replace、onSuccess:Function.createDelegate(this、function(context){alert('get triggerElement reference here?');})}); "> x </a>
Sys.Mvc.AsyncHyperlink.handleClick
それでは、内部を見てみましょうScripts\MicrosoftMvcAjax.debug.js
:
Sys.Mvc.AsyncHyperlink.handleClick = function Sys_Mvc_AsyncHyperlink$handleClick(anchor, evt, ajaxOptions) {
/// omitted doc comments
evt.preventDefault();
Sys.Mvc.MvcHelpers._asyncRequest(anchor.href, 'post', '', anchor, ajaxOptions);
}
したがって、ActionLinkはアンカー( "a")タグにレンダリングされ、 "onclick"イベントが発生します。このイベントは、これをパラメーターの1つとして使用しSys.Mvc.AsyncHyperlink.handleClick
、anchorにマップされます。
次に、4番目のパラメーターとしてanchorを使用したこの呼び出しがあります。見てみましょう:Sys.Mvc.MvcHelpers._asyncRequest
Sys.Mvc.MvcHelpers._asyncRequest
Sys.Mvc.MvcHelpers._asyncRequest = function Sys_Mvc_MvcHelpers$_asyncRequest(url, verb, body, triggerElement, ajaxOptions) {
/// omitted documentation
if (ajaxOptions.confirm) {
if (!confirm(ajaxOptions.confirm)) {
return;
}
}
if (ajaxOptions.url) {
url = ajaxOptions.url;
}
if (ajaxOptions.httpMethod) {
verb = ajaxOptions.httpMethod;
}
if (body.length > 0 && !body.endsWith('&')) {
body += '&';
}
body += 'X-Requested-With=XMLHttpRequest';
var requestBody = '';
if (verb.toUpperCase() === 'GET' || verb.toUpperCase() === 'DELETE') {
if (url.indexOf('?') > -1) {
if (!url.endsWith('&')) {
url += '&';
}
url += body;
}
else {
url += '?';
url += body;
}
}
else {
requestBody = body;
}
var request = new Sys.Net.WebRequest();
request.set_url(url);
request.set_httpVerb(verb);
request.set_body(requestBody);
if (verb.toUpperCase() === 'PUT') {
request.get_headers()['Content-Type'] = 'application/x-www-form-urlencoded;';
}
request.get_headers()['X-Requested-With'] = 'XMLHttpRequest';
var updateElement = null;
if (ajaxOptions.updateTargetId) {
updateElement = $get(ajaxOptions.updateTargetId);
}
var loadingElement = null;
if (ajaxOptions.loadingElementId) {
loadingElement = $get(ajaxOptions.loadingElementId);
}
var ajaxContext = new Sys.Mvc.AjaxContext(request, updateElement, loadingElement, ajaxOptions.insertionMode);
var continueRequest = true;
if (ajaxOptions.onBegin) {
continueRequest = ajaxOptions.onBegin(ajaxContext) !== false;
}
if (loadingElement) {
Sys.UI.DomElement.setVisible(ajaxContext.get_loadingElement(), true);
}
if (continueRequest) {
request.add_completed(Function.createDelegate(null, function(executor) {
Sys.Mvc.MvcHelpers._onComplete(request, ajaxOptions, ajaxContext);
}));
request.invoke();
}
}
したがって、元のアンカーはtriggerElementになりますが、ご覧のとおり、このパラメーターが関数の本体で使用されることはありません。
したがって、triggerElementへのある種の「正式な」(または文書化された)参照が必要な場合は、そのようなことはありません。
しかしねえ、それはJavaScriptなので、ブラウザが別のページに移動しない限り、呼び出しスタックを含め、ほとんどすべてにアクセスできます。例えば:
<script type="text/javascript">
function a(p, q)
{
b();
}
function b() {
var x = arguments.caller[1];
alert(x); // boo!
}
a(789, "boo!");
</script>
したがって、最終的にはそれをハックして元のアンカーにアクセスできます。次のことをお勧めします。
OnBegin
。triggerElement
それをプロパティとしてオリジナルに追加します
ajaxOptions
(これもアクセスできます)OnSuccess
関数で、のハッキングされたプロパティにアクセスします
ajaxOptions
。