Skip to content

jQuery 3 → 4 移行の影響 ​

第6版作成 最終更新 (日本時間)
確認バージョン1.5.1.01.5.8.1

プリザンターのフロントエンドを jQuery 4.0 に移行した場合の影響を、本体コードと同梱プラグインに分けて調査した結果です。 結論として、本体コードは削除済み API を使っておらず、改修は 14 箇所程度の機械的な置換で済むため jQuery Migrate は不要です。一方、同梱プラグインは合計 78 箇所で削除・非推奨 API を使っており、特に jQuery File Upload(19 箇所、リポジトリはアーカイブ済み)が最大のブロッカーです。プラグイン向けには jQuery Migrate を一時的に導入する方針が推奨されます。

対象バージョン

バージョン 1.5.1.0 を対象にした調査です。スクリプトやプラグインのファイル数・箇所数はこのバージョンでの値です。

プリザンターの jQuery 依存状況 ​

jQuery のバージョン ​

フロントエンドには 2 つの jQuery 参照があります。

参照元バージョン用途
plugins/jquery-3.6.0.min.js3.6.0レガシー側(静的ファイル直接参照)
package.json の dependencies3.7.1PleasanterFrontend(npm + Vite ビルド)

レガシー側では、C# コード(HtmlScripts.cs)に jquery-3.6.0.min.js のファイル名がハードコードされています。確認したソースでも同じです(HtmlScripts.cs、package.json の jQuery も 3.7.1)。

csharp
// jQuery 3.6.0 のファイル名がハードコードされている
"assets/plugins/jquery-3.6.0.min.js"

PleasanterFrontend では、Vite ビルドにより node_modules の jQuery 3.7.1 が vendor チャンクにバンドルされています。

同梱 jQuery プラグイン ​

すべて wwwroot/src/plugins/ 配下に格納されています。

プラグインバージョン用途メンテナンス状態・備考
jQuery UIv1.13.2ソート、ドラッグ、タブ、メニューなど活発
jQuery Validatev1.21.0フォームバリデーション活発
jquery.datetimepicker不明(xdsoft)日時ピッカー停止(flatpickr に置換済)
jQuery File Upload不明(blueimp)ファイルアップロードアーカイブ済
jQuery MultiSelect不明(eric hynds)複数選択 UI停止
Lightboxv2.11.4画像表示活発
flatpickrv4.6.13日時ピッカー(新)v1.4.18.0 で導入

datetimepicker は flatpickr に置換済み

jquery.datetimepicker は v1.4.18.0(2025 年 5 月のコミット)で flatpickr に置き換えられています。デフォルト設定(UseOldDatepicker = false かつテーマ v2.0 以上)では flatpickr が使われ、旧実装はレガシーフォールバックとして残されています。

スクリプトの構成 ​

ディレクトリファイル数言語jQuery 依存度
generals/112JavaScript高(jQuery ベース)
generals/modal/2TypeScript低($p.modal 参照のみ)
generals/grid-container/1TypeScriptなし(vanilla DOM + Web Component)
modules/15TypeScript低(橋渡し程度)

generals/ 配下が jQuery を中心としたレガシーコード、modules/ 配下が vanilla DOM API と Web Components によるモダンなコードです。

jQuery 4.0 の主な破壊的変更 ​

プリザンターに影響しそうなものを抜粋します。

削除された非推奨 API ​

削除 API代替手段
$.isArray()Array.isArray()
$.parseJSON()JSON.parse()
$.trim()String.prototype.trim()
$.type()typeof / instanceof
$.now()Date.now()
$.isFunction()typeof x === 'function'
$.isNumeric()自前実装
$.isWindow()自前実装
$.camelCase()自前実装
$.nodeName()element.nodeName.toLowerCase()

その他の変更 ​

