2010-06-08 5 views
2

J'écris actuellement un bookmarklet qui charge et exécute un fichier js à distance en ajoutant une nouvelle balise <script> dans la fenêtre en cours, comme ceci:bookmarklet, injection js et l'émission pop-up

javascript:(function() { 
    if(typeof __bml_main != "undefined") return __bml_main.init(); 
    var s= document.createElement('script'); 
    s.type= 'text/javascript'; 
    s.src= 'http://127.0.0.1:8000/media/bookmarklet.js'; 
    void(document.body.appendChild(s)); 
})();

Mon bookmarklet doit effectuer quelques manipulations de dom afin d'extraire des données de la page visualisée, puis ouvrir une nouvelle fenêtre pour les lister. La chose est: si je veux contourner les bloqueurs de fenêtres pop-up, je ne peux pas ouvrir ma nouvelle fenêtre à partir du script injecté. Je dois l'ouvrir dès le début dans le code bookmarklet, et y accéder plus tard si nécessaire.

J'ai essayé de faire somehting comme ceci:

javascript:var my_popup = window.open('http://127.0.0.1:8000/resources/manage/new/', 'newResourcePopup',config='height=200,width=400,toolbar=no,menubar=no,scrollbars=no,resizable=no,location=no,directories=no,status=no'); 
(function() { 
// script injection (...) 
})();

mais si je tente ensuite d'accéder my_popup de mon script à distance chargé, la plupart des navigateurs jetterai un avertissement de sécurité et ne me laisse pas accéder à la Objet de fenêtre C'est compréhensible puisque le script ne vient pas du même domaine que la page affichée, mais je suis en quelque sorte coincé ...

Une solution serait d'utiliser une superposition div, mais je préférerais vraiment ouvrir un fenêtre dans ce cas.

Des indices?

Répondre

3

Vous pouvez charger le balisage de la fenêtre comme une chaîne dans votre fichier bookmarklet.js, puis (plus tard) utiliser window.open sans URL (ou « about: blank », j'oublie ce qui est plus cross-compatible avec le navigateur), et utilisez my_popup.document.write pour écrire le balisage dans la nouvelle fenêtre.

Vous pouvez constater que vous ne pouvez pas ouvrir la fenêtre plus tard, même sans problèmes inter-domaines, sauf si vous le faites en réponse à une action de l'utilisateur   — ce qui est probablement une bonne chose. :-)

+0

Merci pour votre réponse! :) C'est plutôt moche, mais ça marche plutôt bien. En fait, je pense que je vais utiliser document.createElement() au lieu de document.write() pour créer la dom de la page. Une page about: blank n'a pas de doctype, mais il me semble plus conforme à la norme de manipuler les nœuds plutôt que d'ajouter le balisage sous forme de chaîne. – Denis

+0

@Neewok: Heureux qui a aidé. Savez-vous que ça fait tellement longtemps que je n'ai pas créé de pop-ups que 'document.write' était encore plus fiable et que je n'avais pas mis à jour ma pensée. Je n'ai jamais créé un DOM à partir de rien dans un document vide, mais je ne peux pas imaginer en principe pourquoi cela ne devrait pas marcher, bonne réflexion. :-) –