Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

surcharge de méthode

33 réponses
Avatar
Christophe PEREZ
Bonjour,

Dans un contexte très particulier (développement d'un mini-navigateur
spécifique en XUL pour borne internet), j'ai besoin d'interdire tout
popup en redirigeant l'ouverture de l'url dans la fenêtre principale (la
seule).

Je ne souhaite pourtant pas désactiver le javascript (j'ai la main sur
l'installation des clients firefox) car je voudrais en conserver certains
avantages.

J'ai bien essayé de tenter d'utiliser les différents systèmes
anti-popup, mais la plupart ne fonctionne que sur les popup non
désirées, et pas sur les liens <a href="window.open('...')"> Or pour
moi, ce n'est pas compliqué, il faut qu'aucune autre fenêtre ne puisse
s'ouvrir. Un plugin pourtant (tabextensions) semblerait faire l'affaire,
mais je ne parviens ni à l'intégrer dans mon appli, ni à en retirer le
principe afin de le réutiliser.

J'ai donc pensé que la "surcharge" de la méthode window.open pourrait
être une solution, mais j'avoue être loin d'un expert de l'objet et
encore moins de ce genre de procédés.

J'ai bien essayé des window.prototype.open = ma_function(); (et
autres) mais sans résultat

NB : J'ai bien dit que c'est un contexte très particulier. Je sais ce que
je fais et justement, dans ce cadre, je dois totalement maîtriser le
client et ne laisser à l'utilisateur que les possibilités que je
souhaite.

PS : J'ai l'impression que c'est une question pour YD ça ;-)

Merci grandement d'avance.

--
Christophe PEREZ
Écrivez moi sans _faute !

10 réponses

1 2 3 4
Avatar
YD
PS : J'ai l'impression que c'est une question pour YD ça ;-)


Bon puisque tu me sollicites directement...

Dans un contexte très particulier (développement d'un mini-navigateur
spécifique en XUL pour borne internet), j'ai besoin d'interdire tout
popup en redirigeant l'ouverture de l'url dans la fenêtre principale (la
seule).
[...]
J'ai donc pensé que la "surcharge" de la méthode window.open pourrait
être une solution, mais j'avoue être loin d'un expert de l'objet et
encore moins de ce genre de procédés.


C'est la bonne voie, je pense. Un exemple simplissime :

function truc(){
if(arguments.length>0)
window.location=arguments[0];
}
window.open=truc;

Un mot d'explication : on affecte la fonction truc à la méthode open de
window. La fonction truc vérifie qu'elle est appelée avec au moins un
argument. Le premier argument (indice 0 donc) de window.open est l'URL à
atteindre, il est passé à truc puisque désormais c'est truc qui est appelé
quand on appelle open. On charge cette URL dans la page courante. Si open
est appelé sans argument, on ne fait rien !
Par le bouton précédent du navigateur on peut revenir sur la page contenant
le lien.

(Testé dans FF1.0 ce qui t'intéresse le plus je suppose, mais aussi IE6 et
Op7.54)

En espérant que ça t'avance.

--
Y.D.

Avatar
Christophe PEREZ
Le Mon, 07 Feb 2005 01:35:14 +0100, YD a écrit:

PS : J'ai l'impression que c'est une question pour YD ça ;-)


Bon puisque tu me sollicites directement...


Je commence à un peu connaître ton champ de compétences ;-)
Surtout que tu m'as déjà dépanné sur des trucs similaires.

J'ai donc pensé que la "surcharge" de la méthode window.open pourrait
être une solution, mais j'avoue être loin d'un expert de l'objet et
encore moins de ce genre de procédés.


C'est la bonne voie, je pense.


Ah ! Moi aussi, surtout que je ne vois que celle là ;-)

Un exemple simplissime :

function truc(){
if(arguments.length>0)
window.location=arguments[0];
}
window.open=truc;


Ben oui, mais non, marche pas.
Or, comme je ne doute nullement de ta réponse, c'est donc que mon
contexte est particulier. Mais pour l'expliquer, il faut que tu connaisses
le XUL, et là, je vais frôler le HS ici. Pfff.. dur.
Comme quoi, je n'étais finalement pas si HS en postant sur une liste
dédiée XUL au départ, mais je n'ai pas eu de réponse.

