【问题标题】:override jQuery.ajax from other folder/domain - issue with relative url从其他文件夹/域覆盖 jQuery.ajax - 相对 url 的问题
【发布时间】:2019-01-16 15:40:45
【问题描述】:

我们正在从多个位置和域加载脚本,其中之一是具有 jQuery.ajax 函数定义。
对 jQuery.ajax 的调用是从具有相对 URL 的不同位置和域完成的,例如 - jQuery.ajax("my/relative/url")。
这通常会向相对于调用者所在位置的 url 执行请求。
我的要求是捕获以“/my/specific”开头的特定网址并重写它们,但对于所有其他人 - 继续原样。
我所做的是在我的代码中覆盖 jQuery.ajax,检查 url,并使用原始 ajax 调用调用 apply:

            jQuery.ajax = function (url) {
                if (url) {
                    if (typeof url === "string") {
                        if (url.startsWith('/my/specific/url')) {
                            arguments[0] = url.replace('/my/specific/url', '/my/changed/url');
                        }
                        else {
                            arguments[0] = url;
                        }
                    }
                    else {
                        if (url.url.startsWith('/my/specific/url')) {
                            url.url = url.url.replace('/my/specific/url', '/my/changed/url');
                        }
                    }
                }
                return _fnAjaxOrig.apply(this, arguments);
            };

relative url 被调用时,请求是相对于我的代码而不是调用者代码来的。
有什么解决办法吗?
我无法访问 jquery.ajax 的调用者,也无法访问它的定义。

【问题讨论】:

    标签: javascript jquery ajax overriding relative-path


    【解决方案1】:

    使用$.ajaxSetup()beforeSend 回调

    输入:Function( jqXHR jqXHR, PlainObject settings )

    一个可用于修改jqXHR的预请求回调函数 (在 jQuery 1.4.x 中,XMLHTTPRequest)对象在发送之前。用这个 设置自定义标头等。传递 jqXHR 和设置对象 作为论据。这是一个 Ajax 事件。在beforeSend 中返回false 函数将取消请求。

    $.ajaxSetup({
      beforeSend: function(jqXhr, options) {
        if (options.url.startsWith("/your/url")) {
          options.url = "/another/url";
        }
      }
    });
    

    注意:此处指定的设置将影响所有对$.ajax 或 基于 Ajax 的衍生产品,例如 $.get()。这可能会导致不受欢迎的 行为,因为其他调用者(例如,插件)可能期待 正常的默认设置。出于这个原因,我们强烈推荐 反对使用此 API。相反,在 调用或定义一个简单的插件来做到这一点。

    【讨论】:

    • 试过了 - 但这有相同的结果。对于特定的重写我的网址,它可以工作,但对于其他网址,不匹配我的相对 - 它将相对于我的 javascript 文件而不是原始 javascript 文件
    • 考虑以下情况:js 加载自:/folder/util.js 包含:overrideAjaxCall() 现在另一个 js 从 /otherfolder/component.js 加载调用:jQuery.ajax ('relative/url/1.js') 这将转到 url "/folder/relative/url/1.js" 而不是 "/otherfolder/relative/url/1.js"跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-24
    • 1970-01-01
    • 1970-01-01
    • 2020-01-16
    • 2022-01-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多