「保存エラー」の表示を適確に 

「投稿する」を押して記事データを送信した時は、送信の確認画面が表に出るので、万が一送信エラーがあった場合は、間違いなく気付けます。

 

一方、「下書き保存」を押して保存エラーがあった場合も、「下書き保存の確認画面」が同様に表に出て、そのエラーを見落とす事はないでしょう。 しかしながら「SP Caution」の推奨する方法ですが、「下書き保存」ボタンやパネルの「SAVE」ボタンを「Ctrl+左Click」する操作では、「下書き保存の確認画面」が表に出ません。 ブラウザウインドウのタブを見ていれば、保存エラー時は確認画面のタブが消えない事や、「SP Caution」のパネルが消えない事で異常に気付くのですが。

 

という事で、保存エラーの見落としは、実際は起こり難いと思って来たのですが、今回のコードの見直しに際し、もう少し「エラー表示」を確実にする事にしました。

 

 

 

方針 

 

「保存エラー」の場合 

「下書き保存の確認画面」で「保存エラー」が表示された場合、編集画面の「下書き保存」ボタンと、「SP Caution」のパネルの「SAVE」ボタンを「赤背景」にして、確実にエラーに気付く様にする。

 

下は、「文字数超過エラー」のポピュラーなエラーです。 他にも「保存エラー」になる場合があるかも知れません。 アメーバのサーバーとの通信は成立し、システムが保存できない返答を返して来た状態です。

 

 

◎確認画面上に「.p-error」のエラー表示要素があれば、「編集画面」の「下書き保存」と「SAVE」ボタンを「赤色」にして、エラーを表示します。

◎更に、エラーのフラグとして、「SAVE」ボタンに「z-index: 0」を指定します。

 

◎正常保存の場合は「.entryComplete」という要素が生成され、それを確認して「編集画面」の「下書き保存」と「SAVE」ボタン保存ボタンを「黒色」にします。

◎同時に、「SP Caution」のパネルを非表示にします(これはこれまでのコードの通りです)

◎更に、保存成功のフラグとして、「SAVE」ボタンに「z-index: 1」を指定します。

 

 

 「通信のエラー」などの場合

ユーザー側でネット接続が切断されたり、アメーバ側のシステムメンテ時や、サーバーに問題が生じた場合などでは、通信が成立していないので、エラー報告も戻って来なくなります。

 

 

この様な状況に対応するには、「保存成功のフラグが戻って来ない事」を判定して、ユーザーに知らせる必要があります。

 

◎「下書き保存」を押して 5sec後に、「SAVE」ボタンを調べ、フラグが「z-index: 0」なら保存不成功と判断して、「下書き保存」と「SAVE」ボタン保存ボタンを「赤色」にして、エラーを報告します。

 

 

エラー報告のダイアグラム 

正常に保存が終了した場合

 

 

 

保存上でエラーがあった場合

 

 

 

 

実際の「パネル」「ボタン」の表示 

エラーが生じていない状態

 

 

 

下書き保存でエラーがあった場合

 

 

 

▪パネルの表示がない状態で「下書き保存」を押してエラーが生じた場合、「下書き保存」ボタンの「赤色」でエラーが判ります。

 

▪ボタンの色の状態に関わらず、ボタンの機能は変わりません。

 

 

 

「SP Caution ⭐」を利用するには

このツールは Chrome / Edge / Firefox版の拡張機能「Tampermonkey」上で動作します。

 

▪ このツールの扱い方は簡単ですが、以下の操作マニュアルに纏めています。

 

 

 

▪「アラート表示」の配置は、「Ameblo Writer(Compact)」でアレンジした「編集画面」を前提にしていますが、このアレンジが無くてもツールは機能します。

「Ameblo Writer(Compact)」に関しては、以下を参照ください。

 

 

 

以下に、「SP Caution ⭐」の導入手順を簡単に説明します。

 

❶「Tampermonkey」を導入します

◎ 使用しているブラウザに拡張機能「Tampermonkey」を導入する事が必要です。

既に「Tampermonkey」を導入している場合は、この手順 ❶ は不要です。 

拡張機能の導入については、以下のページに簡単な説明があるので参照ください。

 

 

❷「Tampermonkey」にスクリプトを登録します

◎「Tampermonkey」の「」マークの「新規スクリプト」タブを開きます。

 

 

 

◎「新規スクリプト」には、最初からテンプレートが記入されています。 これは全て削除して、完全に空白の編集枠に 下のコードをコピー&ペーストします。

 

〔コピー方法〕 軽量シンプルなツール「PreBox Button   」を使うと

  コード枠内を「Ctrl+左Click」➔「Copy code 」を「左Click」

  の操作で、掲載コードのコピーが可能になります。

 

◎ 最後に「ファイル」メニューの「保存」を押すと、ツールが使用可能になります。

 

 

〔 SP Caution ⭐ 〕 ver. 0.6 

 

// ==UserScript==
// @name         SP Caution ⭐
// @namespace    http://tampermonkey.net/
// @version      0.6
// @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
// @grant         none
// ==/UserScript==


let path_name=location.pathname;

if(path_name.includes('srventryupdateinput')){ // 再編集の編集画面

    let sp_set=localStorage.getItem('SPCaution'); // 自動保存間隔 🔵
    if(!sp_set){
        sp_set=10; }
    localStorage.setItem('SPCaution', sp_set); //  設定を更新 🔵


    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(){ // 起動表示と警告ダイアログ

        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(){
                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(){
            clearTimeout(alarm);
            auto_request();

            setTimeout(()=>{
                if(sp_save.style.zIndex=='1'){ // 正常終了の場合
                    sp_save.style.zIndex='0'; // リセット
                    red(0); }
                else{
                    sp_save.style.zIndex='0'; // リセット
                    red(1); }
            }, 5000 ); } // 下書き送信 5sec後に成否をチェック



    function red(n){
        let sp_save=document.querySelector('#sp_save');
        if(sp_save){
            if(n==1){
                sp_save.style.background='red'; }
            else{
                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('srventryupdatedraft.do')){ // 下書き保存確認画面
    let Complete=document.querySelector('.entryComplete');
    if(Complete){
        let sp_panel=window.opener.document.querySelector('#sp_panel');
        let sp_save=window.opener.document.querySelector('#sp_save'); // 保存の成否フラグ
        if(sp_panel && sp_save){
            red(0);
            sp_panel.style.zIndex='-1';
            window.close(); }}

    let p_error=document.querySelector('.p-error');
    if(p_error){
        red(1); }


    function red(n){
        let sp_save=window.opener.document.querySelector('#sp_save');
        if(sp_save){
            if(n==1){
                sp_save.style.zIndex='0'; // 下書き保存 不成功の通知フラグ
                sp_save.style.background='red'; }
            else{
                sp_save.style.zIndex='1'; // 下書き保存 成功の通知フラグ
                sp_save.style.background=''; }}
        let draft=window.opener.document.querySelector('.js-submitButton[publishflg="1"]');
        if(draft){
            if(n==1){
                draft.style.background='red'; }
            else{
                draft.style.background='#000'; }}}

} // 下書き保存確認画面




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 ⭐」の最新バージョンへのリンクは、以下のページのリンクリストから探せます。