1

有没有办法在window.open调用中指定 HTTP 方法(POST、DELETE、PUT)?

我知道我可以进行 Ajax 调用,并且允许指定 HTTP 方法,但在这种情况下,我希望浏览器“真正地”进行调用(跟踪所有重定向、正确加载响应等)。

4

1 回答 1

0

我最终使用隐藏表单来包装 HTTP 请求。该方法特定于我的后端(Rails),因为它使用隐藏的_method输入来发布伪 PUT 或伪 DELETE 操作。使用 Rails,我还必须添加隐藏的 CSFR 字段。我的原始 HTML 如下:

<button class="btn action-button btn-danger"
  id="delete-object"
  data-action-href="<%= object_path(@object) %>"
  data-action-method="delete"><i class="icon-trash icon-white"></i>Delete</button>

实现它的 CoffeeScript 是:

$("button.action-button").each (index, element) ->               
  $(element).click (eventObject) ->                              
    url = $(this).data("action-href")                            
    httpMethod = $(this).data("action-method")                   
    if httpMethod?                                               
      form = $("<form/>",                                        
        id: "action-method-temp-form"                            
        action: url                                              
        method: "post"                                           
        style: "display: none")                                  
      form.appendTo $(this)                                      
      csfr = $('meta[name="csrf-token"]').attr("content")        
      $("<input/>",                                              
        type: "hidden"                                           
        name: "authenticity_token"                               
        value: "#{csfr}").appendTo form                          
      $("<input/>",                                              
        type: "hidden"                                           
        name: "_method"                                          
        value: httpMethod).appendTo form if httpMethod != "post" 
      form.submit()                                              
    else                                                         
      window.location = url        

我知道这不是我问的,但它做同样的事情。相比之下,Ajax 调用后跟文档内容替换将无法正确处理重定向和非 html 内容类型响应等问题。

于 2013-01-28T11:53:10.680 回答