Disabilitare script in base a condizione

di il
51 risposte

Disabilitare script in base a condizione

Buonasera, da questa pagina eseguo questo script, che estrae, nel campo “Nome”, l'editore dalla notizia bibliografica (Feltrinelli, nell'esempio). Vorrei che lo script fosse eseguito una sola volta, cioè fosse disabilitato quando nella pagina precedente c'è l'espressione “Editore moderno” sotto la voce “Persone, istituzioni e famiglie”. In questo caso, infatti, dovrei estrarre (manualmente) nel campo “Nome”, l'autore dalla notizia bibliografica.

51 Risposte

  • Re: Disabilitare script in base a condizione

    Nel tuo script, sostituisci l'ultima riga con:

    var elencoLabel = document.querySelectorAll(".grid-6 label");     
    if (elencoLabel.length == 0)
    {
        impostaNome(getNome(document.querySelector('div.meta.tito div.evidence.isbd').innerText)); 
    }
    

    così non verrà eseguito su “pagina precedente”…

  • Re: Disabilitare script in base a condizione

    Ciao, grazie Fabio, lo script di questa pagina non si disattiva…

  • Re: Disabilitare script in base a condizione

    Ah, avevo sbagliato. Fai così:

    var elencoLabel = document.querySelectorAll("span.grid-6");     
    if (elencoLabel.length == 0)
    {
        impostaNome(getNome(document.querySelector('div.meta.tito div.evidence.isbd').innerText)); 
    }
  • Re: Disabilitare script in base a condizione

    Provato, ma in questo modo non viene mai estratto l'editore dalla notizia bibliografica della pagina

  • Re: Disabilitare script in base a condizione

    Ho provato anche in questo modo:

    var elencoLabel = document.querySelector("span.grid-6.label");     
    if (!elencoLabel.includes("Editore moderno"))
    {
       impostaNome(getNome(document.querySelector('div.meta.tito div.evidence.isbd').innerText)); 
    }

    ma l'editore non viene estratto neanche la prima volta…

  • Re: Disabilitare script in base a condizione

    Ciao, guarda che le istruzioni che ho scritto funzionano. Come mi hai suggerito, ho usato Tampermonkey con il Firefox.

    In fondo alla tua funzione ho messo la chiamata al metodo impostaNome dentro l'if, così:

    (function() {
        'use strict';
    
        function getNome(tmp) {
    
        var idx = tmp.indexOf('. ((');
    
        if(idx > -1){
        tmp = tmp.substr(0, idx);
        }
    
        tmp = tmp.split('. - ');
    
        switch(tmp.length){
        case 3:
        tmp = tmp[1];
        break;
        case 4:
        tmp = tmp[2];
        break;
        default:
        tmp = "";
        break;
        }
    
        if(tmp !== ''){
            tmp = tmp.substr(tmp.indexOf(' : ') + 2);
            console.log(tmp);
            if(tmp.indexOf('.') != -1 && tmp.split('.').length == 2){
                tmp = tmp.substr(tmp.indexOf('. ') + 1, tmp.indexOf(', ') -3);
                tmp = tmp.trim();
            }
            else {
                tmp = tmp.split(",")[0];
                tmp = tmp.trim();
            }
        }
        return tmp;
    }
    function impostaNome(tmp) {
        Array.from(document.querySelectorAll('article section.grid_container form div.grid-row label span')).filter( e => e.innerText.trim() === 'Nome')[0].parentNode.querySelector('input').value = tmp;
    }
    
    var elencoLabel = document.querySelectorAll("span.grid-6");
    if (elencoLabel.length == 0)
    {
        impostaNome(getNome(document.querySelector('div.meta.tito div.evidence.isbd').innerText));
    }
    
    })();

    Nella pagina “estrazione editore.html” non viene trovato nessuno span di classe "grid-6" e quindi viene eseguito il metodo impostaNome;

    Invece nella pagina “prima pagina.html” lo span di classe "grid-6" viene trovato e quindi il metodo impostaNome non viene eseguito.

    Prova tranquillamente…

  • Re: Disabilitare script in base a condizione

    Sì, questo codice infatti avevo utilizzato in Autofill (ora anche in TamperMonkey), ma non viene mai eseguito. Non so se sono stato chiaro, comunque lo script deve essere eseguito o non eseguito solo dalla pagina “Estrazione editore” in base ad una determinata condizione da trovare nella “Prima pagina”, ovvero la presenza o meno della scritta “Editore moderno” (sotto l'intestazione “Persone, enti e famiglie”, quindi in “fieldset.legami_tito”): se presente lo script non va eseguito, se assente va eseguito. Peraltro mi sembra che la classe classe "grid-6" sia sempre presente nella prima pagina anche in Tipo data, per esempio, quindi non può non essere presente.   

  • Re: Disabilitare script in base a condizione

    In effetti, non eri stato molto chiaro. Facciamo così:

    Nella “prima pagina.html” gli metti uno script come questo che, se trova “Editore moderno”, setta una variabile locale:

    (function() {
        'use strict';
    
        var elencoLabel = document.querySelectorAll("span.grid-6");
        if (elencoLabel.length > 8)
        {
            localStorage.removeItem("voce");
            if (elencoLabel[8].innerText == "Editore moderno")
            {
                localStorage.setItem("voce","Editore moderno");        
            }
        }
    
    })();

    Nella pagina “estrazione editore.html” gli metti invece questo altro script, che si occupa di leggere la variabile locale settata prima:

    (function() {
        'use strict';
    
        function getNome(tmp) {
    
        var idx = tmp.indexOf('. ((');
    
        if(idx > -1){
        tmp = tmp.substr(0, idx);
        }
    
        tmp = tmp.split('. - ');
    
        switch(tmp.length){
        case 3:
        tmp = tmp[1];
        break;
        case 4:
        tmp = tmp[2];
        break;
        default:
        tmp = "";
        break;
        }
    
        if(tmp !== ''){
            tmp = tmp.substr(tmp.indexOf(' : ') + 2);
            console.log(tmp);
            if(tmp.indexOf('.') != -1 && tmp.split('.').length == 2){
                tmp = tmp.substr(tmp.indexOf('. ') + 1, tmp.indexOf(', ') -3);
                tmp = tmp.trim();
            }
            else {
                tmp = tmp.split(",")[0];
                tmp = tmp.trim();
            }
        }
        return tmp;
    }
    function impostaNome(tmp) {
        Array.from(document.querySelectorAll('article section.grid_container form div.grid-row label span')).filter( e => e.innerText.trim() === 'Nome')[0].parentNode.querySelector('input').value = tmp;
    }
    
    var elencoLabel = document.querySelectorAll("span.grid-6");
    if (elencoLabel.length < 8 )
    {    
        var miaVoce = localStorage.getItem("voce");    
        if (miaVoce == "Editore moderno")
        {        
            impostaNome(getNome(document.querySelector('div.meta.tito div.evidence.isbd').innerText));
        }
    }
    
    })();

    Vedi se adesso funziona…

  • Re: Disabilitare script in base a condizione

    Grazie Fabio, ma purtroppo non va in quanto l'editore non viene mai estratto, non si può risolvere?

  • Re: Disabilitare script in base a condizione

    Ciao, ho ripreso il tuo post: la variabile localStorage che avevo impostato negli script non persiste nel passaggio da “prima pagina” a “estrazione editore”, quindi non è possibile verificare, da parte della seconda pagina, l'esistenza della scritta “Editore moderno” nella prima pagina.

    Ho modificato gli script, utilizzando i cookie, e ho provato le pagine, utilizzando Tampermonkey con Firefox.

    Se nella prima pagina, sotto la scritta “Persone, enti e famiglie”, c'è scritto “Editore moderno”, lo script setta il cookie “voce”, assegnandogli il valore “Editore moderno”. Quando poi carichi la seconda pagina, se è presente il cookie “voce” e ha il valore “Editore moderno”, allora non fa niente, altrimenti imposta il nome eseguendo la tua parte di codice.

    Questo è lo script da inserire in “prima pagina”:

    (function() {
        'use strict';
    
        var elencoLabel = document.querySelectorAll("span.grid-6");
        if (elencoLabel.length > 8)
        {
            document.cookie = "voce=";
            if (elencoLabel[8].innerText == "Editore moderno")
            {            
               document.cookie = "voce=Editore moderno";
            }
        }
    
    })();

    Questo è lo script da inserire in “editore moderno”:

    (function() {
        'use strict';
    
        function getNome(tmp) {
    
        var idx = tmp.indexOf('. ((');
    
        if(idx > -1){
        tmp = tmp.substr(0, idx);
        }
    
        tmp = tmp.split('. - ');
    
        switch(tmp.length){
        case 3:
        tmp = tmp[1];
        break;
        case 4:
        tmp = tmp[2];
        break;
        default:
        tmp = "";
        break;
        }
    
        if(tmp !== ''){
            tmp = tmp.substr(tmp.indexOf(' : ') + 2);
            console.log(tmp);
            if(tmp.indexOf('.') != -1 && tmp.split('.').length == 2){
                tmp = tmp.substr(tmp.indexOf('. ') + 1, tmp.indexOf(', ') -3);
                tmp = tmp.trim();
            }
            else {
                tmp = tmp.split(",")[0];
                tmp = tmp.trim();
            }
        }
        return tmp;
    }
    function impostaNome(tmp) {
        Array.from(document.querySelectorAll('article section.grid_container form div.grid-row label span')).filter( e => e.innerText.trim() === 'Nome')[0].parentNode.querySelector('input').value = tmp;
    }
    
    var elencoLabel = document.querySelectorAll("span.grid-6");
    if (elencoLabel.length < 8 )
    {
        var mioCookie = document.cookie;
        var presente = mioCookie.indexOf("voce");
        if (presente > -1)
        {        
            var miaVoce = mioCookie.substring(presente+5,20);
            if (miaVoce != "Editore moderno")
            {            
                 impostaNome(getNome(document.querySelector('div.meta.tito div.evidence.isbd').innerText));
            }        
        }
        else
        {
            impostaNome(getNome(document.querySelector('div.meta.tito div.evidence.isbd').innerText));
        }    
    }
    
    })();
  • Re: Disabilitare script in base a condizione

    Grazie per la risposta Fabio, sembrerebbe un po' rognoso questo problema da risolvere! Ho provato sia con TamperMonkey che con Autofill. Stranamente con TamperMonkey non viene mai estratto l'editore, con Autofill invece viene sempre estratto l'editore, anche quando è già presente.  

  • Re: Disabilitare script in base a condizione

    Quello che io non so è: cosa fa la tua parte di codice, cioè le funzioni getNome e impostaNome? Prendono il nome da dove?

    E poi lo mettono nel campo Nome nella seconda pagina (estrazione editore.html)?

  • Re: Disabilitare script in base a condizione

    Le funzioni getNome e impostaNome
    prendono il nome (ovvero l'editore) dalla notizia bibliografica della pagina "Estrazione editore", in questo caso da:

    Zibaldone di pensieri / Giacomo Leopardi ; a cura di Fabiana Cacciapuoti ; con un preludio di Antonio Prete. - Nuova ed. tematica condotta sugli Indici leopardiani. - Milano : Feltrinelli, 2019. - LVI, 1231 p. : ill. ; 23 cm

    Quindi inseriscono l'editore ("Feltrinelli" in questo caso) nel campo "Nome" della stessa pagina "Estrazione editore". 
    Vorrei che questa operazione avvenisse in automatico solo una volta, poi manualmente inserirei nello stesso campo "nome" della pagine "Estrazione editore" i nomi degli autori, verificando dalla pagina precendente (sezione "Persone, enti e famiglie") la presenza o meno della stringa "Editore moderno".

  • Re: Disabilitare script in base a condizione

    Ciao, intanto mi sono accorto che dentro il file "estrazione editore.html" la voce “Feltrinelli” è gia presente come value del campo di input (nella riga 783), quindi me la sono ritrovata già inserita e non capivo perchè. Pertanto, prima di proseguire, andrebbe rimossa tutta la proprietà "value=Feltrinelli".

    Poi, ho visto che tampermonkey scrive i cookie, ma poi non li riesce a leggere. Quindi bisogna usare la funzione “GM_cookie” nella riga @grant dell'intestazione, così:

    // @grant        GM_cookie

    e poi modificare di conseguenza lo script da eseguire in "estrazione editore.html", in questo modo:

    // ==UserScript==
    // @name         Estrazione editore
    // @namespace    http://tampermonkey.net/
    // @version      0.1
    // @description  try to take over the world!
    // @author       You
    // @match        file:///D:/Javascript/estrazione%20editore.html
    // @icon         https://www.google.com/s2/favicons?sz=64&domain=undefined.
    // @grant        GM_cookie
    // ==/UserScript==
    
    (function() {
        'use strict';
    
        function getNome(tmp) {
    
        var idx = tmp.indexOf('. ((');
    
        if(idx > -1){
        tmp = tmp.substr(0, idx);
        }
    
        tmp = tmp.split('. - ');
    
        switch(tmp.length){
        case 3:
        tmp = tmp[1];
        break;
        case 4:
        tmp = tmp[2];
        break;
        default:
        tmp = "";
        break;
        }
    
        if(tmp !== ''){
            tmp = tmp.substr(tmp.indexOf(' : ') + 2);
            console.log(tmp);
            if(tmp.indexOf('.') != -1 && tmp.split('.').length == 2){
                tmp = tmp.substr(tmp.indexOf('. ') + 1, tmp.indexOf(', ') -3);
                tmp = tmp.trim();
            }
            else {
                tmp = tmp.split(",")[0];
                tmp = tmp.trim();
            }
        }
        return tmp;    
    }
    function impostaNome(tmp) {
        Array.from(document.querySelectorAll('article section.grid_container form div.grid-row label span')).filter( e => e.innerText.trim() === 'Nome')[0].parentNode.querySelector('input').value = tmp;
    }
    
    function prendiValore(mio) {
        return mio.value;
    }
    
    var elencoLabel = document.querySelectorAll("span.grid-6");
    if (elencoLabel.length < 8 ) {
        GM_cookie.list({name: "voce"}, (mioCookie, error) => {
        if (!error) {
            var tuttiValori = mioCookie.map(prendiValore);
            var presente = tuttiValori.indexOf("Editore moderno");
            if (presente == -1)
            {
               impostaNome(getNome(document.querySelector('div.meta.tito div.evidence.isbd').innerText));
            }
        }
        else {
            console.log(error);
        }
      });
    }
    
    })();

    Per non sbagliare, ti riporto anche lo script relativo alla pagina "prima pagina".html" che ho modificato, inserendo un'attesa di due secondi, altrimenti, a volte, il cookie non veniva creato:

    // ==UserScript==
    // @name         Prima pagina
    // @namespace    http://tampermonkey.net/
    // @version      0.1
    // @description  try to take over the world!
    // @author       You
    // @match        file:///D:/Javascript/prima%20pagina.html
    // @icon         https://www.google.com/s2/favicons?sz=64&domain=undefined.
    // @grant        none
    // ==/UserScript==
    
    (function() {
        'use strict';
        window.setTimeout(generaCookie,2000);
    
     function generaCookie() {    
         var elencoLabel = document.querySelectorAll("span.grid-6");
        if (elencoLabel.length > 8)
        {
            document.cookie = "voce=";
            if (elencoLabel[8].innerText == "Editore moderno")
            {
               document.cookie = "voce=Editore moderno";
            }
        }
    }
    })();

    Ricapitolando: se nella prima pagina, sotto la voce "Enti, istituzioni e famiglie" è presente la scritta “Editore moderno” allora, utilizzando lo script per la prima pagina (che avevo già messo nel post precedente), viene registrato un cookie di nome “voce”, col valore “Editore moderno”. Quando poi, si va nella seconda pagina (estrazione editore), se fra i cookie di nome "voce" non è presente il valore “Editore moderno”, allora col tuo codice viene impostato il campo Nome con la scritta “Feltrinelli”.

    Buon divertimento

Devi accedere o registrarti per scrivere nel forum
51 risposte