【问题标题】:Why does jQuery.ajax() add a parameter to the url?为什么 jQuery.ajax() 会在 url 中添加参数?
【发布时间】:2010-05-01 10:23:40
【问题描述】:

我有一个使用jQuery.ajax() 来获取xml 文件的数据获取方法。

/*    */data: function() {                                                                                                                                          
                                                                                                                                                                /* debug */try {
        var url = arguments[0] ;                                                                                                                                
        var type = arguments[1] ;                                                                                                                               
        var scope = arguments[2] ;                                                                                                                              
        var callback = arguments[3] ;                                                                                                                           

        var self = this ;                                                                                                                                       
            if(this.cache[url]) {                                                                                                                               
                callback(this.cache[url]) ;                                                                                                                     
            } else if(!this.cache[url]) {                                                                                                                       

                $.ajax({                                                                                                                                        
                    type: "GET" ,                                                                                                                               
                    url: url ,                                                                                                                                  
                    dataType: type ,                                                                                                                            
                    cache: false ,                                                                                                                              
                    success: function(data) {                                                                                                                   

                            if(type == "text/xml") {                                                                                                                                                                                                                                                                                
                                var myJson = AUX.json ;                                                                                                         
                                var jsonString = myJson.build(data,scope,null) ;                                                                                
                                var jsonObject = $.parseJSON(jsonString) ;                                                                                      
                                self.cache[url] = jsonObject ;                                                                                                  
                                callback(url) ;                                                                                                                 

                            } else if(type == "json") {                                                                                                         

                                self.cache[url] = data ;                                                                                                        
                                callback(url) ;                                                                                                                 

                            }                                                                                                                                   

                    } ,                                                                                                                                         
                    error: function() {                                                                                                                         
                        throw "Ajax call failed." ;                                                                                                             
                    }                                                                                                                                           
                }) ;                                                                                                                                            

            }                                                                                                                                                   
                                                                                                                                                                /* debug */} catch(e) {
                                                                                                                                                                /* debug */     alert("- caller: signTutor.data\n- " + e) ;
                                                                                                                                                                /* debug */}
    } ,                                                                                                                                                         

我的问题是:如果文件名中有 ASCII 范围之外的转义(十六进制表示法)或未转义的 utf-8 字符(我相信),jQuery 会以某种方式向 url 添加一个参数 (?_=1272708280072)。如果文件名不包含该范围内的字符,则一切正常。

类型设置为xml,因此不应混淆类型。 xml 文件的标头也设置得当。

我可以从控制台看到 jQuery 抛出一个错误,但我不确定问题到底出在哪里。

可能是文件名格式的问题,但我在网上没有找到任何关于 AJAX 文件名规范的资源。有什么想法吗?

感谢您的帮助!

【问题讨论】:

    标签: javascript jquery ajax parameters


    【解决方案1】:

    这是一个“缓存破坏者”并被忽略。

    添加的参数更改了 url,足以绕过您和源之间的大多数缓存。

    如果 URL 没有被修改,很可能会从您和资源之间的任何一个缓存中提供数据,包括您的浏览器、任何代理,也可能是服务器本身。

    你可以在网上找到很多解释。这里是one

    【讨论】:

    • 好的,太好了。不过,这似乎不是问题。我的 ajax 调用返回 404 - 如果文件名中有 utf-8 字符,则找不到文件。有什么想法吗?
    • @FK82- 尽管有一些新兴技术可以处理 UTF url,但 http 传统上是 ASCII,因此您需要对任何可能包含 UTF 字符的 url 进行 UrlEncode。顺便提一句。 '?_=1272708280072' 是 ascii,所以这不是问题。
    • 文件名中的 utf-8 已被准备文件的 java servlet 转义。所以它已经用十六进制编码,比如%20%20%20(只是一个例子)。因此格式类似于filename_%20%20%20.xml。问题似乎出在 Tomcat 上,因为它将% 字符替换为对应的十六进制代码%25。所以,我需要一个编码特殊字符的解决方案,它不会被 Tomcat 解析。我应该能够自己弄清楚。感谢您的帮助!
    【解决方案2】:

    它应该被忽略。

    只是为了做一个测试,如果你使用的是rails,不要使用javascript_include_tag,而是将JavaScript传递为

    <script src="/path/for/the/script/script.js" type="text/javascript"></script> 
    

    它不会启用缓存破坏器,因此您可以查看问题是否出在您认为的位置。

    【讨论】:

    • 缓存破坏者可能是 jQuery 的,因为它设置了 cache: false 标志。问题似乎是另一个问题。如果你喜欢,看看上面的评论。
    猜你喜欢
    • 2012-03-28
    • 1970-01-01
    • 2013-02-26
    • 1970-01-01
    • 2017-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多