繁体   English   中英

在 onSuccess 函数中获取对“triggerElement”的引用?

[英]Get reference to 'triggerElement' in onSuccess function?

是否可以在onSuccess函数中获取对调用 Ajax 请求的triggerElement引用?

<%=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), { insertMode: Sys.Mvc.InsertionMode.replace, onSuccess: Function.createDelegate(this, function(context) { alert('get triggerElement reference here?'); }) });">x</a>

所以让我们看看Scripts\\MicrosoftMvcAjax.debug.js中的Sys.Mvc.AsyncHyperlink.handleClick

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”事件,它使用Sys.Mvc.AsyncHyperlink.handleClickthis作为参数之一,映射到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调用的OnBegin
  • 在这个函数中,访问原始的triggerElement ,并将其作为属性添加到原始的ajaxOptions (也可以访问)
  • 然后,在OnSuccess函数中,访问您的ajaxOptions被黑属性。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM