我目前正在编写一个书签,通过附加新的 <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));
})();
我的书签需要执行一些 dom 操作,以便从正在查看的页面中提取数据,然后打开一个新的弹出窗口来列出它们。
问题是:如果我想绕过弹出窗口阻止程序,我无法从注入(inject)的脚本打开新窗口。我需要在书签代码中从头开始打开它,并在以后需要时访问它。
我尝试过做这样的事情:
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 覆盖,但在这种情况下我真的更喜欢打开一个窗口。
有什么提示吗?
最佳答案
您可以将窗口的标记作为字符串加载到 bookmarklet.js
文件中,然后(稍后)使用不带 URL(或带有“about:blank”,我忘记哪个更跨浏览器兼容),并使用 my_popup.document.write
将标记写入新窗口。
您可能会发现,即使没有跨域问题,您以后也无法打开该窗口,除非您这样做是为了直接响应用户操作 - 这可能是一件好事。 :-)
关于javascript - Bookmarklet、js注入(inject)和弹出问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2994187/