web-dev-qa-db-ja.com

URL AJAXリクエストのjQueryで文字列をエンコードします

私は自分のアプリケーションにGoogleのクイック検索を実装しています。ユーザーがテキスト入力を入力したときに、HTTP要求を無効にします。私が抱えている唯一の問題は、ユーザーが姓と名の間のスペースに入ると、そのスペースが+としてエンコードされないため、検索が中断されることです。どうやってスペースを+に置き換えることができますか、それとも単に安全にURLエンコードすることができますか?

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

encodeURIComponent を試してください。

特定の文字の各インスタンスを、文字のUTF-8エンコーディングを表す1、2、3、または4つのエスケープシーケンスで置き換えることによって、URI(Uniform Resource Identifier)コンポーネントをエンコードします(2つの "サロゲート"で構成される文字の場合は4つのエスケープシーケンスのみ"文字)。

例:

var encoded = encodeURIComponent(str);
468

encodeURIComponentは私にはうまく働きます。このようなURLをajax呼び出しで与えることができます。以下に示すコード:

  $.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) {
    }
  });
21
Praveen04

もっと良い方法:

encodeURIComponentは、以下を除くすべての文字をエスケープします。alphabetic, decimal digits, - _ . ! ~ * ' ( )

サーバーへの予期しない要求を避けるために、URIの一部として渡されるユーザー入力パラメーターに対してencodeURIComponentを呼び出す必要があります。たとえば、ユーザーは変数commentに "Thyme&time = again"と入力することができます。この変数でencodeURIComponentを使用しないと、comment = Thyme%20&time =が返されます。アンパサンドと等号は新しいキーと値のペアを示すことに注意してください。したがって、POSTコメントキーを "Thyme&time = again"にする代わりに、2つのPOSTキーを使用し、一方を "Thyme"に、もう一方(time)をもう一度にします。

Application/x-www-form-urlencode(POST)の場合は、 http://www.w3.org/TR/html401/interac...m- content-type 、スペースは '+'に置き換えられるため、encodeURIComponentの置き換えに続けて "%20"を "+"に置き換えることをお勧めします。

RFC 3986(!、 '、(、)、および*を予約しています)を順守することをより厳密にしたい場合は、これらの文字に正式なURI区切りの用途がなくても、次のものを安全に使用できます。

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

私はバックエンドとしてMVC3/EntityFrameworkを使用しています。フロントエンドはjqueryを介して私のすべてのプロジェクトコントローラを消費します。直接投稿する($ .postを使って)私はすでにいくつかの文字をテストしました。私もURLを送信しました(これは http://www.ihackforfun.eu/index.php?title=update-on-url-crazy&more=1&c=1&tb=1&pb=1パラメータとして )を使用し、URL内にすべてのデータを渡す場合にencodeURIComponentはうまく機能しますが、まったく問題ありませんでした(ハードコード)。

ハードコードされた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メソッド内でparamsを渡してみてください。

 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) {.......});
4
d1jhoni1b

これを試してください

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