Pagina 2 di 2 primaprima 1 2
Visualizzazione dei risultati da 11 a 19 su 19
  1. #11
    Ho utilizzato questo script:
    codice:
    function selezionePulsante() {
        var rows = document.querySelectorAll('tr.nopaddingleft');
        for (let i = 0; i < rows.length; i++) {
            const rowContent = rows[i].innerText;
            if ((rowContent.includes('Inventari collegati') && !rowContent.includes('Collana')) || (rowContent.includes('FA PARTE DI') && rowContent.includes('Monografia')) || (rowContent.includes('Monografia') && rowContent.includes('Bid SBN'))) {
                rows[i].querySelector('input[name="selezionato"]').checked = true;
                return;
            }
        }
    }
    Ultima modifica di Annuitcoeptis; 19-05-2023 a 10:44

  2. #12
    Moderatore di CSS L'avatar di KillerWorm
    Registrato dal
    Apr 2004
    Messaggi
    5,771
    Fammi capire, questo è lo script che ti funziona o è quello che restituisce risultati sballati?

    Puoi postarli entrambi per avere un confronto?

    EDIT:
    Puoi indicare anche quali sono i risultati sballati e cosa invece ti aspetti?
    Ultima modifica di KillerWorm; 19-05-2023 a 11:13
    Installa Forum HTML.it Toolset per una fruizione ottimale del Forum

  3. #13
    Script funzionante:
    codice:
    function selezionePulsante() {
            var rows = document.querySelectorAll('tr.nopaddingleft');
            for (let i = 0; i < rows.length; i++) {
                const rowContent = rows[i].innerText;
                if (rowContent.includes('Inventari collegati') && !rowContent.includes('Collana')) {
                    rows[i].querySelector('input[name="selezionato"]').checked = true;
                    return;
                }
            }
            for (let i = 0; i < rows.length; i++) {
                const rowContent = rows[i].innerText;
                if (rowContent.includes('FA PARTE DI') && rowContent.includes('Monografia')) {
                    rows[i].querySelector('input[name="selezionato"]').checked = true;
                    return;
                }
            }
            for (let i = 0; i < rows.length; i++) {
                const rowContent = rows[i].innerText;
                if (rowContent.includes('Monografia') && rowContent.includes('Bid SBN')) {
                    rows[i].querySelector('input[name="selezionato"]').checked = true;
                    return;
                }
            }
        }


    Script non funzionante:
    codice:
    function selezionePulsante() {
        var rows = document.querySelectorAll('tr.nopaddingleft');
        for (let i = 0; i < rows.length; i++) {
            const rowContent = rows[i].innerText;
            if ((rowContent.includes('Inventari collegati') && !rowContent.includes('Collana')) || (rowContent.includes('FA PARTE DI') && rowContent.includes('Monografia')) || (rowContent.includes('Monografia') && rowContent.includes('Bid SBN'))) {
                rows[i].querySelector('input[name="selezionato"]').checked = true;
                return;
            }
        }
    }

    Qui posto uno dei risultati dell'ultimo script, per esempio, dove il pulsante selezionato non corrisponde alla riga con la dicitura "Inventari collegati".
    Ultima modifica di Annuitcoeptis; 19-05-2023 a 11:45

  4. #14
    Moderatore di CSS L'avatar di KillerWorm
    Registrato dal
    Apr 2004
    Messaggi
    5,771
    Perfetto, ho visto il problema, è una questione di priorità nell'esecuzione delle condizioni.

    Spiego brevemente:

    - Nello script funzionante (ma poco ottimizzato) il fatto di avere un ciclo distinto per ciascuna delle condizioni fa in modo di valutare ciascuna finché il relativo ciclo non è terminato. In questo caso è possibile quindi che una delle varie righe sia verificata per la singola condizione.

    Avviene quindi una condizione per ognuno dei tre cicli.

    - Nello script ottimizzato (ma poco funzionante) le tre condizioni sono eseguite all'interno dello stesso ciclo, per cui è possibile che una di queste sia verificata prima che il ciclo finisca, anche se la condizione precedente "potrebbe" essere verificata per una tra le righe successive.

    Avvengono quindi 3 condizioni per ogni riga in un unico ciclo.

    Questo aspetto in effetti non lo avevo considerato

    Ora, l'ideale sarebbe ottenere uno script "ottimizzato e funzionante" ma non so se sia possibile...

    Per il momento tieni per buono quello funzionante, nel mentre posso provare ad aggiustare quello ottimizzato per capire se si può utilizzare comunque.
    Installa Forum HTML.it Toolset per una fruizione ottimale del Forum

  5. #15
    Okay, avevo fiutato che fosse una questione di priorità...

    Andando avanti con gli esempi mi accorgo che quel:
    codice:
    var rows = document.getElementsByTagName('tr');

    andava bene, perchè una pagina come questa ha un <tr> diverso da tr.nopaddingleft, quindi non ottimizza utilizzare il comando querySelectorAll().
    Ultima modifica di Annuitcoeptis; 19-05-2023 a 13:49

  6. #16
    Moderatore di CSS L'avatar di KillerWorm
    Registrato dal
    Apr 2004
    Messaggi
    5,771
    Quote Originariamente inviata da Annuitcoeptis
    Andando avanti con gli esempi mi accorgo che quel:
    ...
    andava bene
    E' bene fare più test possibili nelle varie eventuali pagine su cui deve agire lo script, così da poter avere quante più informazioni utili per capire come meglio impostarlo e ottimizzarlo.

    Continuo a restare dell'idea che sia meglio usare un selettore più specifico piuttosto che eseguire il ciclo sulla totalità delle righe nella pagina.

    Ora, con getElementsByTagName('tr') in quest'ultima pagina linkata ottieni 24 elementi da ciclare e analizzare attraverso più passaggi con le varie condizioni.

    Sia chiaro, a livello di tempo di esecuzione, in un contesto del genere si parla pur sempre di differenze minime, forse qualche decimo o centesimo di secondo; ma ritengo che se può essere effettuata una qualsiasi ottimizzazione (nei limiti del possibile e del ragionevole), perché non dovrebbe essere fatta?

    La stessa operazione usando querySelectorAll() con un selettore più specifico, potrebbe rilevare giusto 2 o 3 righe da ciclare e analizzare.
    Certo, bisogna capire come meglio impostare il selettore, e per tale motivo vale quanto detto: è necessario testare lo script su un certo numero di pagine prima di poter mettere a punto lo script ed essere sicuri che funzioni correttamente.


    Ho rielaborato un po' di cose mantenendo comunque un unico ciclo e organizzando meglio la logica delle condizioni.

    Qui lo script rielaborato:
    codice:
    function selezionePulsante(){
        const rows = document.querySelectorAll('table.detail tr table.detail tr:first-child');
        let rowDetected;
        for (let i = 0, row; row = rows[i]; i++){
            const cells = row.querySelectorAll('td');
            if (cells[2].innerText === 'Collana') continue;
            if (cells[5]?.innerText.includes('Inventari collegati')){
                rowDetected = row;
                break;
            }
            if (cells[1].innerText === 'FA PARTE DI'){
                rowDetected = row;
                continue;
            }
            if (!rowDetected && cells[2].innerText === 'Monografia'){
                rowDetected = row;
                continue;
            }
        }
        if (rowDetected) rowDetected.querySelector('input[name="selezionato"]').checked = true;
    }

    Qui una versione dello STESSO SCRIPT ma con i vari commenti, giusto per comprendere la logica usata:

    codice:
    function selezionePulsante(){
        // Selettore specifico delle potenziali righe da considerare
        const rows = document.querySelectorAll('table.detail tr table.detail tr:first-child');
        // Riga rilevata, attraverso il ciclo, da una delle 3 condizioni secondo l'ordine di priorità
        let rowDetected;
        // Ciclo le righe interessate
        for (let i = 0, row; row = rows[i]; i++){
            // Celle della riga esaminata
            const cells = row.querySelectorAll('td');
            // Condizione preliminare. Non considero la riga se contiene 'Collana'
            if (cells[2].innerText === 'Collana') continue;
    
            // Condizione 1, rilevo la riga se contiene 'Inventari collegati', quindi interrompo il ciclo (non serve esaminare le righe restanti)
            if (cells[5]?.innerText.includes('Inventari collegati')){
                rowDetected = row;
                break;
            }
            
            // Condizione 2, rilevo la riga se contiene 'FA PARTE DI', quindi proseguo per determinare la priorità con la precedente condizione
            if (cells[1].innerText === 'FA PARTE DI'){
                rowDetected = row;
                continue;
            }
            
            // Condizione 3, rilevo la riga se contiene 'Monografia' e la precedente condizione non è ha già rilevato una,
            // quindi proseguo per determinare la priorità con le precedenti condizioni
            if (!rowDetected && cells[2].innerText === 'Monografia'){
                rowDetected = row;
                continue;
            }
        }
        // Se è stata rilevata una riga, spunto il relativo radio button
        if (rowDetected) rowDetected.querySelector('input[name="selezionato"]').checked = true;
    }



    Breve spiegazione

    Per selezionare le righe di partenza ho usato questo selettore: 'table.detail tr table.detail tr:first-child';

    Considera che ho posto le condizioni in modo da analizzare NON tutto il contenuto testuale della riga ma solo le celle specifiche che dovrebbero contenere quei dati.
    Per alcune, dove il testo dovrebbe essere statico, ho ritenuto meglio effettuare un confronto diretto di uguaglianza piuttosto che passare per il metodo includes().
    Questo sempre nell'ottica dell'ottimizzazione a livello di esecuzione.

    Attraverso il ciclo sono quindi analizzate le "potenziali righe". Sarà "selezionata" la riga che soddisfa le condizioni prese nell'ordine di priorità dalla prima all'ultima.
    Sostanzialmente ho individuato 4 condizioni, di cui la prima è preliminare ed esclude l'eventuale riga trovata. Ciascuna ha chiaramente priorità su quelle a seguire.

    - La condizione preliminare esclude le righe in cui è trovata la cella col dato "Collana", secondo quanto hai indicato:
    "il pulsante accanto a "Collana" non dovrebbe mai essere selezionato"

    In questo caso il ciclo prosegue con la verifica delle altre righe.

    - La condizione 1 verifica la presenza della cella con "Inventari collegati", quindi il ciclo si interrompe dal momento che questa è la massima priorità, secondo quanto hai indicato nel punto 1:
    "Quando i termini "Collocazione" e "Inventari collegati" sono sulla stessa riga"

    Mi pare di capire (anche dai tuoi script iniziali) che per questa condizione può essere considerato giusto il termine "Inventari collegati", mentre non serve considerare che ci sia anche "Collocazione" (forse perché i due dati sono sempre in coppia). Dammi eventuale conferma.

    - La condizione 2 verifica la presenza della cella col dato "FA PARTE DI". Se questa viene verificata, il ciclo continua comunque nell'eventualità che la prima condizione sia verificata su una delle seguenti righe. In tal caso sarà considerata appunto la riga che soddisfa la prima condizione, secondo quanto hai indicato nel punto 2:"Quando il primo caso non si verifica e i termini "FA PARTE DI" e "Monografia" sono sulla stessa riga"

    Anche in questo caso mi pare di capire che il termine "Monografia" possa essere tralasciato; nelle pagine esaminate vedo che è superfluo indicarlo in questa condizione perché se non c'è "Monografia" c'è "Collana" che però esclude la riga a priori attraverso la condizione preliminare.

    Nel caso, verifica se con "FA PARTE DI" possono esserci altri termini, oltre questi 2, per cui è necessario fare distinzione.

    - La condizione 3 verifica la presenza della cella col dato "Monografia" ma solo se non è stata rilevata ancora alcuna riga con la condizione 2. Si à quindi la priorità più bassa qualora tutte le altre condizioni non risultino soddisfatte fino a terminare il ciclo.




    Ho testato sulle 5 pagine finora considerate:

    https://myspace00000.w3spaces.com/fa...collegati.html
    https://myspace00000.w3spaces.com/mo...collegati.html
    https://myspace00000.w3spaces.com/fa...onografia.html
    https://myspace00000.w3spaces.com/monografia.html
    https://myspace00000.w3spaces.com/tr.html

    Mi pare faccia quanto richiesto, chiaramente ti chiedo conferma
    Inutile ripetere, verificalo anche con varie altre pagine.
    Installa Forum HTML.it Toolset per una fruizione ottimale del Forum

  7. #17
    Wao, tanta logica in questo script, Wittgenstein ti fa un baffo! Funziona molto bene finora e sicuramente lo preferirò al mio per per la sua maggiore efficienza, per quanto relativa. Confermo la bontà delle condizioni, quando tralasci i termini "Collocazione" per la prima istanza e "Monografia" per la seconda, che sembrerebbero essere superflui, fino ad eventuale prova contraria che potrebbe giungere da altre pagine. Quanto alla comprensione ci vorrà un po' per assimilarlo completamente... Grazie infinite!
    Ultima modifica di Annuitcoeptis; 19-05-2023 a 22:01

  8. #18
    Moderatore di CSS L'avatar di KillerWorm
    Registrato dal
    Apr 2004
    Messaggi
    5,771
    Bene
    Quote Originariamente inviata da Annuitcoeptis
    fino ad eventuale prova contraria che potrebbe giungere da altre pagine
    nel caso ci fosse bisogno di qualche aggiustatina fai sapere

    Quote Originariamente inviata da Annuitcoeptis
    Quanto alla comprensione ci vorrà un po' per assimilarlo completamente...
    Tranquillo, puoi studiarlo con tutta calma se vuoi ma non sentirti necessariamente obbligato a comprenderlo a fondo...
    onestamente fatico anche io a capire cosa ci ho messo dentro

    Buon proseguimento
    Installa Forum HTML.it Toolset per una fruizione ottimale del Forum

  9. #19
    Grazie ancora!

Tag per questa discussione

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.