Je vais donc chercher à mieux isoler le problème.
Pour être sûr, c'est bien window.open=truc et pas window.open="truc" ?

Un mot d'explication : on affecte la fonction truc à la méthode open de
window. La fonction truc vérifie qu'elle est appelée avec au moins un
argument. Le premier argument (indice 0 donc) de window.open est l'URL à
atteindre, il est passé à truc puisque désormais c'est truc qui est appelé
quand on appelle open. On charge cette URL dans la page courante. Si open
est appelé sans argument, on ne fait rien !
Par le bouton précédent du navigateur on peut revenir sur la page contenant
le lien.


Ok, merci pour les explications. Mon problème étant plus sur la syntaxe
précise car je ne trouve quasiment rien sur le sujet sur le net. Ou
alors, je ne sais pas le chercher.

(Testé dans FF1.0 ce qui t'intéresse le plus je suppose, mais aussi IE6 et
Op7.54)


Evidemment oui, c'est FF 1.0 qui m'intéresse exclusivement.

En espérant que ça t'avance.


Bien sûr, ça me conforte au moins sur la voie choisie.
Merci.

--
Christophe PEREZ
Écrivez moi sans _faute !


Avatar
Christophe PEREZ
Le Sun, 06 Feb 2005 23:18:03 -0400, Christophe PEREZ a écrit:

window.open=truc;


Ben oui, mais non, marche pas.
Or, comme je ne doute nullement de ta réponse, c'est donc que mon
contexte est particulier.


Et bien évidemment que c'était ça.
En fait, le "window.open" n'est pas du tout celui qu'il faut surcharger.
En effet, dans mon mini-navigateur XUL, j'ai une balise <browser
id="browser">
Il me fallait donc surcharger
document.getElementById('browser').contentWindow.open

De plus, il fallait (je pense) surcharger cette méthode à chaque
changement de page (donc du contenu de contentWindow), et non pas
seulement à l'initialisation de mon appli.

Enfin, je vais à priori me contenter d'une fonction
document.getElementById('browser').contentWindow.open = function() {return
false;};
qui me permet en fait, de simuler une désactivation du javascript, juste
pour le open(), non ?

De cette façon, un site bien fait, avec un <a href=... ouvrira la page
correctement dans la fenêtre sans que j'ai à la forcer.
Quant aux sites "mal faits", tanpis pour eux, ils ne seront pas
"navigables", pour une fois que je peux me permettre ce genre de choses ;-)

Merci beaucoup pour ton aide qui une fois de plus m'a été extrêmement
précieuse.

Dernière chose, je fais des dump() en console qui me servent au
débugage pour l'instant et qui serviront à l'enregistrement de logs en
exploitation. Mais j'ai un petit problème de charset puisque j'ai des
choses du genre :
dim 06 fév 2005 23:40:59 AST Load page : url_quelconque
C'est de l'UTF-8 alors qu'il faudrait qu'il sorte de l'ISO-8859-1.
J'ai quelque peu cherché ça aussi, mais sans rien trouver pour l'instant.
Ceci dit, c'est quand même beaucoup moins important que la question
précédente ;-)

--
Christophe PEREZ
Écrivez moi sans _faute !


Avatar
Christophe PEREZ
Le Sun, 06 Feb 2005 23:48:39 -0400, Christophe PEREZ a écrit:

Enfin, je vais à priori me contenter d'une fonction
document.getElementById('browser').contentWindow.open = function() {return
false;};


Ben oui mais non ;-)
En effet, le target="_blank" passe encore. Zut !
Une idée ?

--
Christophe PEREZ
Écrivez moi sans _faute !

Avatar
ASM

Le Sun, 06 Feb 2005 23:48:39 -0400, Christophe PEREZ a écrit:

Enfin, je vais à priori me contenter d'une fonction
document.getElementById('browser').contentWindow.open = function() {return
false;};


Ben oui mais non ;-)
En effet, le target="_blank" passe encore. Zut !
Une idée ?


