我正在编写一个书签,通过在当前窗口中添加新的<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叠加,但在这种情况下我真的更喜欢打开一个窗口。
任何提示?
答案 0 :(得分:3)
您可以在bookmarklet.js
文件中将该窗口的标记加载为字符串,然后(稍后)使用window.open
而不使用URL(或者使用“about:blank”,我忘记哪个更多跨浏览器兼容),并使用my_popup.document.write
将标记写入新窗口。
您可能会发现即使没有跨域问题也无法在以后打开窗口,除非您是在直接响应用户操作时这样做 - 这可能是一件好事。 : - )