Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 19
  1. #1

    Selezionare radio button

    Buongiorno, potreste aiutarmi? Con uno userscript sto cercando di selezionare un radio button per le pagine dei tre esempi sottostanti (pagine salvate, le originali sono protette), senza considerare il valore ID specifico, dato che ho molte altre pagine. Suppongo quindi che il punto di partenza possa essere qualcosa del genere:
    codice:
    const selectedValue = document.querySelector('input[name="selezionato"]:checked').value;

    Dovrebbero essere selezionati questi pulsanti secondo quest'ordine di priorità:

    1) Quando i termini "Collocazione" e "Inventari collegati" sono sulla stessa riga <tr>, deve essere selezionato il radio button accanto, come in queste due pagine web: link pagine web (qui uno screenshot per i due esempi);


    2) Quando il primo caso non si verifica e i termini "FA PARTE DI" e "Monografia" sono sulla stessa riga <tr>, deve essere selezionato il radio button accanto, come in questa pagina (vedi anche screenshot);


    3) Quando i primi due casi non si verificano e il termine "Monografia" è accanto a un radio button, allora questo deve essere selezionato, come in questa pagina (vedi anche screenshot).

    Quindi il pulsante accanto a "Collana" non dovrebbe mai essere selezionato.

    Ho provato questo script per le prime due condizioni, ma non funziona e non so se è il modo giusto per selezionare una riga e come soddisfare la terza condizione:
    codice:
    const selectedInput = document.querySelector('input[name="selezionato"]:checked');
    var rows = document.getElementsByTagName('tr');
    for (var i = 0; i < rows.length; i++) {
      var rowContent = rows[i].textContent || rows[i].innerText;
        if (rowContent.includes('Inventari collegati')) {
    selectedInput.value;
      }
    if (rowContent.includes('FA PARTE DI') && rowContent.includes('Monografia')) {
    selectedInput.value;
    }
    }

    Grazie mille!
    Ultima modifica di Annuitcoeptis; 17-05-2023 a 11:26

  2. #2
    Moderatore di Javascript L'avatar di ciro78
    Registrato dal
    Sep 2000
    residenza
    Napoli
    Messaggi
    8,514
    ciao, ti consiglio di fare una pagina di esempio. così non è molto pratico.
    Ciro Marotta - Programmatore JAVA - PHP
    Preferisco un fallimento alle mie condizioni che un successo alle condizioni altrui.


  3. #3
    Buongiorno, avevo inserito gli esempi, li riposto:

    Primo caso: PaginaWeb1 e PaginaWeb2 (screenshot 1 e screenshot 2)
    Secondo caso: PaginaWeb3 (screenshot3)
    Terzo caso: PaginaWeb4 (screenshot 4)

    Ho riprovato con questo script, ma non funge:
    codice:
    function selezionePulsante() {
        var rows = document.getElementsByTagName('tr');
        for (var i = 0; i < rows.length; i++) {
            var rowContent = rows[i].textContent || rows[i].innerText;
            if (rowContent.includes('Inventari collegati')) {
                rows[i].querySelector('input[name="selezionato"]').checked = true;
                return; 
            }
        } 
        for (var i = 0; i < rows.length; i++) {
            var rowContent = rows[i].textContent || rows[i].innerText;
            if (rowContent.includes('FA PARTE DI') && rowContent.includes('Monografia')) {
                rows[i].querySelector('input[name="selezionato"]').checked = true;
                return; 
            }
        }
    
    
        for (var i = 0; i < rows.length; i++) {
            var rowContent = rows[i].textContent || rows[i].innerText;
            if (rowContent.includes('Monografia') && !rowContent.includes('Collana')) {
                rows[i].querySelector('input[name="selezionato"]').checked = true;
                return; 
            }
        }
    }


    P.S. Ho provato a sostituire il TagName:
    codice:
    var rows = document.getElementsByTagName('tr.nopaddingleft');

    ma il risultato non cambia. Grazie!
    Ultima modifica di Annuitcoeptis; 18-05-2023 a 09:32

  4. #4
    Lo script funziona bene per le prime due condizioni, ma non funziona per il terzo caso.
    Ultima modifica di Annuitcoeptis; 18-05-2023 a 12:42

  5. #5
    RISOLTO

    C'era un piccolo problema con i termini di ricerca. Grazie per la disponibilità.
    Ultima modifica di Annuitcoeptis; 18-05-2023 a 13:27

  6. #6
    Moderatore di CSS L'avatar di KillerWorm
    Registrato dal
    Apr 2004
    Messaggi
    5,771
    Ciao, hai effettuato varie prove e modifiche, sarebbe utile vedere lo script che attualmente stai usando
    Installa Forum HTML.it Toolset per una fruizione ottimale del Forum

  7. #7
    Of course, non so se è il massimo, ma funziona:

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

  8. #8
    Moderatore di CSS L'avatar di KillerWorm
    Registrato dal
    Apr 2004
    Messaggi
    5,771
    Potrebbe essere ottimizzato.

    1) Questo selettore trova tutte le righe dell'intera pagina, indistintamente per le varie tabelle presenti:
    codice:
    var rows = document.getElementsByTagName('tr');
    Nella pagina vedo infatti che ci sono varie tabelle: una per l'intestazione, una per le opzioni del form di inserimento nuovo inventario, altre nascoste, e poi quella interessata per la quale dovrebbe agire lo script. Quest'ultima inoltre ha delle tabelle annidate, per cui ogni riga di fatto è una tabella e ogni tabella ha chiaramente delle altre righe.

    Quel selettore quindi restituisce una collezione di svariati <tr> che sono poi esaminati nel ciclo; ma la maggior parte di questi elementi non c'è motivo di esaminarli, anzi potrebbero generare dei falsi positivi (come penso sia accaduto inizialmente per la tua terza condizione).

    Sarebbe meglio "aggiustare" il selettore per ottenere una collezione più pertinente di elementi.
    Quote Originariamente inviata da Annuitcoeptis
    P.S. Ho provato a sostituire il TagName:
    codice:
    var rows = document.getElementsByTagName('tr.nopaddingleft');
    Se questo funzionasse, potrebbe già andare meglio, ma il problema qui è il metodo usato; infatti getElementsByTagName() accetta solo il nome del tag e nient'altro, non puoi quindi passare una query in quel modo. Tuttalpiù sarebbe meglio usare querySelectorAll().

    Giusto un consiglio: quando usi un particolare metodo, più che tirare a caso sperando funzioni, sarebbe bene consultare sempre la relativa documentazione, almeno fino a quando non acquisisci una certa dimestichezza che ti permette di usarlo con cognizione di causa.

    In questo caso può quindi essere meglio usare querySelectorAll() passando magari una query per selezionare in modo più specifico solo gli elementi interessati.

    Non so se "tr.nopaddingleft" possa andare bene, puoi dirmelo tu. Personalmente farei qualche log per capire se è adatto per i vari casi da considerare.

    2) Evitare codice ridondante (parte 1).
    Perché inserire 3 volte uno stesso identico ciclo?
    Non sarebbe più sensato inserire le 3 condizioni tutte in uno stesso ciclo in modo che questo sia eseguito una sola volta?

    codice:
    for (let i = 0; i < rows.length; i++){
      const rowContent = rows[i].textContent || rows[i].innerText;
      // Qui le condizioni
      // ...
    }
    3) Evitare codice ridondante (parte 2).
    Ancora, per ciascuna delle tre diverse condizioni, quando verificate, viene eseguita una stessa identica azione.
    In questo caso le tre condizioni possono essere accorpate in un unico "if" usando l'operatore || (OR).

    Avrai quindi uno schema del genere:
    codice:
    if (
      (condizione_1) ||
      (condizione_2) ||
      (condizione_3)
    ){
      // Azioni
    }
    Le diverse condizioni saranno lette una di seguito all'altra. Se una di queste è verificata, nell'ordine di lettura, allora sarà eseguita l'azione.
    In questo modo eviti di riscrivere la stessa azione più volte e rendi il codice più facile da gestire/modificare.

    4) Vedo che recuperi il contenuto testuale di ciascuna riga attraverso la proprietà textContent e, come ripiego, con innerText.
    codice:
    var rowContent = rows[i].textContent || rows[i].innerText;
    Ci sono motivi specifici perché stai usando una impostazione del genere?

    Personalmente, in questo caso, userei solo innerText dal momento che questo restituisce solo il testo visibile e "leggibile dall'uomo", a differenza di textContent che restituisce anche il testo in elementi nascosti e in elementi non propriamente testuali (script, style).

    In conclusione:
    non fornisco una soluzione pronta (ad ogni modo hai già risolto da te) ma, se è tuo interesse, puoi seguire quanto indicato per cercare di ottimizzare lo script.

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

  9. #9
    Grazie mille, KillerWorm, per le tue spiegazioni sempre accurate e istruttive! Ora spero di usare meglio il metodo getElementsByTagName, che accetta solo tag names e ho compreso abbastanza la differenza tra innerText e textContent, anche da questa lettura.

    Ho corretto lo script secondo i punti 1) (usando document.querySelectorAll('tr.nopaddingleft')) e 4), tuttavia con la modifica del punto 3) (e quindi 4) lo script, non so perché, restituisce risultati sballati, selezionando un pulsante anziché un altro.

    Suppongo quindi che al netto dei punti 1) e 4) lo script possa restare invariato.

    Grazie ancora!
    Ultima modifica di Annuitcoeptis; 19-05-2023 a 10:12

  10. #10
    Moderatore di CSS L'avatar di KillerWorm
    Registrato dal
    Apr 2004
    Messaggi
    5,771
    Bene

    Quote Originariamente inviata da Annuitcoeptis
    lo script, non so perché, restituisce risultati sballati,
    Non vedo cosa hai fatto, prova a postare lo script con le tue attuali modifiche.

    Quote Originariamente inviata da Annuitcoeptis
    Immagino quindi che al netto dei punti 1) e 4) lo script possa restare invariato.
    Teoricamente sì, ognuno è un'ottimizzazione a sé. Bisogna capire comunque come hai applicato i singoli punti per valutare la corretta funzionalità nel contesto.
    Installa Forum HTML.it Toolset per una fruizione ottimale del Forum

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.