Bookmarklet,js注入和弹出问题

时间:2010-06-08 01:08:06

标签: javascript bookmarklet

我正在编写一个书签,通过在当前窗口中添加新的<script>标记来加载和执行远程js文件,如下所示:

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));
})();

我的bookmarklet需要执行一些dom操作才能从正在查看的页面中提取数据,然后打开一个新的弹出窗口列出它们。

问题是:如果我想绕过弹出窗口阻止程序,我无法从注入的脚本中打开我的新窗口。我需要在书签代码中从头开始打开它,并在以后需要时访问它。

我试图像这样做:

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 (...)
})();

但如果我尝试从远程加载的脚本访问my_popup,大多数浏览器都会抛出安全警告,不允许我访问Window对象。这是可以理解的,因为脚本与显示的页面不是来自同一个域,但我有点被卡住了......

解决方案是使用div叠加,但在这种情况下我真的更喜欢打开一个窗口。

任何提示?

1 个答案:

答案 0 :(得分:3)

您可以在bookmarklet.js文件中将该窗口的标记加载为字符串,然后(稍后)使用window.open而不使用URL(或者使用“about:blank”,我忘记哪个更多跨浏览器兼容),并使用my_popup.document.write将标记写入新窗口。

您可能会发现即使没有跨域问题也无法在以后打开窗口,除非您是在直接响应用户操作时这样做 - 这可能是一件好事。 : - )