0

があり、<input type="text">その値を「q」クエリ文字列に安全に設定したいと思います。クエリ文字列に特殊文字が含まれている(+,#,...)と、JS の実行が停止するためです。

encodeURIComponent()とを試してみencodeURI()ましたが、検索ボックスの値もエスケープされるため、検索ボックスに奇妙なものが表示されます。

私も試しdecodeURIComponent(encodeURIComponent())ましたが、これによりJSの実行が停止します。

また、PHP は私が使いたいソリューションではないので、PHP GET が機能しても忘れましょう。

バグを試してみてください: http://smartsearch.altervista.org/?q=the+plus+character+breaks+the+code

ご覧のとおり、パネルは機能しなくなりました (ツールバーのボタンをクリックすると、パネルが表示されます)。特殊文字を含むクエリ文字列がない場合、パネルは完全に機能します。

完全なコード(一部の人が要求したため):

$(function() {
if(getParameter("q") && getParameter("engine")) {
        search(getParameter("q").replace("smartsearch://",""),getParameter("engine"));
    }
    else if(getParameter("engine")) {
        $(".search-engine a[data-engine-shortname="+getParameter("engine")+"]").click();
    }
    else if(getParameter("q")) {
        search(getParameter("q").replace("smartsearch://",""));
    }
    });
// Helper functions
function getParameter(name) {
    name = name.replace(/[\[]/, "\\\[").replace(/[\]]/, "\\\]");
    var regex = new RegExp("[\\?&]" + name + "=([^&#]*)"),
        results = regex.exec(location.search);
    return results == null ? "" : decodeURIComponent(results[1].replace(/\+/g, " "));
}
function search(query,engine) {
    var searchengine = engine || $(".search-engine.selected a").attr("data-engine-shortname");
    var searchengineurl = $(".search-engine a[data-engine-shortname="+engine+"]").attr("data-engine-url") || $("#search-form").attr("action");
    var searchquery = query || $("#search-input").val();
    var currenturl = "?q=" + searchquery.split(' ').join('+') + "&engine=" + searchengine;
    var icon = $(".search-engine a[data-engine-shortname="+engine+"] img").attr("src") || $(".search-engine.selected a img").attr("src");
    if($.trim(searchquery) != "") {
        $("#results-frame").attr("src",searchengineurl + searchquery);
        $("title").html(searchquery + " - SmartSearch");
        history.replaceState(null, null, currenturl);
        if(engine) {
            $(".search-engine a[data-engine-shortname="+engine+"]").click();
        }
        $("#search-input").val(searchquery);
        $("#favourite-button").removeClass("starred disabled");
        if(bookmarks.check(searchquery,searchengine)) {
            $("#favourite-button").addClass("starred");
        }
    }
    else {
        $("title").html("SmartSearch");
        $("#favourite-button").addClass("disabled");
        $("#favourite-button").removeClass("starred");
        if(bookmarks.check(searchquery,searchengine)) {
            $("#favourite-button").addClass("starred");
        }
    }
}
4

1 に答える 1

0

https://www.rfc-editor.org/rfc/rfc3986#section-2.2のセクションを参照すると

 reserved    = gen-delims / sub-delims

 gen-delims  = ":" / "/" / "?" / "#" / "[" / "]" / "@"

 sub-delims  = "!" / "$" / "&" / "'" / "(" / ")"
             / "*" / "+" / "," / ";" / "="

RFCは続けて言います

URI コンポーネントのデータが区切り文字としての予約文字の目的と競合する場合、URI を形成する前に、競合するデータをパーセントでエンコードする必要があります。

于 2013-11-05T19:16:08.517 に答える