jQuery.autocomplete(1.02) ですべてのキャッシュをバイパスします。
-
09-09-2019 - |
質問
使っています jQuery.autocomplete(1.02) 検索ボックスで私が欲しいのは ちょうど 文字列と部分文字列のマッチング。データベースの負荷については (まだ) 気にしていません。キーストロークごとにクエリを実行し、キャッシュを完全にバイパスできることに満足しています。ただ何も見逃したくないだけです。
この目的のために、私は設定を試みました キャッシュ長=1, 、許可される最小値ですが、オートコンプリート機能は、キーを押すたびに GET リクエストを起動することを拒否します。
searchbox GET_request
'a' -> http://localhost/service_search_request?q=a
'ar' -> http://localhost/service_search_request?q=ar
'ars' -> http://localhost/service_search_request?q=ars
代わりに、1 つ目と 3 つ目は送信され、2 つ目は送信されず、「ar」について間違った結果が得られます :-/ キャッシュとセッションをクリアしましたが、何らかのキャッシュがまだ行われているようです。私の知る限り、プロキシ処理は行われておらず、毎回シフトを更新しています。この動作は jQuery.autocomplete 自体によるものである可能性が高くなります。
そこで私の質問は...
A) これはありそうですか?つまりそれは機能ですか、それともバグですか?
B) もしそうなら、それを回避するきれいな方法はありますか?...
C) そうでない場合、代わりにどのオートコンプリートを使用しますか?
当然 D) いや、間違って使っているだけだよ、クソ野郎! それは常に可能性であり、実際、私がこの道を進むことに時間を費やしたほうが良いと思います - 私が見つけられなかった、または読んでいなかったドキュメントへのリンクが付属していると仮定します。
乾杯、
ロジャー:)
解決
なぜだろう キャッシュの長さ 機能しませんが、オートコンプリートにも問題がありました。私見ですが、そこには間違いがあります。ただし、 オプションのリスト, 、があります。 matchSubset false に設定できます。
編集:335 行目あたりに「request」という関数があります。何が起こるかを確認するために、いくつかのデバッグ メッセージを追加できます。(注記:あなたが必要です 火虫 インストールされているか、「コンソール」は不明です)
function request(term, success, failure) {
console.debug("ac request...");
if (!options.matchCase)
term = term.toLowerCase();
var data = cache.load(term);
console.debug("ac request 1, loaded data from cache: " + data + " term: " + term);
// recieve the cached data
if (data && data.length) {
success(term, data);
// if an AJAX url has been supplied, try loading the data now
} else if( (typeof options.url == "string") && (options.url.length > 0) ){
console.debug("ac request 2, data is not in the cache, request it");
「flushCache」はオプションで付加・設定できる機能で簡単に利用できます。バックエンドにさらにデータがある可能性がある場合に、これを使用してキャッシュをクリアしました。
formatItem: function (data,i,n,value){
if(i === (this.max -1)){
console.debug("flushCache");
jQuery(this).flushCache();
}
return data[1] + " (" + data[0] + ")";
}
他のヒント
私も同じ問題を抱えています。オプションのcacheLengthを1に設定しても、キャッシュが機能しません。
各印刷用語の後に flashCache 関数を呼び出すソリューションでは、機能します。使用できませんでした:
if(i === (this.max -1)){
たとえば、フィルタリング後の「i」は 1 でしたが、元のバックエンド クエリの結果として 25 行が返されたため、「this.max」は依然として 25 でした。
しかし, 、このバグ のみ スウェーデン語の文字「å」、「ä」、または「ö」を含む単語を入力すると、「」が表示されます。そのため、キャッシュは期待どおりに機能するかもしれませんが、これらの特殊文字を使用すると機能しない可能性があります。
ともかく。私にとっての解決策は、常に formatItem() 関数で flashCache コントロールを呼び出すことでした。
function formatItem(row, position, n, term) {
if($("#keywords-h").length > 0){
$("#keywords-h").flushCache();
}
// format Item
return "<span>" + row[0] + "</span>";
}
これが誰かの役に立つことを願っています。また、誰かが特殊文字に関して同じ問題を抱えている場合は、返信を投稿してください。
明らかに18か月後にこの状況に達しましたが、
キャッシュの長さ:0
オプションでうまくいきました。ということは、最新のリリースではバグが修正されているのでしょうか?
これは私にとってはうまくいきました。
function requestData(q) {
if (!options.matchCase) q = q.toLowerCase();
//-- I turned off this line
// var data = options.cacheLength ? loadFromCache(q) : null;
//-- And added this line of code
var data = null;
サブセットマッチングを無効にするオプションがあります。
$("#query").autocomplete(
url,
{
matchSubset: false
}
)