【问题标题】:Append something always to an XHR Request始终将某些内容附加到 XHR 请求
【发布时间】:2013-11-21 20:14:40
【问题描述】:

我想将一个 JS 变量附加到将从我的单页 Web 应用程序发出的每个 XHR 请求中。

实现这一目标的最佳方法是什么?我不想使用此属性建立特殊的发送方法,因为可能有第三方与我的应用程序集成。

我考虑过覆盖 XHR 对象的发送方法,但这也不是好的风格。 由于请求是跨域的,我无法使用 cookie。

对此有更好的想法或方法吗?

谢谢! -亚历山德罗

【问题讨论】:

  • “因为可能有第三方与我的应用程序集成。” 你不能“强迫”他们使用你的 Ajax 调用包装器吗?创建自己的一组函数将是 IMO 最简单的方法。
  • 我可能会为此使用代理模式。 en.wikipedia.org/wiki/Proxy_pattern
  • 不,不幸的是我不能强迫他们,因为他们可能会使用自己的 XHR 包装器,然后丢失我的“注入”数据。
  • @user2389688 代理模式真的与原型设计有很大不同吗?无论如何,您都依赖于浏览器 API 和实现,不是吗?

标签: javascript xmlhttprequest


【解决方案1】:

如果你真的想在不添加任何类库函数的情况下扩展现有功能,你可以使用猴子补丁来解决这个问题:

(function() {
    var originalOpen = XMLHttpRequest.prototype.open;
    XMLHttpRequest.prototype.open = function(method, url, async, user, password) {
        var getParameter = 'foo=bar';

        if(url.indexOf('?') === -1) {
           url = url + '?' + getParameter;
        } else {
           url = url + '&' + getParameter;
        }

        console.log('you just got monkey-patched! url is now:', url);

        originalOpen.call(this, method, url, async, user, password);
    }
})();

var request = new XMLHttpRequest();
request.open('get', 'http://google.com');

另见this jsfiddle for a working example

如果您修补 send() 函数,则可以在将内容注入请求正文时使用相同的技术。 如果这样做,请确保注意要传输的数据类型(请参阅MDN)。将参数附加到二进制主体是没有意义的;)

【讨论】:

  • 这不是代理模式吗?
  • 猴子补丁实际上是一个代理,你是对的。但在这种情况下,我会谈论猴子补丁而不是完全成熟的代理。
  • 在询问之前我正在查找这个,它非常相似.. stackoverflow.com/questions/7379732/… 代理模式和 Javascript 中的原型设计之间真的有任何有效的区别吗?
  • 这不仅仅是关于 javascript 中的原型。您可以修改现有代码,无论它位于对象原型中还是其他地方。当您想要创建内存和 cpu 高效的对象层次结构时,原型就会出现。 developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/…
  • 我的意思是,可能有点糟糕的是,覆盖对象原型会产生与代理类似的效果。同意?唯一的区别是我在您的示例中人为地引用了“var originalOpen”的旧实现。
猜你喜欢
  • 2010-09-25
  • 2019-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-06
相关资源
最近更新 更多