[OZone logo]
cerca   
arrowHome arrow UserJS sabato, 31 luglio 2010  
Menu Principale
Home
Calendario Eventi
Tutorials
UserJS
FAQ
Scarica Opera
OZ Forum
OZ Forum (embed)
OZone Download Area
Web links
RSS Feeds
Cerca in OZ
Risorse esterne
my.opera forums
Opera developer tools
Language files per Opera
Traduzione italiana di Opera
nonTroppo Wiki
UserJS.org
Ultime notizie
Get Opera Mini - Super fast and free
UserJS
Indice articolo
UserJS
Cosa possono fare
Esempi di utilizzo

Esempi di utilizzo

Override di variabili specifiche o di funzioni

Agli User Js è permesso l'override di variabili e funzioni stabilite da altri script su una pagina attraverso i metodi defineMagicVariable e defineMagicFunction
Per esempio se un sito non identifica correttamente Opera e cerca di far eseguire del codice studiato per una altro browser:


var ie = document.all;

Ecco allora che uno User Js può compiere l'override di questa istruzione:
window.opera.defineMagicVariable( 'ie', function () { return 0; }, null );

Quando una pagina cerca di accedere al valore della variabile  viene invece attivata la funzione e qualunque valore restituito viene usato al posto del valore iniziale della variabile.

Script in caricamento
Per individuare quando stanno per essere caricati, attivati od interpretati degli scirpt si può usare il metodo

 

window.opera.addEventListener.


Gli User Js possono sfruttare l'evento BeforeScript per riconoscere quando uno script della pagina sta per essere interpretato dal motere JavaScript; in caso i contenuti dello script possono essere riscritti o bloccati prima dell'interpretazione.
Per esempio se uno script sta paragonando un attributo non esistente con null:

 

 

