
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.