jQueryで作ったものすごく単純な名前変換機能
- 記事差し替えのお知らせ掲示
- 折角なのでおまけのフォームデザインをテキストエリアやらセレクトボックスやらに対応させておきました。
- おまけのフォームデザイン追記
- 処理内容含めソースコード調整、使用機能を選択可能に変更。説明は後ほど追記予定(完了)
- 記事投稿
notice(2023/02/17)
近々、当記事はjQueryを抜いた、JavaScriptのみで動作するものの配布と差し替えます。
現在配布中のjQuery使用版について
- 2023年末までは内容確認できるようにしておくつもりです。
- 以降は掲載並びに配布終了予定。
差し替え予定時期
- JavaScript版の使用方法説明を書き終え次第。
JavaScript版について
- script自体はできています。
- jQuery版でできることは全部できます。
- 新規導入を検討している方は未だ説明不十分な点もあり申し訳ないのですが、こちらの使用をおすすめします。
差し替え予定のJavaScript版
説明書きかけです……
sessionStrage,localStrageの仕様把握がてら作ったので置いておきます。
ついでに文字の置き換えプラグインの使用例。
source code
demo
HTML
- <div>
- <input type="text" data-text="名称1" />
- <input type="text" data-text="名称2" />
- <input type="submit" id="changeSet" value="SET" />
- <input type="submit" id="changeClr" value="CLEAR" />
- </div>
- <p>設定中:#名称1##名称2#</p>
jQuery
- $(function(){
- var dflt = {
- '名称1': 'デフォ1',
- '名称2': 'デフォ2'
- };
- var $set = $('#changeSet');
- var $clr = $('#changeClr');
- var $area = $('body');
- var storage = sessionStorage;
- var path = 'textchanger';
- var data = JSON.parse( storage.getItem(path) );
- if( $.type(data)!='object' ) data={};
- $.each(dflt,function(k,v){
- var txt = data[k]||v;
- var $tgt = $area.wrapText(RegExp('#'+k+'#','g')).text(txt);
- var $inpt = $('input[data-text="'+k+'"]').val(txt);
- if( !$inpt.length ) return true;
- $set.on('click',function(){
- data[k] = $inpt.val();
- $tgt.text(data[k]);
- });
- $clr.on('click',function(){
- delete data[k];
- $tgt.text(v);
- $inpt.val(v);
- });
- });
- $set.on('click',function(){
- storage.setItem(path, JSON.stringify(data) );
- });
- $clr.on('click',function(){
- var s = JSON.stringify(data);
- if(s.length<3) storage.removeItem(path);
- else storage.setItem(path,s);
- });
- });
- (function( $ ){
- $.fn.replaceText = function(pattern,replacement,nofollow) {
- var $not = this.find(nofollow||'script,style').find('*').addBack();
- this.find('*').addBack().not($not).contents().each(function(){
- if( this.nodeType != 3 ) return true;
- var str = htmlEsc( $(this).text() );
- if( !str.match(pattern) ) return true;
- $(this).replaceWith( str.replace(pattern,replacement) );
- });
- return this;
- function htmlEsc(str){
- return str.replace(/[&<>'"`]/g, function(s){ return '&#'+s.charCodeAt(0)+';'; });
- }
- };
- $.fn.wrapText = function(pattern,tagname,nofollow) {
- var pattern = pattern || /&#\d+;|\S/g;
- var tagname = tagname || 'span';
- var $adv = this.find(tagname);
- return this.replaceText(pattern,'<'+tagname+'>$&</'+tagname+'>',nofollow).find(tagname).not($adv);
- };
- })( jQuery );
機能選択
調整用情報
変換設定
:'key': 'text'
を,
区切りで必要数記述
key | : | HTML上の#key# やdata-text="key" と紐づけられます。お好きに設定してください。HTML上でエスケープした方がいい文字( <>&"' )や環境依存文字、絵文字は避けた方が無難です。 |
text | : | 閲覧者側が未設定時のデフォルト採用テキスト |
最低でもここさえ編集しておけば使用できます。
設定ボタンの紐づけ
: | #changeSet クリック時に変換,設定保存させる要素のセレクタ |
|
: | #changeClr クリック時に初期化させる要素のセレクタ |
入力欄の紐づけ
: | input[data-text="'+k+'"] 入力欄のセレクタ'+k+' 部分に「変換設定」で言うkey が入ると思って下さい。 |
他と競合して困る場合に編集を。
変換範囲
: | body 変換を反映させる要素のセレクタ。デフォルトは body でページ全域にしていますが、idなりを設定した特定要素内に範囲を絞った方が初期動作が速くなります。 |
機能選択について
独自タグの使用
HTML上でより感覚的に操作できるよう、#名称1#
等の記述が閲覧者設定テキストに置き換わるよう処理しています。
実表示時にはテキストを内包したspan
要素になります。
独自タグの編集
#'+k+'#
にて使用する独自タグを編集できます。
'+k+'
に、「変換設定」で言うkey
が入ると思って下さい。
正規表現上でエスケープした方がよい記号を使う際はエスケープを。
あ'+k+'い
ならHTML上ではあ名称1い
「'+k+'」
ならHTML上では「名称1」
\['+k+'\]
ならHTML上では[名称1]
ストレージ
閲覧者がページをまたいでも変換設定を保持できるよう、HTML5の機能であるsessionStorage
,localStorage
を利用し、閲覧者のブラウザに記憶を保持させています。
不使用選択の場合、変換はそのページのみに反映され、ブラウザバック等含め移動後は初期化されます。
sessionStorageとlocalStorageの違い
sessionStorage | : | 同タブ内のみ有効( ※:一部ブラウザでは target="_blank" でのリンク先には反映されたりと差異有 |
)、ブラウザやタブを閉じると記憶は破棄される
localStorage | : | いつでもどこでも有効、基本記憶は消えない |
一度変換設定をした閲覧者の以降のアクセス時に必ず変換内容を反映させたい場合はlocalStorage
を採用してください。
ストレージのあつかいについて
ストレージはドメイン単位で管理されており、パスで呼び出し、保存します。
つまり同ドメインで同パスだと同じ記憶が呼び出され、保存時には上書き保存されます。
同ドメイン内に他者が管理する別サイトのあるサービス(ナノ、ALICE+等)だと、他サイトと閲覧者の変換設定が共有されることがあります。
避けたい場合はにてパスを設定しているので、textchanger
を他者と被りにくい物に変更する等工夫してください。
変換フォーム設置ページに「ナノ間で設定共有される可能性がある」等の旨を記載しておくといいかもしれません。
一応上記のスクリプトでは、ドメイン+パス
+変換用のkey
が同一でないと共有されないようにはしています。
記憶領域がドメイン毎に5MB↑とcookieに比べれば中々に膨大ではありますが、塵も積もればなので特に強い理由が無ければkey
含め被らせておいた方が閲覧者の容量的にありがたいんじゃないかなーと個人的には思います。(特にlocalStorage
採用時)
おまけ
フォームデザイン
CSS
- @import url('https://fonts.googleapis.com/css?family=Bungee&display=swap');
- textarea ,select ,input {
- box-sizing: border-box;
- position: relative;
- width: 100%;
- max-width: 400px;
- margin: 3px 0;
- padding: 0 1em;
- border-radius: 1em / 50%;
- border: none;
- outline: 0;
- background: rgba(0,0,0,0.05);
- background-repeat: no-repeat;
- box-shadow: 0 1px rgba(0,0,0,0.05) inset;
- color: #ffffff;
- line-height: 2em;
- font-size: inherit;
- font-family: inherit;
- letter-spacing: inherit;
- -webkit-appearance: none;
- appearance: none;
- -webkit-tap-highlight-color: rgba(0,0,0,0);
- }
- .sizeL { width:100%;max-width:400px}
- .sizeM { width: 50%;max-width:200px}
- .sizeS { width: 25%;max-width:100px}
- .size0 { width:auto;max-width:none}
- textarea {
- height: 90px;
- min-height: 3em;
- border-radius: 1em;
- padding-top: 0.5em;
- padding-bottom: 0.5em;
- vertical-align: top;
- }
- select {
- padding-right: 2em;
- background-image: url('data:image/svg+xml,%3Csvg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"%3E%3Cpolyline fill="none" stroke="%23ffffff" stroke-width="5" stroke-linecap="round" stroke-linejoin="round" points="4 8 12 16 20 8" /%3E%3C/svg%3E');
- background-size: 0.7em 0.7em;
- background-position: right 0.8em center;
- cursor: pointer;
- }
- option {
- background-color: #000000;
- }
- input[type="submit"] ,input[type="button"] {
- width: auto;
- min-width: 3em;
- top: -1px;
- background-color: rgba(255,255,255,0.15);
- background-image: linear-gradient(rgba(255,255,255,0.08) 50%,transparent 50%);
- box-shadow: 0 1px rgba(0,0,0,0.05);
- cursor: pointer;
- font-family: 'Bungee', cursive;
- }
- input[type="submit"]:active ,input[type="button"]:active {
- top: 0;
- box-shadow: none;
- background-image: none;
- }
- input[type="radio"] ,input[type="checkbox"] {
- width: 1em;
- height: 1em;
- margin: 0 3px 0 0;
- padding: 0;
- background-size: 0.5em 0.5em;
- background-position: center center;
- vertical-align: middle;
- cursor: pointer;
- }
- input[type="radio"] {
- border-radius: 50%;
- }
- input[type="radio"]:checked {
- background-image: radial-gradient(closest-side,#fff 80%,transparent 80%);
- }
- input[type="checkbox"]:checked {
- background-image: url('data:image/svg+xml,%3Csvg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"%3E%3Cpolyline fill="none" stroke="%23ffffff" stroke-width="6" stroke-linecap="round" stroke-linejoin="round" points="4 12 9 16 20 6" /%3E%3C/svg%3E');
- }
- input[type="file"] ,input[type="image"] {
- width: auto;
- max-width: none;
- margin: 0;
- padding: 0;
- border-radius: 0;
- background-color: transparent;
- box-shadow: none;
- color: inherit;
- cursor: pointer;
- }
demo
配色
白黒濃淡のみの描画なので発色の良いの背景色のページで映えると思います。
パーツサイズ
基本的に文字のサイズ準拠で設定しています。
margin
(外余白)
width
(幅)
max-width
(最大幅)
幅はsizeM
かsizeS
のクラス付与で固定サイズへ縮小できるようにしました。
要素
(01)
:<textarea></textarea>
(02)
:<select></select>
以降全て:<input />
input要素について
type
属性値radio
checkbox
submit
button
のみ設定済み、
他はfile
image
を除いて(03)
と同表示になります。