気が利くコンシェルジュ 

「自動バックアップ」が働かない「再編集画面」で、一定の時間ごとに「下書き保存」を忠告してくれる機能が「SP Caution ⭐」です。 2ヵ月近く使っていますが、予想した以上に「邪魔にならない」ので気に入ってます。

 

既に投稿した記事を修正中に「下書き保存」すると、閲覧者は一時的に記事にアクセスできなくなります。 従って、修正中に「下書き保存」するか、そうせずに修正を続けるかの判断が必要です。 この様な場合があるので「勝手に保存」するツールにしなかったのは正解でした。

 

 

 

基本的な扱い方 

このツールの基本的な仕様や扱い方は、最初の制作記事を参照ください。

 

 

 

 

下書き時の「エラー」に対応 

このツールは「下書き保存」の回数を増やしますが、その度に「保存しました」の確認ウインドウが表示され、これは少し煩わしいものです。 そこで、この確認ウインドウ(タブ)を自動的に消す様にプログラムしています。

 

一方、「SAVE」や「下書き保存」ボタンを「Ctrl+Click」すると、「確認画面」が別タブ表示になり、編集画面が隠されないのでこれはとても快適です。

 

ただ、頻回に生じる事ではありませんが、「下書き保存エラー」にユーザーが気付き難くなる問題を見落としていました。 エラーを報告する「確認ウインドウ」もすぐに閉じてしまうので、これは大いに問題があります。

 

 

保存エラー時に動作 させない

正常に保存された場合の「確認ウインドウ」はさっさと閉じ、そうでない場合は閉じない様にする改善が先ず必要です。

 

下は「正常」な「下書き保存の確認ウインドウ」です。

 

 

赤枠以降の殆どの表示は、「.entryComplete」という要素の表示で、これは正常に保存された場合にのみインポーズされます。 一方、文字数超過で保存できないエラー表示の場合は、「.entryComplete」は画面上にありません。

 

 

下は「.entryComplete」がある場合のみタブ画面を閉じるコード(太字)です。

 

let path_name=location.pathname;
if(path_name.includes('srventryupdatedraft.do')){ // 下書き保存確認画面
    let Complete=document.querySelector('.entryComplete');
    if(Complete){
        let sp_panel=window.opener.document.querySelector('#sp_panel');
        if(sp_panel){
            sp_panel.style.zIndex='-1';
            window.close(); }}

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

 

 

編集画面の表示を、確認画面で制御する 

更に、上記コードの赤文字の部分は新しい改善です。「window.opener」は、このコードが動作する確認ウインドウから見て、自分を開いた親ウインドウ(編集画面)をコントロールする事に使えます。

 

ここでは、編集画面の「#sp_panel」(このツールのアラーム表示)を取得して、その「z-index」を「-1」に変更し、「アラーム表示」を非表示にしています。 通常はセキュリティのために、あるウインドウ(タブ)から他のウインドウ(タブ)内の要素をコントロールできませんが、「window.opener」は特別な機能です。

 

下図の「SAVE」「PASS」のボタンがあるのが「アラーム表示」です。

 

 

前バージョンでは「アラーム表示」は編集画面で「下書き保存」「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.2 

 

// ==UserScript==
// @name         SP Caution ⭐
// @namespace    http://tampermonkey.net/
// @version      0.2
// @description  編集画面の自動保存
// @author        Ameblo Writer User
// @match        https://blog.ameba.jp/ucs/entry/srventryupdateinput*
// @match        https://blog.ameba.jp/ucs/entry/srventryupdatedraft.do
// @grant         none
// ==/UserScript==


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 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>'+
        '</div>'+
        '<style>'+
        '.c-button--circle--secondary { background: #000 !important; } '+
        '#sp_panel { position: fixed; bottom: 100px; z-index: -1; '+
        'right: calc(50vw - '+ lform_w +'px); '+

        'font: bold 16px Meiryo; color: #fff; height: 60px; width: 230px; '+
        'background: #000; border: 1px solid #ccc; border-radius: 4px; '+
        'display: flex; justify-content: space-evenly; 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: 26px; width: 48px; '+
        'margin: auto 0; padding: 1px 2px 0 6px; background: #000; '+
        'border: 1px solid #ccc; border-radius: 4px;} '+
        '#sp_time:hover { z-index: 2; } '+
        '#sp_min { position: relative; left: -40px; bottom: -24px; '+
        'margin-right: -34px; font-size: 11px; } '+
        '#sp_min:hover { z-index: -1;} '+
        '</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; }

} // 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 secondary=document.querySelector('.c-button--circle--secondary');
    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(){
            secondary.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); }); //  設定を更新 🔵


    secondary.oncontextmenu=function(){
        clearTimeout(alarm);
        save();
        return false; }


    secondary.onclick=function(){
        clearTimeout(alarm);
        auto_request(); }

} // auto_backup()



let path_name=location.pathname;
if(path_name.includes('srventryupdatedraft.do')){ // 下書き保存確認画面
    let Complete=document.querySelector('.entryComplete');
    if(Complete){
        let sp_panel=window.opener.document.querySelector('#sp_panel');
        if(sp_panel){
            sp_panel.style.zIndex='-1';
            window.close(); }}

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


 

 

 

「SP Caution ⭐」最新版について 

旧いバージョンの JavaScriptツールは、アメーバのページ構成の変更で動作しない場合があり、導入する場合は最新バージョンをお勧めします。

 

●「SP Caution ⭐」の最新バージョンへのリンクは、以下のページのリンクリストから探せます。