ページにアクセスし、クエリ文字列にフィルターを追加するボタンがあります。私のコードはそのフィルターをグリッドに適用します...しかし、ユーザーはそのフィルターを削除/編集できます。グリッドに適用されているフィルターを確認できるため、ページが表示されたときにクエリ文字列から?filter = blahを削除したいと思います。 (ページ上でURLが?filter = columnAを最初に正しいと言っている場合、混乱するかもしれませんが、ユーザーはそのフィルターを削除し、columnB ....に新しいフィルターを適用しますが、クエリ文字列はまだ?filter-columnAと言います。グリッドはポストバックを必要とせずにフィルターの変更を処理できます。どうすればよいですか?そして、クエリ文字列を削除/更新できない場合、それを解析してからクエリ文字列なしでメインページにリダイレクトすることは可能ですか?フィルターをvarフィルターに保存すると、クエリ文字列でフィルターが不要になります。
ここにページを表示するコードがあります
exports.show = function(req, res) {
var filter = req.query.filter;
if (filter === null || filter === "") {
filter = "n/a";
}
res.render("somepage.jade", {
locals: {
title: "somepage",
filter: filter
}
});
};
url.parse()
を使用して、住所のコンポーネント(req.url
。クエリ文字列のないURLは、pathname
プロパティに保存されます。
Express 'redirect
を使用して、新しいページアドレスを送信します。
const url = require('url'); // built-in utility
res.redirect(url.parse(req.url).pathname);
Nodeurl
のドキュメント。
そのようなことをするためにモジュールを使用しないでください:
res.redirect( req.originalUrl.split("?").shift() );
Express 4.x +の回答:res.redirect(req.path)
// load built-in utilities for URL resolution and parsing
var url = require('url');
function removeQueryString(url){
// split url into distinct parts
// (full list: https://nodejs.org/api/url.html#url_url_parse_urlstr_parsequerystring_slashesdenotehost)
var obj = url.parse(url);
// remove the querystring
obj.search = obj.query = "";
// reassemble the url
return url.format(obj);
}
完全なURLは、_req.url
_に保存されます。node.jsの rl.parse() を使用して、パーツを引き出します。パスを取得し、res.set()
を使用してLocationヘッダーを送信し、クエリ文字列なしでURLにリダイレクトします。
_var url = require('url');
res.set('Location', url.parse(req.url).pathname);
_
リダイレクトを強制してページをリロードしないようにするために、<head>
私の.ejsファイルのセクション:
<script type="text/javascript">
var uri = window.location.toString();
if (uri.indexOf("?") > 0) {
var clean_uri = uri.substring(0, uri.indexOf("?"));
window.history.replaceState({}, document.title, clean_uri);
}
</script>
ソース: http://atodorov.org/blog/2013/01/28/remove-query-string-with-javascript-and-html5/
req.path
を使用
エンドポイントがhttp://<your-domain>.com/hello/there?name=john
...の場合.
次にreq.path
= /hello/there
同様の問題があり、その方法はセクションにスクリプトを追加することでした。ただし、前後に移動するときに不整合を避けるために、onbeforeunloadイベントリスナーを追加する必要がありました。このアプローチの利点は、リダイレクトを回避できることです。
//元のURLをローカルストレージに保存します window.localStorage.setItem( 'specifiedKey'、window.location.href); //文字列のクエリパラメータを消去し、履歴API constで置き換えますconst cleanUrl = location.href.match(/^.+(?=\?)/ g); window.history.replaceState(null、null、(cleanUrl?cleanUrl [0]:location.href)); //ウィンドウがリロードされる前に履歴が更新されます window.onbeforeunload =()=> { window.history.replaceState(null、null、window.localStorage.getItem( 'specifiedKey')); }
私が想像する唯一の問題は、ブラウザの非互換性であり、JavaScriptエンジンは正規表現の後ろ読み演算子をサポートできません。これは.split( '?')[0]を使用して簡単に修正できます