分類変更点影響
イベントevent.which の shim 削除jQuery が keyCode / charCode から自動合成しなくなる
イベントevent.fixHooks 削除イベント正規化の低レベル API が廃止
イベントfocusin / focusout 発火順序変更ネイティブの focus / blur との順序が変わる
CSS.css() 数値渡し時の px 自動付与ルール変更$.cssNumber リストの変更・削除
AJAX$.ajaxSetup 非推奨の強化将来的に削除される可能性
AJAXJSONP サポートの削除dataType: 'jsonp' が使えなくなる
ビルドSlim ビルドの廃止通常ビルドのみ提供
その他.bind() 削除.on() に移行が必要
その他jQuery プロトタイプの配列メソッド削除.push() / .sort() / .splice() が jQuery オブジェクトで使えなくなる
その他toggleClass(boolean) 削除クラス名の指定が必須に

本体コード(generals/)への影響 ​

削除済み非推奨 API は未使用 ​

jQuery 4.0 で削除される非推奨 API($.isArray / $.parseJSON / $.trim / $.type / $.now / $.isFunction / $.isWindow / $.camelCase / $.nodeName / $.cssNumber / $.cssProps)は、本体コードではいずれも 0 件でした。ネイティブ JavaScript の標準メソッドで書かれています。

影響箇所と改修内容 ​

リスク対象ファイル数箇所数改修内容
高event.which 使用23event.key === 'Enter' に置換
高.css() 数値渡し511+数値に + 'px' を付与
中$.ajaxSetup 使用23個別の $.ajax オプションに移行
中.bind() 使用11.on() に置換
中$.ajaxSettings.xhr() 参照11標準の XMLHttpRequest を使用
中async: false(同期 AJAX)11Promise ベースの非同期処理に移行
低focusin イベント順序変更11テストで確認
低event.keyCode 使用33event.key への移行を推奨(jQuery 4.0 でも動作する)
低$(document).ajaxComplete()11テストで確認

event.which(高リスク) ​

generals/searchevents.js と generals/keyevents.js で使われています。e.which === 13 を e.key === 'Enter' に置き換えます。

確認したソースでは、これに加えて generals/crosstabdrilldown.js でも e.which !== 13 && e.which !== 32(Enter / Space 以外)の判定に使われており、3 ファイル 4 箇所になっています(crosstabdrilldown.js)。こちらは e.key !== 'Enter' && e.key !== ' ' に置き換えます。

js
// 修正前
if (e.which === 13) {
    // Enter キーでフォームのボタン発火
}
return e.which !== 13;

// 修正後
if (e.key === 'Enter') {
    // Enter キーでフォームのボタン発火
}
return e.key !== 'Enter';

event.keyCode について

event.keyCode は jQuery ではなくブラウザのネイティブ API です。jQuery 4.0 で shim が削除されるのは which のみなので、keyCode は引き続き動作します。ただし event.key への移行が望ましいです。

.css() の数値渡し(高リスク) ​

jQuery 3.x では .css('top', 100) のように数値を渡すと "100px" に自動変換されましたが、jQuery 4.0 ではこのルールが変わるため、長さプロパティには明示的に px を付ける必要があります。z-index のような単位を持たないプロパティは安全です。

区分ファイルプロパティ修正方針
安全tenants.js / bulkupdate.jsz-index(110)不要
安全kamban.jsz-index(2)不要
要修正responsive.jsbottomparseInt(...) + 'px'
要修正viewfilterslabelevents.jstop, leftoffset().top + ... + 'px'
要修正jqueryui.jstop, leftoffset().top + ... + 'px'
要修正gridevents.jstop, left, width, marginTop各値に + 'px'
要修正gantt.jsheight計算結果に + 'px'
js
// 修正前
$('#Menu').css('top', $header.offset().top + $header.outerHeight());
$('#Menu').css('left', $header.offset().left);

// 修正後
$('#Menu').css('top', $header.offset().top + $header.outerHeight() + 'px');
$('#Menu').css('left', $header.offset().left + 'px');

_dispatch.js の動的な .css()

_dispatch.js には .css(json.Name, json.Value) のように、サーバーサイドから動的にプロパティ名と値を受け取るパターンがあります。レスポンスに px 付きの文字列が含まれていれば安全ですが、数値だけの場合はリスクがあります。

$.ajaxSetup / .bind()(中リスク) ​

$.ajaxSetup は CSRF トークンの設定(_ajax.js)と同期/非同期の切り替え(_api.js)に使われています。将来的には個別の $.ajax オプションへの移行が推奨されます。

