Ho un semplicissimo javascript che uso per ridimensionare il testo (aumentare e diminuire le dimensioni), questo:
function createCookie(name,value,days) {
if (days) {
var date = new Date();
date.setTime(date.getTime()+(days*24*60*60*1000));
var expires = '; expires='+date.toGMTString();
}
else expires = '';
document.cookie = name+'='+value+expires+'; path=/';
}
function readCookie(name) {
var nameEQ = name + '=';
var ca = document.cookie.split(';');
for(var i=0;i < ca.length;i++) {
var c = ca[i];
while (c.charAt(0)==' ') c = c.substring(1,c.length);
if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
}
return null;
}
function setFontSize(size) {
var body = document.getElementsByTagName('body')[0];
var percentuale = "80%"; // default
if (size == 1) percentuale = "70%";
if (size == 2) percentuale = "80%";
if (size == 3) percentuale = "90%";
if (size == 4) percentuale = "100%";
if (size == 5) percentuale = "110%";
body.style.fontSize = percentuale;
createCookie('DevilFont',size,365);
}
window.onload = function() {
size = readCookie('DevilFont');
setFontSize(size);
}
Lo richiamo inserendo in page.tpl.php il classico:
Ora... il javascript per ridimensionare il testo funziona benissimo... solo che smettono di funzionare tutti gli altri inclusi in drupal (il ridimensionamento delle caselle di testo, la ricerca avanzata,etc.).
Perché? Dov'è che sbaglio?
Chiedo ai guru di drupal di aiutarmi (vi prego), perché per me è una funzione molto importante, ma ovviamente non posso utilizzarla se mi elimina tutti gli altri js (non posso nemmeno più aprire le opzioni quando creo una nuova pagina.
Sono ore che ci sbatto la testa, ma non riesco proprio a venirne a capo.
C'è un modo specifico per richiamare i js in drupal?
Ho dato un'occhiata al tema meta che ne fa largo uso, ma non mi sembra che usi un altro metodo. Oppure è colpa del codice del js?
Se sì, perché?
Attendo speranzoso una risposta.
Grazie.
Ok, abbiamo ristretto il campo... è la funzione window.onload che crea il conflitto.
window.onload = function() {
size = readCookie('DevilFont');
setFontSize(size);
}
C'è un modo per ricordargli di mantenere i font di una certa dimensione e aggirare il problema? Intendo, mantenendo tutto all'interno della cartella del tema?
------------------------
http://www.devilhouse.org
------------------------
Allora, girando sul sito di drupal.org ho trovato svariate discussioni su questo tema. Sinceramente non capisco perché si sia deciso di procedere in tal senso (c'è chi parla di bug, chi invece di scelta consapevole), con drupal non si può usare window.onload.
Nelle varie discussioni si dice di utilizzare la funzione AddLoadEvent... ma ancora non ne sono venuto a capo. Qualcuno di voi che magari se ne intende più di me di js (che mastico a malapena) mi potrebbe suggerire come convertire questo codice:
window.onload = function() {
size = readCookie('DevilFont');
setFontSize(size);
}
Utilizzando AddLoadEvent al posto di window.onload?
Io ci sto provando da ieri notte, ma non mi riesce proprio di farla funzionare. :(
Spero nel vostro aiuto (anche se, ovviamente, continuerò anche io a cercare di farla funzionare).
Un altra cosa, che sappiate, questo problema con window.onload c'è anche nella versione 5.0 oppure nella nuova versione si è risolto questo problema di conflitto con drupal e si può finalmente utilizzare un comando che semplifica di molto l'applicazione di quasi tutti i js?
------------------------
http://www.devilhouse.org
------------------------
Ho provato a installarmi in rete Drupal 5 rc1 per vedere se il problema era stato risolto (la speranza è l'ultima a morire) e mi sono accorto di una serie di cose strane.
Allora, per prima cosa, che mi sembra la più importante, con Firefox tutte le sezioni che usano javascript non funzionano (indipendentemente dal tema usato), rimangono semplicemente chiuse e non sono cliccabili (il che mi sembra un problema non da poco). In pratica hanno lo stesso comportamento che sto cercando di risolvere sulla 4.74 quando si usa window.onload, con la differenza che questo comportamento avviene con tutti i temi (dove non ho fatto nessuna modifica). Con Explorer, invece, le sezioni sono cliccabili e funzionano correttamente.
Domanda n.1
Qualcuno mi può confermare questo bug con firefox?
Il secondo punto è ancora più curioso. Ho riportato il tema che sto facendo sulla 474 sulla 5 e. sia con firefox che con explorer, i javascript di drupal non funzionano (anche levando il js che sto cercando di implementare e il link che lo richiama), ma invece di rimanere chiusi e non cliccabili (come accade usando firefox con tutti i temi meno il mio) rimangono aperti (e sempre non cliccabili), evento sicuramente migliore rispetto agli altri temi con firefox, ma fatto sicuramente curioso.
Curioso perché, seppur modificato, il mio tema parte dal bluemarine della 4.7.0. e non mi sembra di aver fatto modifiche che giustifichino questo comportamento.
Domanda n.2
A cosa può esser dovuto un tale comportamento?
Tirando le somme, comunque, il fatto che le opzioni mi rimangano aperte è un fatto positivo da un lato (in quanto potrei così utilizzare tranquillamente la funzione window.onload senza che il sito diventi inutilizzabile), però da un altro lato è negativo, in quanto con tutto aperto alcune sezioni risultano parecchio confusionarie e se io mi ci abituerei, penso che per gli utenti esterni potrebbe risultare disorientante nel momento in cui vanno ad aggiungere un contenuto. Poi, comunque, è evidente che c'è qualche bug e mi chiedevo se qualcuno ne era informato e aveva qualche informazione in merito.
all'evento onload la funzione in quel modo vai a sovrascrivere tutte le altre funzioni che sono state precedentemente caricate per quell'evento.
L'errore dunque non sta in Drupal ma nel modo in cui hai effettuato la chiamata a quella funzione Javascript.
Nella versione 4.6 c'era l'hook_onload richiamabile dal foglio php, dalla 4.7 in poi si è deciso di integrare una funzione javascript per gestire le chiamate all'evento onload in maniera corretta: addLoadEvent().
Rifacendomi alla documentazione dovresti eliminare l'assegnazione all'evento onload e sostituirlo con questa porzione di codice:
function nomefunz() {
size = readCookie('DevilFont');
setFontSize(size);
}
addLoadEvent(nomefunz);
da mettere tra i tag script o in qualche file .js che viene caricato all'avvio.
Ti ringrazio molto, ma non capisco perché... continua a non funzionarmi (né con la 4.7 né con la 5).
Con la 5, fra l'altro, hanno cambiato ancora una volta la sintassi che è diventata
$(document).ready(tuafunzione);
Per la cronaca, con la 5, non mi funziona nemmeno questa.
Non riesco veramente a capire... ci sto scapocciando non poco.
Per quanto riguarda, invece, i bug che ho segnalato sulla 5, ti risultano?
Grazie ancora.:)
------------------------
http://www.devilhouse.org
------------------------
Alla fine ce l'ho fatta!
Allora, prima di tutto premetto che quello che sto per scrivere è valido solo per la versione 5.
Io sto usando la rc2, ma suppongo che richiamando tutti i files .js, che la versione rc1 non richiama per via di un bug (almeno con firefox), funzioni anche con la rc1.
Per rendere più pratico è semplice da comprendere continuo a utilizzare lo script di prima.
Per ovviare all'impossibilità di utilizzare window.onload (che va in conflitto con i js richiamati da drupal), con la versione 5 è possibile utilizzare jquery.js (che risiede nella cartella misc del vostro drupal) e la funzione $(document).ready(function ().
In pratica è molto semplice.
Per convertire la funzione che volevo convertire, ovvero:
window.onload = function() {
size = readCookie('DevilFont');
setFontSize(size);
}
basta cambiarla in:
$(document).ready(function () {
size = readCookie('DevilFont');
setFontSize(size);
});
La funzione, ovviamente, possiamo utilizzarla dentro un js esterno, oppure all'interno del file stesso (per es. page.tpl.php) tramite il tag .
Ora, però, all'interno del files che ci interessa (nel mio caso page.tpl.php) dobbiamo richiamare il file jquery.js perché drupal richiama i files js del suo core solamente quando questi sono necessari (per es. nella pagina di ricerca o quando andiamo a creare una pagina) e non in tutte le pagine.
Per cui nell'head del nostro sito (sempre page.tpl.php) andremo a scrivere:
e il gioco è fatto. :)
L'unico inconveniente di tutto ciò, ma è solo un fatto di forma (non crea nessuna invalidazione, nessun conflitto e nessun errore), è che nelle pagine in cui drupal richiama i files js avremo nell'head del sito il file jquery.js richiamato due volte.
------------------------
http://www.devilhouse.org
------------------------
Nella versione 5 il problema è stato risolto alla base. Con l'avvento di jquery nel core di drupal, tutti i comandi dello stesso core sono stati tradotti in stringhe per jquery. Per questo motivo ora utilizzare window.onload non genera più nessun tipo di conflitto. :)