Accueil > weblog
- Lire le billet précédent - Lire le billet suivant -
Par Laurent Denis, le 17 mars 2005.
Outre le support SVG, changelog Opera 8.0 bêta 3 comporte une autre nouveauté d'importance : le support des javascripts utilisateurs.
Cette nouvelle fonctionnalité n'est pas officiellement documentée (sans doute en raison des risques de sécurité qu'elle crée en cas de téléchargement par l'utilisateur d'un script malicieux), et a été annoncée par des membres du staff Opera sur leurs blogs :
id à l'élément body afin de pouvoir appliquer une CSS utilisateur ciblée à n'importe quelle page).Pour activer les javascripts utilisateurs, il est nécessaire de modifier le fichier Opera6.ini (Opera doit être fermé lors de l'édition de ce fichier) :
User JavaScript=1 User JavaScript File=c:\...\user.js
(c:\...\user.js à modifier à votre convenance).
Ces scripts peuvent s'appliquer, au choix :
Voici l'atanomie d'un user.js type (d'après l'exemple donné par Rijk van Geijtenbeek), qui permet de supprimer les annonces Google adSense, d'activer un lien à partir de l'attribut cite des citations blockquote, et d'éviter la redirection erronée de GMail vers la version "HTML pour vieux navigateurs" de celui-ci (ce dernier script étant avantageusement remplacé par un simple gmail.google.com=4 ajouté au fichier profile/ua.ini) :
var domainHandler = new Array(); var pathHandler = new Array(); var allHandler = new Array();
allHandler=[ hideAdSense, addCitationLinks]
Le script redirectGmail ne concerne que le site de Google Mail :
domainHandler['gmail.google.com'] = redirectGmail;
Le script serait associé uniquement à la page example.org/example.html :
pathHandler["example.org/example.html"] = exampleScript;
// Activation:
document.addEventListener("load",loadHandler,false)
function loadHandler() {
// Variable récupérant le chemin de la page en cours:
var fullpath = "";
with (window.location) {
fullpath = (port == "") ? hostname + pathname : hostname + ":" + port + pathname;
}
// Un handler est-il défini pour la page en cours ? Si oui, on exécute la fonction correspondante:
if ((window == window.top) && (pathHandler[fullpath])) {
pathHandler[fullpath]();
}
// Un handler est-il défini pour le domaine de la page en cours ? Si oui, on exécute la fonction correspondante:
if ((window == window.top) && (domainHandler[document.domain])) {
domainHandler[document.domain]();
}
// Exécution des fonctions associées à toutes les pages consultées:
if (window == window.top)
while(allHandler.length>0)
allHandler.shift()();
}
// ==UserScript==
/*
Hide Google Adsense Ads
(c) Carlo Zottmann, carlo@g-blog.net
http://G-Spotting.net/
Copy, use, modify, spread as you see fit.
*/
// @name Hide Google Adsense Ads (2005-01-12)
// @namespace http://docs.g-blog.net/code/greasemonkey
// @description Hides Google Adsense Ads iframes anywhere.
// @include http://*
// @include https://*
// ==/UserScript==
function hideAdSense() {
var RemoveGoogleAds =
{
checkPage: function() {
if (document.getElementsByTagName("body")[0].innerHTML.match(/google_ads_frame/i)) {
this.injectCSS("iframe[name='google_ads_frame'] { display: none; }");
}
},
injectCSS: function(css) {
head = document.getElementsByTagName("head")[0];
style = document.createElement("style");
style.setAttribute("type", 'text/css');
style.innerHTML = css;
head.appendChild(style);
}
}
RemoveGoogleAds.checkPage();
}
// ==UserScript==
// Dunstan Orchard http://www.1976design.com/blog/
//
// Altered from original idea by Simon Willison at:
// http://simon.incutio.com/archive/2002/12/20/blockquoteCitations
function addCitationLinks() {
quotes = document.getElementsByTagName('blockquote');
for (var i = 0; i < quotes.length; i++) {
cite = quotes[i].getAttribute('cite');
if ((cite) && (cite != "")) {
if ( (cite.match('http://', 'i')) || (cite.match('ftp://', 'i')) ){
newlink = document.createElement('a');
newlink.setAttribute('href', cite);
newlink.setAttribute('title', ('Go to ' + cite));
if (cite.length > 32) {
cite = cite.substring(0,32) + '...';
}
newlink.appendChild(document.createTextNode(cite));
newdiv = document.createElement('div');
newdiv.className = 'source';
newdiv.appendChild(document.createTextNode('\u2014 '));
newdiv.appendChild(newlink);
quotes[i].appendChild(newdiv);
} else if (cite.match('urn:quote:', 'i')) {
newdiv = document.createElement('div');
newdiv.className = 'source';
// Strip leading path.
exp = new RegExp('urn:quote:','g');
cite = cite.replace(exp, '');
// Convert spaces to _.
var exp = new RegExp(' ','g');
url = cite.replace(exp, '_');
// Append url.
url = 'http://www.quotationspage.com/quotes/' + url;
var link = document.createElement('a');
link.href = url;
link.innerHTML = cite;
newdiv.appendChild(document.createTextNode('\u2014 '));
newdiv.appendChild(link);
quotes[i].appendChild(newdiv);
} else if (cite.match('urn:author:', 'i')) {
newdiv = document.createElement('div');
newdiv.className = 'source';
var exp = new RegExp('%20','g');
cite = cite.replace(exp, ' ');
exp = new RegExp('urn:author:','g');
cite = cite.replace(exp, '');
newdiv.appendChild(document.createTextNode('\u2014 ' + cite));
quotes[i].appendChild(newdiv);
} else {
newdiv = document.createElement('div');
newdiv.className = 'source';
var exp = new RegExp('%20','g');
cite = cite.replace(exp, ' ');
newdiv.appendChild(document.createTextNode('\u2014 ' + cite));
quotes[i].appendChild(newdiv);
}
}
}
}
// ==UserScript==
function redirectGmail() {
if(document.getElementById('bm')) window.location='http://gmail.google.com/gmail/?nocheckbrowser';
}
// ==UserScript==
function exampleScript() {
// ...
}Les javascripts utilisateur Opera rappellent évidemment l'extension Greasemonkey de Firefox. Pour reprendre un commentaire de Rijk van Geijtenbeek, Greasemonkey et les scripts utilisateurs actuels d'Opera peuvent tous deux être considérés comme des "bookmarklets permanent". Les scripts de Greasemonkey sont effectivement plus faciles à partager, tandis que le user.js d'Opera est plus flexible.
. Voilà en tous cas une nouveauté bienvenue, dont l'évolution future nous réserve quelques surprises...
[Mise à jour 2005-03-2] Ressources à signaler :
Les trackbacks pour ce billet sont temporairement fermés en raison d'une série d'attaques de spam.
Commentaires
Aucun commentaire pour le moment.
Les commentaires pour ce billet sont temporairement fermés en raison d'une série d'attaques de spam.