des idées on en a , savoir si ça marche ?

function noBlank() {
var D = document.getElementById('browser').document;
var L = D.links;
for(var i=0;i<L.length;i++) L[i].setAttribute('target','_self');
}

reste à savoir quand envoyer le truc ?

--
*******************************************************
Stéphane MORIAUX et son vieux Mac
Aide Pages Perso (images & couleurs, formulaire, CHP)
http://perso.wanadoo.fr/stephane.moriaux/internet/
*******************************************************


Avatar
Christophe PEREZ
Le Tue, 08 Feb 2005 02:33:29 +0100, ASM a écrit:

des idées on en a , savoir si ça marche ?

function noBlank() {
var D = document.getElementById('browser').document;
var L = D.links;
for(var i=0;i<L.length;i++) L[i].setAttribute('target','_self');
}


:-)))
Ben en fait, je me suis résolu pour l'instant une solution du même ordre
:
for ( var lien = 0, liste = getElementsByAttribute('target','_blank',BROWSER.contentDocument); lien < liste.length; lien++)
liste[lien].removeAttribute('target');

avec :
function getElementsByAttribute(attr,val,container) {
container = container||document;
var liste = container.getElementsByTagName('*');
var arr = [];
for (var item = 0 ; item < liste.length ; item++ )
if ( liste[item].getAttribute(attr) == val )
arr.push( liste[item] );
return arr;
}

Bon, moi, me me contente de supprimer l'attribut, je ne sais pas si c'est
mieux que de le passer en '_self'.
De plus, je modifie en fait toute balise contenant l'attribut target, car
j'ai pensé ensuite aussi aux <form>
Il y aurait selon vous d'autres trucs du même genre à bloquer ? Je
n'en vois plus

reste à savoir quand envoyer le truc ?


Ça, ce n'est pas le plus gros problème pour moi puisque j'ai un
"observer" sur le chargement de la page, donc je la modifie presque à la
volée. C'est vrai qu'il y a toujours la possibilité de cliquer avant que
le parsing n'ai été réalisé, mais là, faut quand même être vif sur
la souris ;-)

En tout cas, merci pour l'idée qui, même si elle est similaire à la
mienne, me conforte dans mon choix que j'avais pourtant trouvé assez
lourd-dingue.

--
Christophe PEREZ
Écrivez moi sans _faute !

Avatar
ASM

Le Tue, 08 Feb 2005 02:33:29 +0100, ASM a écrit:

des idées on en a , savoir si ça marche ?



et la variante pour toutes balises :

function noBlank() {
var D = document.getElementById('browser').document;
var L = D.links;



// c'est vrai qu'il n'y a pas que les liens !

var L = D.getElementsByTagName('body')[0];

for(var i=0;i<L.length;i++)



if(L[i].getAttribute('target').toLowerCase()=='_blank');
L[i].setAttribute('target','_self');

}




Il y aurait selon vous d'autres trucs du même genre à bloquer ? Je
n'en vois plus


tu as oublié :

<HEAD>
<BASE TARGET="_blank">
</HEAD>

reste à savoir quand envoyer le truc ?


Ça, ce n'est pas le plus gros problème pour moi puisque j'ai un
"observer" sur le chargement de la page,


Qu'est-ce que c'est un observer ?

En tout cas, merci pour l'idée qui, même si elle est similaire à la
mienne, me conforte dans mon choix que j'avais pourtant trouvé assez
lourd-dingue.


pour les idées assez lourdingues je suis le roi ;-))


Je garde le reste pour mes archives :-)

:-)))
Ben en fait, je me suis résolu pour l'instant une solution du même ordre
:
for ( var lien = 0, liste = getElementsByAttribute('target','_blank',BROWSER.contentDocument); lien < liste.length; lien++)
liste[lien].removeAttribute('target');

avec :
function getElementsByAttribute(attr,val,container) {
container = container||document;
var liste = container.getElementsByTagName('*');
var arr = [];
for (var item = 0 ; item < liste.length ; item++ )
if ( liste[item].getAttribute(attr) == val )
arr.push( liste[item] );
return arr;
}