if( node.getAttribute('myattribute') != null ) {

 


Questi due non dovrebbero mai equivalersi dato che getAttibute dovrebbe restituire una stringa blank; alcuni browser incorrettamente restituiscono un null.
Il risultato è che lo script fallisce in Opera che, correttamente, restituisce una stringa blank. Per evitare questo inconveniente uno User Js può individuare quando lo script sta per essere intepretato e riscriverlo rimuovendo il paragone che, di fatto, non è necessario, con questo tipo di dichiarazione:

if( location.hostname.indexOf('example.com') != -1 ) {
  window.opera.addEventListener(
    'BeforeScript',
    function (e) {
      e.element.text = e.element.text.replace(/!=\s*null/,'');
    },
    false
  );
}


Se una pagina sta caricando un particolare script esterno che causa prblemi si può utilizzare il 'BeforeExternalScript' per impedirne il caricamento in Opera:

if( location.hostname.indexOf('example.com') != -1 ) {
  window.opera.addEventListener(
    'BeforeExternalScript',
    function (e) {
      if( e.element.getAttribute('src').match(/problem\/script\.js$/) ) {
        e.preventDefault();
      }
    },
    false
  );
}


Override di eventi e Handler di eventi
User Js può utilizzare eventi 'BeforeEvent.type' per individuare quando l'evento di uno script sta per aver luogo anche se nessuno script della pagina è in ascolto per quesl tale evento. Si può utilizzare ad esempio per rivolgersi a specifici tipi di evento come, ad esempio, 'BeforeEvent.click'.

Si può utilizzare 'BeforeEvent' anche da solo per individuare eventi di qualunque tipologia. Questo non funziona in Opera 8 se siete in attesa di un più specifico 'BeforeEvent.type'. Ad esempio che si attende un 'BeforeEvent.click', non si attiverà alcun 'BeforeEvent' per eventi legati a cliccate di mouse. Dato che 'BeforeEvent' può segnare la presenza di una certa quantità di eventi, usarlo in questo modo può avere influenze sulla performance.
Per impedire a script di fare il detect di eventi onload si può usare 'BeforeEvent.load' per cancellarli. Si faccia attenzione dato che onload accende anche altri elementi, come immagii, e lo script dovrebbe controllare se il comando sia valido per tutto il documenti:

 

 

if( location.hostname.indexOf('example.com') != -1 ) {
  window.opera.addEventListener('BeforeEvent.load',function (e) {
    //check that it is the page loading, not just an image
    if( e.event.target instanceof Document ) {
      e.preventDefault();
    }
  },false);
}


In molti casi gli eventi 'BeforeEventListener' possono essere utili dato che si attivano solo se uno script sulla pagina è in attesa di quegli eventi e forniscono accesso all'oggetto dell'evento e alla funzione event handler. Gli eventi possono essere cancellati con preventDefault

Questi eventi possono anche essere individuati con più precisione con 'BeforeEventListener.type', nello stesso modo in cui si può usare 'BeforeEvent.type' piuttosto che 'BeforeEvent'.
Per esempio, per evitare che uno script monitori i movimenti di mouse:

if( location.hostname.indexOf('example.com') != -1 ) {
  window.opera.addEventListener(
    'BeforeEventListener.mousemove',
    function (e) {
      e.preventDefault();
    },
    false
  );
}

 


Si può anche selezionare con più preceisione la funzionalità che si vuole rimuovere, nell'esempio che segue User Js controlla se l'event handler è la funzione 'myMouseTrail' e quindi altera l'oggetto dell'evento fingendo che la posizione del mouse sia in cima alla pagina:

if( location.hostname.indexOf('example.com') != -1 ) {
  window.opera.addEventListener(
  'BeforeEventListener.mousemove',
    function (e) {
      if( e.listener == moveMouseTrail ) {
        e.event.clientY = 0;
        e.event.pageY = 0;
      }
    },
    false
  );
}


L'evento 'AfterEvent' permette a User Js di controllare se uno script sulla pgina abbia cancellato un azione: quando sia stata impedita un'azione User Js può evitare la cancellazione e permettere l'azione.
Per esempio nella sottomissione di un form l'azione prestabilità è, di fatto, l'invio dell'informazione e il recupero di una nuova pagina dal server. Se uno script sulla pagina intercetta l'evento di invio dell'informazione può validare le informazioni del form e permetterne l'invio solo se ha passato la validazione. Se uno script di validazione per errore dice che il form non è stato completato correttamente e quindi non consente di procedere, uno User Js può capire cosa sta accadendo ed impedire l'azione dello script validatore:

 

 

if( location.hostname.indexOf('example.com') != -1 ) {
  window.opera.addEventListener(
    'AfterEvent.submit',
    function (e) {
      if( e.eventCancelled ) {
        //the script has tried to stop the form submission
        if( confirm( 'Submission was prevented. Submit anyway?' ) ) {
          //prevent the script from preventing the form submission
          e.preventDefault();
        }
      }
    },
    false
  );
}

 


JavaScript URLs
Le pagine possono anche usare URL dei JavaScript per farli partire, ad esempio inserendoli nell'attributo HREF di un link o nell'attrobuto TARGET di un form. Uno User JavaScript può individuare questo e impedirlo o riscrivere lo script.
Questo riguarda anche i bookmarklet che usano il protocollo javascript:

Ad esempio se una pagina usa una URL di JavaScript per aprire una nuova finestra lo User Js attraverso l'evento 'BeforeJavascriptURL' può riscrivere in modo tale che compaia una richiesta di conferma prima di aprire la nuova finestra

if( location.hostname.indexOf('example.com') != -1 ) {
  window.opera.addEventListener(
    'BeforeJavascriptURL',
    function (e) {
      if( e.source.indexOf('window.open') != -1 ) {
        //rewrite the script to confirm before opening windows
        e.source = e.source.replace(
          /window\.open/g,
          'if( confirm(\'Allow window to open?\') ) window.open'
        );
      }
    },
    false
  );
}


URL Javascript possono anche restituire un valore ed una pagina lo potrebbe utilizzare al fine si riscrivere il proiprio contenuto ma, talvolta può accadere che il valore sia sbagliato o riscriva erroneamente la pagina: uno User Js può intercettare il valore usando l'evento 'AfterJavascriptURL' e far comparire una finestra di dialogo richiedendo la conferma prima di inserire il nuovo contenuto. Se si vuole si può anche riscrivere il contenuto a piacimento.

 

if( location.hostname.indexOf('example.com') != -1 ) {
  window.opera.addEventListener(
    'AfterJavascriptURL',
    function (e) {
      if( typeof( e.returnValue ) == 'string' ) {
        if( confirm('Overwrite page?') ) {
          e.returnValue += 'Changed by User JavaScript';
        } else {
          e.preventDefault();
        }
      }
    },
    false
  );
}

Script normali ed eventi
Gli User Js non devo necessariamente appoggiarsi ad eventi speciali ed accettano anche lo scripting normale. Ad esempio per far comparire un avviso ad ogni pagina che si visita che specifichic quale modalità di rendering sta usando Opera (QuirksMode o CSS1Compat), si potrebbe fare così:

 

 

document.addEventListener(
  'load',
  function (e) {
    if( !document.body ) { return; }
    var mydiv = document.createElement('div');
    mydiv.style.position = 'fixed';
    mydiv.style.top = '0px';
    mydiv.style.right = '0px';
    mydiv.style.border = '1px solid #000';
    mydiv.style.backgroundColor = '#fff';
    mydiv.style.color = '#000';
    mydiv.appendChild(document.createTextNode(document.compatMode))
    document.body.appendChild(mydiv);
  },
  false
);


Script Greasemonkey

Opera può utilizzare anche molti Script Gresemonkey che sono studiati per l'estensione Gresemonkey dei browser Mozilla. Per far capire ad Opera che uno script usa le regole Greasemonkey, il nome dellos cript deve finire in '.user.js'. Gli script di questo tipo vengono gestiti in modo leggermente diverso dagli altri (così da essere compatibili con gli script esistenti):
non possono usare window.opera.addEventListener o metodi associati o funzioni emagiche e variabili.
Vengono eseguiti solo al completo caricamento della pagina, dopo la creazione del DOM ma prima di far funzionare qualunque handler di onload che sia stato stabilito.

A casua di questo diverso funzionamento spesso gli script Greasemonkeu non sono in grado di correggere errori o problemi finché non si siano manifestati. Di conseguenza questi script sono preferibili per apportare migliorie piuttosto che per risolvere script problematici.

Anche se è possibile usare il normale metodo di identificazione di una pagina gli script Greasemonkey di solito usano il blocco di commento ==UserScript== per specificare gli indirizzi delle pagine su cui agire. In genere il codice JavaSCript è contenuto nel file stesso, ma non necessariamente.
Visto che lo script viene eseguito appena prima di qualunque handler di evento onload, può essere scritto inline ma, per evitare di creare variabili globali si consiglia l'uso di una funzione anonima che si attiva immediatamente.
Per evitare che una pagine usi target="_blank" per aprire i link in pagine nuove si può fare così:

 

 

(function () {
  for( var i = 0; document.links[i]; i++ ) {
    if( document.links[i].target == '_blank' ) {
      document.links[i].target = '_self';
    }
  }
})();


Usare la notazione Greasemonkey equivale a creare un listener di evento 'BeforeEvent.load' in un normale User Js, come dimostrato nella sezione Override di eventi e handler di eventi.

Nota: molti scritp Greasemonkey usano window-_contenti per riferirsi al window object. Questo non è necessario in Opera ma, per evitare di correggere ogni file che lo usa, si può aggiungere questo al normale Usr Js:

 

window._content = window;


Controllare la modalità di navigazione
Gli User Javascript possono manipolare la navigazione nella cronologia in opera, per far in modo che sia sempre veloce o compatibile. Per maggiori informazioni consigliamo la lettura del'articolo di knowledge base (http://www.opera.com/support/search/supsearch.dml?index=827)

Queste modalità possono essere dettate attraverso il metodo setOverrideHistoryNavigationMode.

 

opera.setOverrideHistoryNavigationMode('fast')



Usare XSLT
Opera fornisce due metodi utilizzabili da User Js per controllare l'applicazione di XSLT ad un documento, si tratta di pushXSLTransform e popXSLTransform. Il metodo pushXSLTransform si lega ad una sola determinazione: il documento ha un elemento root xsl:stylesheet o xsl:transform, oppure un elemento xsl:stylesheet

pushXSLTransform applica lo XSLT come un foglio di stile XSL per il documento. Se è richiamato più volte l'effetto è cumulativo così un foglio di stile XSLTpuò essere applicato al risualtato di un altro.
popXSLTransform rimuove l'ultima trasformazione facendo del documento visualizzto l'albero risultante dalla trasformazione precedente.

 

var t = (new DOMParser()).parseFromString(
  "<stylesheet xmlns='http://www.w3.org/1999/XSL/Transform' version='1.0'>" +
    "<template match='/'>" +
      "Hello world!" +
    "</template>" +
  "</stylesheet>",
  "text/xml"
);

opera.pushXSLTransform(t);

if( !confirm("Do you want to keep this modificantion?") ) {
  opera.popXSLTransform();
}


Questi metodi non sono ristretti all'uso tramite Usr Js ma possono essere usati da script normali e bookmarklets.
 

 



 
Sponsored Links
| Feed | Termini di utilizzo | Mappa del sito | Contattaci | Chi siamo |

© 2010 OperaZone.it