js
// CSRF トークン設定
$.ajaxSetup({
    beforeSend: function (xhr) {
        xhr.setRequestHeader('RequestVerificationToken', token);
    }
});
js
// 同期/非同期切替
$.ajaxSetup({ async: args.async });

.bind() は confirmevents.js の 1 箇所です。

js
// 修正前
$(window).bind('beforeunload', function () { ... });

// 修正後
$(window).on('beforeunload', function () { ... });

modules/(TypeScript)は影響なし ​

modules/ 配下は主に vanilla DOM API と Web Components で構成され、jQuery の使用は $p.set($(element), value) や $p.display() などプリザンター独自のグローバル API への橋渡しに限られます。jQuery 4.0 の破壊的変更に該当するパターンは検出されませんでした。

同梱プラグインへの影響 ​

圧縮済みファイルのエイリアス

圧縮済みファイルでは jQuery がエイリアス変数に代入されている場合があります(jQuery UI → V、jQuery Validate → a、datetimepicker → L など)。調査ではこれらのエイリアスも考慮しています。

非推奨 API 別の使用状況 ​

非推奨 APIjQuery UIValidatedatetimepickerFile UploadMultiSelectLightbox合計
$.type()003150018
$.isFunction()001500015
$.isArray()001040014
$.trim()0050005
event.which312015324
event.fixHooks0020002
合計31371915378

プラグイン別の評価 ​

リスクプラグインjQuery 4.0 対応版評価
高jQuery File Uploadなし$.type() / $.isArray() が動作しない。リポジトリは 2023 年 12 月にアーカイブ済み。ただし非圧縮で格納されているためパッチは容易
中jQuery UI 1.13.2v1.14.x で対応event.which 3 箇所はネイティブの KeyboardEvent.which として動作するため直ちには壊れない。1.13.2 は公式には jQuery 4.0 未サポートのため、1.14.x へのアップデートを推奨
中jQuery MultiSelectなし使用しているのは event.which のみ(キーボードナビゲーション)。メンテナンス停止
低Lightbox 2.11.4不明event.which 3 箇所のみ(Esc / 矢印キー)。継続的にメンテナンスされている。jQuery 4.0 対応版の有無は Lightbox 側の情報であり、プリザンターのソースからは判断できない
低jQuery Validate 1.21.0ほぼ互換event.which 1 箇所(onkeyup ハンドラ内)のみ。Array.isArray() / ネイティブ trim() への移行は完了済み
—jquery.datetimepickerなし37 箇所で全プラグイン中最多。$.isFunction() 15 箇所(コールバックの存在チェック)は jQuery 4.0 で TypeError になる。ただし flatpickr に置換済みのため、影響を受けるのはレガシー設定(UseOldDatepicker = true)の環境のみ

jQuery File Upload のファイル別内訳は次のとおりです。

ファイル非推奨 API検出数
jquery.fileupload.js$.type()9
jquery.fileupload.js$.isArray()2
jquery.fileupload-validate.js$.type()2
jquery.fileupload-process.js$.type()1
jquery.fileupload-image.js$.type()1
jquery.fileupload-audio.js$.type()1
jquery.fileupload-video.js$.type()1
jquery.fileupload-ui.js$.isArray()1
jquery.iframe-transport.js$.isArray()1

datetimepicker の新旧切り替えは HtmlControls.cs で制御されています。

csharp
return !Parameters.General.UseOldDatepicker && context.ThemeVersionForCss() >= 2.0M ?
    hb.DateField(...)     // 新: flatpickr(<date-field> Web Component)
    : hb.Div(...)         // 旧: jquery.datetimepicker(.datepicker クラス)

jQuery Migrate の要否 ​

jQuery Migrate は、削除された $.isFunction() や $.type() などを一時的に復活させるポリフィルを提供し、コンソールに修正が必要な箇所の警告を出すプラグインです。

対象jQuery Migrate理由
本体コード(generals/)不要削除済み API の使用がゼロ。高リスク箇所も 14 箇所の直接修正で対応可能。Migrate 自体が不要なポリフィルのオーバーヘッドになる
プラグイン一時的に導入File Upload(19 箇所)のために必要。datetimepicker はデフォルト設定では影響なし

