「SP Caution ⭐」の機能
再編集で行った編集内容は、ユーザー自身が何らかの形で保存をしないと、バックアップはありません。「SP Caution ⭐」は、再編集で開いた編集画面で、ユーザーが指定した時間ごとに「下書き保存」する事を忠告するツールです。
このツールの扱い方は、以下のマニュアルを参照ください。
このツールは編集データを守るためのツールですから、基幹ツールに指定しました。
基幹ツールの起動を監視するツール
今回の更新は、基幹ツールを監視する機能の実装に対応したものです。 この機能の詳細は以下のページを参照ください。
今回の更新で追加した「起動を表示するコード」は以下の部分です。
「SP Caution ⭐」 ver. 0.9 50行~
コメントに「📛」を書き込んでいますが、これは今後の起動監視に関して、各ツールのメンテナンス上で、検索をし易くするためです。
「SP Caution ⭐」を利用するには
このツールは Chrome / Edge / Firefox版の拡張機能「Tampermonkey」上で動作します。
「アラート表示」の配置は、「Ameblo Writer(Compact)」でアレンジした編集画面を前提にしています。 このアレンジスタイルに関しては、以下を参照ください。
以下に、「SP Caution ⭐」の導入手順を簡単に説明します。
❶「Tampermonkey」を導入します
◎ 使用しているブラウザに拡張機能「Tampermonkey」を導入する事が必要です。
既に「Tampermonkey」を導入している場合は、この手順 ❶ は不要です。
拡張機能の導入については、以下のページに簡単な説明があるので参照ください。
❷「Tampermonkey」にスクリプトを登録します
◎「Tampermonkey」の「+」マークの「新規スクリプト」タブを開きます。
◎「新規スクリプト」には、最初からテンプレートが記入されています。 これは全て削除して、完全に空白の編集枠に 下のコードをコピー&ペーストします。
〔コピー方法〕 右サイドバーの マークのボタンを1度押してください。
コード枠内の右クリック ➔ コード全体の選択 ➔ コピー操作 が可能になります。
◎ 最後に「ファイル」メニューの「保存」を押すと、ツールが使用可能になります。
〔 SP Caution ⭐ 〕 ver. 0.9
// ==UserScript== // @name SP Caution ⭐ // @namespace http://tampermonkey.net/ // @version 0.9 // @description 編集画面の自動保存 // @author Ameblo Writer User // @match https://blog.ameba.jp/ucs/entry/srventryupdateinput* // @match https://blog.ameba.jp/ucs/entry/srventryupdatedraft.do // @match https://blog.ameba.jp/ucs/entry/srventryinsertinput.do // @match https://blog.ameba.jp/ucs/entry/srventrylist* // @grant none // ==/UserScript== let sp_save=localStorage.getItem('SP_save'); // 保存確認フラグ 🔵 if(!sp_save){ localStorage.setItem('SP_save', 0); } let sp_act=localStorage.getItem('SP_act'); // SAVEボタン押下フラグ 🔵 if(!sp_act){ localStorage.setItem('SP_act', 0); } let sp_id=localStorage.getItem('SP_id'); // SAVEボタン押下フラグ 🔵 if(!sp_id){ localStorage.setItem('SP_id', 0); } let sp_set=localStorage.getItem('SPCaution'); // 自動保存間隔 🔵 if(!sp_set){ localStorage.setItem('SPCaution', 10); } let path_name=location.pathname; if(path_name.includes('srventryupdateinput')){ // 再編集の編集画面 let retry=0; let interval=setInterval(wait_target, 100); function wait_target(){ retry++; if(retry>10){ // リトライ制限 10回 1sec clearInterval(interval); } let target=document.querySelector('.l-gHeaderLeft__link a'); // 監視 target if(target){ clearInterval(interval); button_disp(); auto_backup(); }} function button_disp(){ // 起動表示と警告ダイアログ sessionStorage.setItem("jslord_2", "1"); // 📛 let lform=document.querySelector('.l-form'); let lform_w=(lform.clientWidth)/2; let SVG_spch= '<svg id="svg_spch" viewBox="0 0 150 150">'+ '<path d="M66 13C56 15 47 18 39 24C-12 60 18 146 82 137C92 135 '+ '102 131 110 126C162 90 128 4 66 13M68 25C131 17 145 117 81 125C16 '+ '133 3 34 68 25M69 40C61 41 39 58 58 61C66 63 73 47 82 57C84 60 '+ '83 62 81 65C77 70 52 90 76 89C82 89 82 84 86 81C92 76 98 74 100 66'+ 'C105 48 84 37 69 40M70 94C58 99 66 118 78 112C90 107 82 89 70 94z">'+ '</path></svg>'; let disp= '<div id="sp_panel">'+ '<span id="sp_save" class="sp_c">SAVE</span>'+ '<span id="sp_pass" class="sp_c">PASS</span>'+ '<input id="sp_time" type="number" min="2" max="30">'+ '<span id="sp_min">min</span>'+ SVG_spch + '</div>'+ '<style>'+ '.p-submit__container > .js-submitButton[publishflg="1"] { background: #000; } '+ '#sp_panel { position: fixed; bottom: 100px; z-index: -1; '+ 'right: calc(50vw - '+ lform_w +'px); padding: 0 10px; '+ 'font: bold 16px Meiryo; color: #fff; height: 60px; width: 210px; '+ 'background: #000; border: 1px solid #ccc; border-radius: 4px; '+ 'display: flex; justify-content: space-between; align-content: center; } '+ '.sp_c { padding: 3px 6px 1px; margin: auto 0; '+ 'border: 1px solid #ccc; border-radius: 4px; cursor: pointer; } '+ '.sp_c:hover { background: #b0bec5; } '+ '#sp_time { position: relative; height: 27px; width: 48px; '+ 'margin: auto 0; padding: 1px 2px 0 4px; background: #000; '+ 'border: 1px solid #ccc; border-radius: 4px; -moz-appearance: textfield; } '+ '#sp_time:hover { z-index: 2; -moz-appearance: unset; } '+ 'input[type=number]::-webkit-inner-spin-button { margin-top: -1px; } '+ '#sp_min { position: relative; left: -38px; bottom: -24px; height: 20px; '+ 'margin-right: -36px; font-size: 11px; } '+ '#sp_min:hover { z-index: -1; } '+ '#svg_spch { height: 16px; margin: 28px -4px 0 -2px; fill: #fff; '+ 'cursor: pointer; }'+ '</style>'; if(!document.querySelector('#sp_panel')){ document.body.insertAdjacentHTML('beforeend', disp); } let sp_time=document.querySelector('#sp_time'); if(sp_time){ sp_time.value=sp_set; } let help=document.querySelector('#svg_spch'); if(help){ help.onclick=function(){ let url='https://ameblo.jp/personwritep/entry-12770480518.html'; window.open(url, '_blank'); }} } // button_disp() function auto_backup(){ let sp_panel=document.querySelector('#sp_panel'); let sp_save=document.querySelector('#sp_save'); let sp_pass=document.querySelector('#sp_pass'); let draft=document.querySelector('.js-submitButton[publishflg="1"]'); let sp_time=document.querySelector('#sp_time'); let alarm; auto_request(); function auto_request(){ alarm=setTimeout(()=>{ save(); }, sp_set*60000); } // 自動タイマー設定 🔴 function save(){ sp_panel.style.zIndex='20'; sp_save.onclick=function(){ localStorage.setItem('SP_act', 1); // SAVEボタン押下のフラグをセット draft.click(); } sp_pass.onclick=function(){ sp_panel.style.zIndex='-1'; auto_request(); }} sp_time.addEventListener('input', function(){ sp_set=sp_time.value; localStorage.setItem('SPCaution', sp_set); }); // 設定を更新 🔵 draft.oncontextmenu=function(){ clearTimeout(alarm); save(); return false; } draft.onclick=function(event){ if(!event.ctrlKey){ //「下書き保存の確認画面」を表示する localStorage.setItem('SP_save', 1); // 確認フラグをセット clearTimeout(alarm); auto_request(); setTimeout(()=>{ check_flag(); }, 200); } else{ //「Ctrl+左Click」で「記事の編集・削除」を表示する localStorage.setItem('SP_act', 1); // SAVEボタン押下のフラグをセット setTimeout(()=>{ let entylist_url; let date_input=document.querySelector('input[name="entry_created_datetime"]'); let date=date_input.value; if(date=='current'){ entylist_url='https://blog.ameba.jp/ucs/entry/srventrylist.do'; } else{ let date_q=date.slice(0, 7).replace('-', ''); entylist_url= 'https://blog.ameba.jp/ucs/entry/srventrylist.do?entry_ym=' + date_q; } let entry_id=document.querySelector('input[name="entry_id"]'); localStorage.setItem('SP_id', entry_id.value); // 記事IDの検索フラグをセット window.open(entylist_url); //「記事の編集・削除」を開く }, 200); } } // draft.onclick() function check_flag(){ let retry=0; let interval=setInterval(wait_target, 200); function wait_target(){ retry++; if(retry>30){ // 待機制限 6sec経過 通信エラー等の場合 clearInterval(interval); red(1); localStorage.setItem('SP_save', 0); } if(localStorage.getItem('SP_save')==0){ // 正常終了 clearInterval(interval); red(0); } if(localStorage.getItem('SP_save')==2){ // 保存エラーを確認 clearInterval(interval); red(1); localStorage.setItem('SP_save', 0); }}} function red(n){ let sp_panel=document.querySelector('#sp_panel'); let sp_save=document.querySelector('#sp_save'); if(sp_panel && sp_save){ if(n==1){ sp_save.style.background='red'; } else{ sp_panel.style.zIndex='-1'; sp_save.style.background=''; }} let draft=document.querySelector('.js-submitButton[publishflg="1"]'); if(draft){ if(n==1){ draft.style.background='red'; } else{ draft.style.background='#000'; }}} } // auto_backup() } // 下書き編集画面 if(path_name.includes('entry/srventrylist')){ //「記事の編集・削除」のリスト検索 if(sp_id!=0){ let entry_id=document.querySelectorAll('input[name="entry_id"]'); let entry_item=document.querySelectorAll('.entry-item'); let index=-1; for(let k=0; k<entry_id.length; k++){ if(entry_id[k].value==sp_id){ index=k; }} if(index!=-1){ localStorage.setItem('SP_id', 0); // 検索フラグをリセットして停止 entry_item[index].style.outline='2px solid #2196f3'; } else{ let next=document.querySelector('.pagingArea .next'); if(next && !next.classList.contains('disabled')){ next.click(); } else{ // 記事が見つからなかった場合 localStorage.setItem('SP_id', 0); }}} // 検索フラグをリセットして停止 } //「記事の編集・削除」のリスト検索 if(path_name.includes('srventryupdatedraft.do')){ // 下書き保存確認画面 let Complete=document.querySelector('.entryComplete'); if(Complete){ localStorage.setItem('SP_save', 0); // 確認フラグをセット if(localStorage.getItem('SP_act')==1){ // SAVEボタン押下のフラグ localStorage.setItem('SP_act', 0); // フラグをリセット setTimeout(()=>{ window.close(); }, 100); }} // SAVEボタン押下時のみ、確認画面を自動削除 let p_error=document.querySelector('.p-error'); if(p_error){ localStorage.setItem('SP_save', 2); // エラーの確認フラグをセット localStorage.setItem('SP_act', 0); } // SAVEボタン押下のフラグをリセット } // 下書き保存確認画面 if(path_name.includes('srventryinsertinput')){ // 新規編集の編集画面 button_disp(); function button_disp(){ // 起動表示と警告ダイアログ let lform=document.querySelector('.l-form'); let lform_w=(lform.clientWidth)/2; let disp= '<div id="sp_panel">'+ '新規作成の編集画面の場合は<br>未保存記事の復元が可能です'+ '</div>'+ '<style>'+ '.js-submitButton[publishflg="1"] { background: #000 !important; } '+ '#sp_panel { position: fixed; bottom: 100px; z-index: -1; '+ 'right: calc(50vw - '+ lform_w +'px); padding: 6px 10px 4px; '+ 'font: normal 16px/20px Meiryo; color: #fff; height: auto; width: 210px; '+ 'background: #000; border: 1px solid #ccc; border-radius: 4px; '+ 'display: flex; justify-content: space-between; align-content: center; } '+ '</style>'; if(!document.querySelector('#sp_panel')){ document.body.insertAdjacentHTML('beforeend', disp); } } // button_disp() let draft=document.querySelector('.js-submitButton[publishflg="1"]'); let sp_panel=document.querySelector('#sp_panel'); if(draft && sp_panel){ draft.onmouseenter=()=>{ sp_panel.style.zIndex='20'; } draft.onmouseleave=()=>{ sp_panel.style.zIndex='-1'; }} } // 新規編集の編集画面
「SP Caution ⭐」最新版について
旧いバージョンの JavaScriptツールは、アメーバのページ構成の変更で動作しない場合があり、導入する場合は最新バージョンをお勧めします。
●「SP Caution ⭐」の最新バージョンへのリンクは、以下のページのリンクリストから探せます。