--
*******************************************************
Stéphane MORIAUX et son vieux Mac
Aide Pages Perso (images & couleurs, formulaire, CHP)
http://perso.wanadoo.fr/stephane.moriaux/internet/
*******************************************************


Avatar
Christophe PEREZ
Le Tue, 08 Feb 2005 14:28:01 +0100, ASM a écrit:

// c'est vrai qu'il n'y a pas que les liens !


oh oui :-)

tu as oublié :

<HEAD>
<BASE TARGET="_blank">
</HEAD>


Mais vu que je traite tous les target...?!?

Mais je parlais d'autres cas, autres que les target, qui pourraient
m'ouvrir des fenêtres non désirées.

Qu'est-ce que c'est un observer ?


Un observateur d'évènements, qui observe les évènements intervenant
sur mon objet, comme le onStateChange().

pour les idées assez lourdingues je suis le roi ;-))


Heureusement que nous sommes dans des pays différents, car je suis aussi
Roi dans le domaine.

Je garde le reste pour mes archives :-)


;-)

--
Christophe PEREZ
Écrivez moi sans _faute !

Avatar
ASM

Le Tue, 08 Feb 2005 14:28:01 +0100, ASM a écrit:

// c'est vrai qu'il n'y a pas que les liens !


oh oui :-)


le dernier que j'ai vu (et j'y avais pas pensé !)
le onclick dans une cellule de tableau

à l'entrée j'avais été prévenu
que le site n'était pas compatible NC4
Z'ont oublié de dire qu'il ne l'était pas sans JS

Mais vu que je traite tous les target...?!?


Tu voulais des idées : oui [ ] non [ ] (cochez la case)

réponse : à moins que je n'ait mal compris ton script ->
non tu ne traites pas les liens||objets sans target
(à mon sens et celui de mon IE, alors régits par le <base target > )

Mais je parlais d'autres cas, autres que les target, qui pourraient
m'ouvrir des fenêtres non désirées.


en en-tête,
base target="_blank" ou "_top" ou "_parent" ou nom d'1 frame
ouvre les bêtes liens sans target dans une nvelle fenêtre.

sinon je propose :

une lime à ongles ?

un ouvre-boîte ?

un pied-de-biche
et/ou sa copine la pince-monseigneur

un tracto-pelle

un brise-glaces

çà ne manque pas :-)

--
*******************************************************
Stéphane MORIAUX et son vieux Mac
Aide Pages Perso (images & couleurs, formulaire, CHP)
http://perso.wanadoo.fr/stephane.moriaux/internet/
*******************************************************


Avatar
Christophe PEREZ
Le Tue, 08 Feb 2005 22:00:14 +0100, ASM a écrit:

le dernier que j'ai vu (et j'y avais pas pensé !)
le onclick dans une cellule de tableau


En fait, tout onclick, quelque soit sa position, mais ça veut dire aussi
parser le javascript ! De la folie ce truc.

à l'entrée j'avais été prévenu
que le site n'était pas compatible NC4
Z'ont oublié de dire qu'il ne l'était pas sans JS


:-)

Mais vu que je traite tous les target...?!?


Tu voulais des idées : oui [ ] non [ ] (cochez la case)


Oui, mais ce que je veux dire, c'est qu'à partir du moment ou je
supprimer tous les attributs target de la page, même celui du <BASE>
sautera.

réponse : à moins que je n'ait mal compris ton script ->
non tu ne traites pas les liens||objets sans target
(à mon sens et celui de mon IE, alors régits par le <base target > )


oui, je comprends rien.

Mais je parlais d'autres cas, autres que les target, qui pourraient
m'ouvrir des fenêtres non désirées.


en en-tête,
base target="_blank" ou "_top" ou "_parent" ou nom d'1 frame
ouvre les bêtes liens sans target dans une nvelle fenêtre.


Bon, c'est un truc que je ne connais pas du tout ça, alors je vais faire
des tests pour vérifier ce que j'avance.

[ snip élucubrations ]
çà ne manque pas :-)


:-D

--
Christophe PEREZ
Écrivez moi sans _faute !


1 2 3 4