【问题标题】:How a bookmarklet can avoid the popup blocker小书签如何避免弹出窗口阻止程序
【发布时间】:2011-01-05 22:40:35
【问题描述】:

我写了一个小书签,用于在弹出窗口中使用谷歌翻译器快速翻译选定的文本:

javascript:(function(){
    var text = encodeURI(document.getSelection());
    if (!text.length) {
        text = prompt('Texto')
    }
    var url = 'http://translate.google.com/translate_t?hl=&ie=UTF-8&text=' + text + ' &sl=es&tl=pt#';
    window.open(url,'trans','left=20,top=20,width=1000,height=500,toolbar=0,location=0,resizable=1');
})();

但是,Firefox 弹出窗口阻止程序不允许打开新窗口。我可以为我使用弹出窗口的每个站点添加例外,但这可能很烦人......

我认为书签可以打开弹出窗口 - 实际上,很多人都这样做,对吗?我究竟做错了什么?还是做不到?

【问题讨论】:

    标签: javascript firefox popup bookmarklet


    【解决方案1】:

    还有另一种解决弹出窗口阻止程序的方法,首先包括一个覆盖在页面上的链接,然后允许用户单击该链接以生成弹出窗口。然后可以将小书签 javascript 存储在单独的文件中。这就是 Pinterest 的小书签设法做到这一点的方式。首先,他们从页面中选择图像并将其直接覆盖在页面上。然后,当用户单击以选择其中一张照片时,会出现弹出窗口。因为此操作是由用户发起的,所以弹出窗口有效。

    这里有一些你可以用来测试的代码:

    将它放在一个名为 bookmarklet.js 的文件中

    var popupProperties='width=600,height=400,toolbar=0,location=0,resizable=1';
    var newA = document.createElement("a");
    var url = 'http://www.stackoverflow.com';
    newA.setAttribute("href","javascript:window.open(url,'Hi',popupProperties);");
    newA.setAttribute("style","position:fixed;z-index:9999999;top:0;left:0;width:100px;height:100px;color:#000;background:#fff;display:block;");
    var newT = document.createTextNode("Open this");
    newA.appendChild(newT);
    document.body.appendChild(newA);
    

    然后你的书签链接可以是这样的:

    javascript:var jsCode = document.createElement('script');jsCode.setAttribute('src', 'http://localhost/bookmarklet.js?r='+Math.random()*99999999);document.body.appendChild(jsCode);
    

    或者,您需要在实际的小书签链接中包含弹出窗口。这反过来意味着进行任何更改的唯一方法是让用户重新安装书签。

    编辑:除了上述方法,我后来发现还有另一种方法可以解决这个问题,即使用 easyXDM。它可以帮助您解决同源策略http://easyxdm.net/wp/

    使用它,您可以将 iframe 用于您的书签,甚至可以在 iframe 中添加一个“关闭”链接,该链接将能够从父页面中删除 iframe。

    【讨论】:

    • 您甚至可以在该锚点上添加一个 id 并做一些恶作剧,例如 document.getElementById('myid').click() 并立即启动它(这里的灰色区域......)本机DOM .click 很难找到支持文档,但现代 chrome 和 FF 在我的简短测试中工作正常。
    【解决方案2】:

    防止浏览器提示弹出窗口阻止程序的一种方法是将您的 javascript 完全包含在锚标记中。

    一旦你引用了另一个文件,它显然会触发浏览器的弹出窗口拦截器。

    例如,当用户将锚点拖到浏览器的书签栏时,以下代码不会触发弹出窗口拦截器:

    <a href="javascript:window.open('http://tagsby.me/index.small.php','newWindowName','width=960,height=400,scrollbars=yes,status=no,titlebar=no,toolbar=no');void(0);">No blocker</a>
    

    但是,如果您在另一个文件noblocker.js 中引用相同的代码,该文件已附加到用户当前访问的站点的文档对象中:

    <a id="tbm" class="testing" href="javascript:(function(){document.body.appendChild(document.createElement('script')).src='http://domain.com/noblocker.js';})();">
    

    它将触发弹出窗口阻止程序。可能还有另一种方法,但这就是我现在在我的网站http://tagsby.me 上所做的工作。

    【讨论】:

    • 你找到其他方法了吗?我看到 Pinterest 设法通过他们的“Pin it”小书签有一个非阻塞的弹出窗口,即使它是通过远程 javascript 文件调用的 - 在pinterest.com/about/goodies 上实时查看
    【解决方案3】:

    有趣的问题,我的直觉是这是不可能的,因为浏览器不一定会跟踪哪个代码正在尝试打开一个新窗口,所以它不能“允许”它,因为它来自站点 X。

    我觉得实际上更好的一个选项是在同一窗口的对话框中打开内容。看看如何实现一个 jquery 小书签,其余的应该是直截了当的:

    http://www.latentmotion.com/how-to-create-a-jquery-bookmarklet/

    【讨论】:

    • 这很奇怪,因为人们说这可能在这里:stackoverflow.com/q/4048008/287976 但是,我尝试使用一个我认为可以做到的书签(用于保存链接的书签关于美味):首先它失败了,然后它只是改变了文档的位置......这很不幸,因为我真的想在另一个窗口中打开它......也许我尝试使用jQuery,但我敢打赌它会足够让我为一些我想翻译一些文本的常见网站添加例外......
    【解决方案4】:

    弹出窗口阻止程序具有添加异常的功能。也许尝试为 translate.google.com 添加一个例外

    (工具菜单->选项->内容部分)

    【讨论】:

    • 其实它不起作用,因为有内容的站点被认为是源站点。例如,如果我要求它翻译 es.wikipedia.org 中的一个词,我应该将 es.wikipedia.org 的例外添加到任何其他网站……
    • 我很抱歉,我不知何故错过了你的那部分 OP
    • 其实我是在发帖后才添加的,但没有看到你的建议。所以没关系:)
    • 原帖/原海报
    猜你喜欢
    • 1970-01-01
    • 2017-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-12
    • 1970-01-01
    • 2015-05-05
    • 1970-01-01
    相关资源
    最近更新 更多