WARNING

jQuery Migrate はあくまで一時的な橋渡しです。最終的にはすべてのプラグインを修正・更新し、jQuery Migrate を除去する必要があります。

移行方針 ​

対応フロー ​

図を読み込み中…

4 段階の進め方 ​

Phase内容主な作業
1本体コードの直接修正(Migrate は使わない)event.which → event.key(3)、.css() に + 'px'(11+)、.bind() → .on()(1)、$.ajaxSetup → 個別オプション(3、やや複雑)、event.keyCode → event.key(3、推奨)
2対応版があるプラグインの更新jQuery UI 1.13.2 → 1.14.x、jQuery Validate と Lightbox は最新版で互換確認
3メンテ停止プラグインの対応P0: jQuery File Upload をフォークして 19 箇所パッチ/P1: jQuery MultiSelect の event.which → event.key(15 箇所)/datetimepicker はレガシー設定の場合のみフォーク + 37 箇所パッチ
4jQuery Migrate の除去すべてのプラグインの修正・更新完了後に除去

サーバーサイドの変更 ​

JavaScript に加えて C# コード側のファイルパスも更新が必要です。jQuery 4.0 では Slim ビルドが廃止されているため、Slim ビルドを使っている場合は通常ビルドへの切り替えも必要です。

csharp
// jQuery ファイルパスの更新
"assets/plugins/jquery-3.6.0.min.js"
// ↓
"assets/plugins/jquery-4.0.0.min.js"

// jQuery Migrate を一時的に追加する場合
"assets/plugins/jquery-migrate-4.0.0.min.js"

非推奨 API の修正パターン ​

プラグインをフォーク・パッチする際の置き換えパターンです。

js
// $.isFunction() → typeof
if ($.isFunction(callback)) { callback(); }
if (typeof callback === 'function') { callback(); }

// $.isArray() → Array.isArray()
if ($.isArray(items)) { ... }
if (Array.isArray(items)) { ... }

// $.type() → typeof
if ($.type(option) === 'string') { ... }
if (typeof option === 'string') { ... }

// $.trim() → String.prototype.trim()
var value = $.trim(input);
var value = input.trim();

// event.which → event.key
if (e.which === 13) { /* Enter */ }
if (e.which === 27) { /* Esc */ }
if (e.key === 'Enter') { /* Enter */ }
if (e.key === 'Escape') { /* Esc */ }

$.type() は 'array' / 'date' / 'regexp' などより細かい型を返すため、用途によっては Array.isArray() や instanceof との組み合わせが必要です。

event.fixHooks は jQuery.event.addProp() に置き換えます。

js
// 修正前(datetimepicker の mousewheel 部分)
$.event.fixHooks[name] = { props: ['detail', 'deltaX', ...] };

// 修正後
jQuery.event.addProp('detail');
jQuery.event.addProp('deltaX');

全体サマリー ​

領域非推奨 API 使用高リスク箇所jQuery Migrate
本体コード(generals/)0 件14 箇所(.css + event.which 等)不要
modules/(TypeScript)0 件0 箇所不要
プラグイン(5 個、datetimepicker 除く)41 件19 件(File Upload)一時的に導入
datetimepicker(flatpickr 置換済)37 件—デフォルトでは不要
合計78 件33 箇所—

参考リンク ​

関連ページ ​

変更履歴

第6版記事の確認版を繰り返す表現を整理する
第5版Markdown の描画の仕組み・ショートカットキー・アイコン・公式マニュアルに無い $p 関数の解説と、Markdown 拡張・画像形式・ファビコン・テーマ・和暦などの改修・設計メモを追加
第4版「スクリプト」を 1.5.8.1 のソースで検証して修正
第3版記事のファイル名に並び順の番号を付け、元記事リンクを frontmatter の sources に移行
第2版スクリプト関数($p.get 系・$p.set 系)の解説を追加し、定数共通化と jQuery 4 移行の図を Mermaid に変更
第1版「スクリプト」セクションの記事を追加