【问题标题】:How do I set JQuery Autocomplete to POST instead of GET?如何将 JQuery 自动完成设置为 POST 而不是 GET?
【发布时间】:2009-10-03 02:21:53
【问题描述】:

有没有办法将 Jquery 的自动完成 HTTP 提交方法设置为 POST 而不是 GET?

【问题讨论】:

标签: jquery asp.net-mvc


【解决方案1】:

最好将它与源参数一起传递,而不是像这样全局设置它:

$("#input").autocomplete({
    source: function (request, response) {
        $.post("/AjaxPostURL", request, response);
    }
});

【讨论】:

  • 这是一个更完整的 $.post 版本,其中传递了额外的数据: $(function() { var options = { url: "/web/ajax.php?a=query -save-projects&w=app",类型:'post',数据:{ "args":$().crypt({method:"b64enc",source:JSON.stringify(_system) }), "url":document .URL } }; $( "#query-save-project-name" ).autocomplete({ source: function (request, response) { $.post(options["url"], options["data"], response , "json") }, minLength: 2 }); });
  • 如果其中一个请求失败,则会中断。在这种情况下,永远不会调用 response,这会破坏自动完成插件。否则这是正确的方法。
【解决方案2】:

你可以使用

$.ajaxSetup( { type: "post" } );

在调用自动​​完成之前,它将覆盖页面上的 ajax 调用。

【讨论】:

  • 这会修改通过 jQuery 进行的 所有 AJAX 调用。这与页面上运行的其他代码的交互很糟糕。非常危险。
【解决方案3】:

不幸的是,自动完成程序没有选项可以让您设置它。但是,插件代码中有一个地方调用了$.ajax 函数。没有指定 type 选项,这意味着它将默认为 GET 请求。您可以修改 $.ajax 调用(从最新版本的第 361 行开始)以包含 type 选项并将其值设置为“post”:

$.ajax({ //line 361
    type: "post",
    ...

【讨论】:

  • 修改源代码意味着您将无法升级到下一个版本。
  • 另外,文档说type: "POST" 是必需的。可能,两者都在工作,但小写是不好的风格。
【解决方案4】:

编辑源代码是一个非常糟糕的主意,因为您将在下次升级小部件时丢失所做的更改。最好将全局类型设置为“post”或传入请求/响应对象。

【讨论】:

  • 进行全局 POST 设置会修改通过 jQuery 进行的 所有 AJAX 调用。这与页面上运行的其他代码的交互很糟糕。非常危险。
【解决方案5】:

我重写了 JavaScript 文件中的一个函数(在 jQuery UI 之后加载),以使其接受 GET/POST 作为另一种选择。

$.ui.autocomplete.prototype._initSource = function() {
    var array, url,
        that = this;
    if ( $.isArray(this.options.source) ) {
        array = this.options.source;
        this.source = function( request, response ) {
            response( $.ui.autocomplete.filter( array, request.term ) );
        };
    } else if ( typeof this.options.source === "string" ) {
        url = this.options.source;
        /*added*/ var httpMethod = this.options.type ? this.options.type : 'GET';
        this.source = function( request, response ) {
            if ( that.xhr ) {
                that.xhr.abort();
            }
            that.xhr = $.ajax({
                url: url,
                data: request,
                dataType: "json",
                /*added*/ type: httpMethod,
                success: function( data ) {
                    response( data );
                },
                error: function() {
                    response( [] );
                }
            });
        };
    } else {
        this.source = this.options.source;
    }
};

我认为它解决了上面其他人提到的问题而不会破坏其他任何东西:
- 直接编辑 jQuery UI 文件会使升级 jQuery UI 变得很痛苦,并阻止您使用 Google API 来托管您的 jQuery 文件
- $.ajaxSetup 会影响我们产品中的每个自动完成或 ajax 调用
- 编写 $.post 并将其作为函数传递很酷,但如果您在整个网站上使用数十个自动完成功能,则需要大量输入。

【讨论】:

  • 修改源代码意味着您将无法升级到下一个版本。
  • 幸运的是,JavaScript 中的函数是可变的,所以您不必这样做。但是,如果新版本的 jQuery 对其进行了更改,那么对该特定函数的任何更改确实会丢失。这就是为什么您不想在最罕见的情况下使用此策略的原因。
猜你喜欢
  • 2011-02-06
  • 2017-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多