Javascript URL在jQuery中为AJAX请求编码字符串

Javascript URL在jQuery中为AJAX请求编码字符串,javascript,jquery,ajax,http,Javascript,Jquery,Ajax,Http,我正在我的应用程序中实现谷歌的即时搜索。我想在用户输入文本时触发HTTP请求。我唯一的问题是当用户到达第一个和最后一个名称之间的空间时,空间没有被编码为+,从而破坏搜索。如何用+替换空格,或者只安全地对字符串进行URL编码 $("#search").keypress(function(){ var query = "{% url accounts.views.instasearch %}?q=" + $('#tags').val(); var options =

我正在我的应用程序中实现谷歌的即时搜索。我想在用户输入文本时触发HTTP请求。我唯一的问题是当用户到达第一个和最后一个名称之间的空间时,空间没有被编码为
+
,从而破坏搜索。如何用
+
替换空格,或者只安全地对字符串进行URL编码

$("#search").keypress(function(){       
    var query = "{% url accounts.views.instasearch  %}?q=" + $('#tags').val();
    var options = {};
    $("#results").html(ajax_load).load(query);
});
试试这个

var query = "{% url accounts.views.instasearch  %}?q=" + $('#tags').val().replace(/ /g, '+');
试试看

通过将特定字符的每个实例替换为表示字符UTF-8编码的一个、两个、三个或四个转义序列(对于由两个“代理”字符组成的字符,将仅为四个转义序列),对统一资源标识符(URI)组件进行编码

例如:

var encoded = encodeURIComponent(str);
更好的方法:


encodeURIComponent转义除以下字符外的所有字符:
字母、十进制数字,-.!~*'()

为了避免对服务器的意外请求,您应该对任何用户输入的参数调用encodeURIComponent,这些参数将作为URI的一部分传递。例如,用户可以为变量注释键入“Thyme&time=reach”。不在此变量上使用encodeURIComponent将再次给出comment=Thyme%20&time=。请注意,符号和等号标记了一个新的键和值对。因此,您没有使用等于“Thyme&time=reach”的POST-comment键,而是使用两个POST键,一个等于“Thyme”,另一个(time)等于reach

对于application/x-www-form-urlencoded(POST),根据,空格将替换为“+”,因此您可能希望按照encodeURIComponent替换,将“%20”替换为“+”

如果希望更严格地遵守RFC 3986(保留!、'、(、)和*),即使这些字符没有正式的URI定界用途,也可以安全地使用以下字符:

function fixedEncodeURIComponent (str) {
  return encodeURIComponent(str).replace(/[!'()]/g, escape).replace(/\*/g, "%2A");
}

我使用MVC3/EntityFramework作为后端,前端通过jquery使用我的所有项目控制器,当您直接传递URL硬编码以外的参数时,直接过帐(使用$.post)不需要数据加密。 我已经测试了几个字符,我甚至发送了一个URL(这一个)作为参数,没有任何问题,即使encodeURIComponent在URL中传递所有数据(硬编码)时工作得很好

硬编码URL,即>

 var encodedName = encodeURIComponent(name);
 var url = "ControllerName/ActionName/" + encodedName + "/" + keyword + "/" + description + "/" + linkUrl + "/" + includeMetrics + "/" + typeTask + "/" + project + "/" + userCreated + "/" + userModified + "/" + status + "/" + parent;; // + name + "/" + keyword + "/" + description + "/" + linkUrl + "/" + includeMetrics + "/" + typeTask + "/" + project + "/" + userCreated + "/" + userModified + "/" + status + "/" + parent;
否则不要使用encodeURIComponent,而是尝试在ajax post方法中传递参数

 var url = "ControllerName/ActionName/";   
 $.post(url,
        { name: nameVal, fkKeyword: keyword, description: descriptionVal, linkUrl: linkUrlVal, includeMetrics: includeMetricsVal, FKTypeTask: typeTask, FKProject: project, FKUserCreated: userCreated, FKUserModified: userModified, FKStatus: status, FKParent: parent },
 function (data) {.......});

编码器组件对我来说很好。我们可以在ajax调用中给出如下url。代码如下所示:

  $.ajax({
    cache: false,
    type: "POST",
    url: "http://atandra.mivamerchantdev.com//mm5/json.mvc?Store_Code=ATA&Function=Module&Module_Code=thub_connector&Module_Function=THUB_Request",
    data: "strChannelName=" + $('#txtupdstorename').val() + "&ServiceUrl=" + encodeURIComponent($('#txtupdserviceurl').val()),
    dataType: "HTML",
    success: function (data) {
    },
    error: function (xhr, ajaxOptions, thrownError) {
    }
  });

安德斯·菲尔德斯塔德的解决方案要好得多。用加号替换空格可能行得通,但如果你有其他字符(如umlauts等),你会遇到一大堆麻烦。@Uku:OP想用+替换空格,所以我给了他答案。我认为@Uku是对的。虽然这确实回答了字面上的问题(而且确实有效),但我认为@Anders的解决方案在更大的范围内更好。这在当时可能是一个更好的解决方案:)
For application/x-www-form-urlencoded(POST),perhttp://www.w3.org/TR/html401/interac...m-content-type,空格将替换为“+”,因此,您可能希望在encodeURIComponent替换之后,再将“%20”替换为“+”
如何执行此操作?但为了使其有用,需要一个等效的URL解码。这解决了我的问题-当我将URL作为参数传递到AJAX请求时,URL中的任何查询字符串都将丢失(&F)之后的所有内容。当我加上这个,这就解决了我的问题。谢谢你可以用。