【问题标题】:How to run userscript(/greasemonkey) after AngularJS library is loaded加载 AngularJS 库后如何运行用户脚本(/greasemonkey)
【发布时间】:2015-08-12 14:30:02
【问题描述】:

我只是想为 Angular 对象创建一些扩展,让 AngularJS 调试更方便。

但是当我运行添加用户脚本时,它找不到角度对象。 AngularJS 库加载在标签的底部。

UPD:@estus 提供了正确答案,但如果您想使用 chrome,您需要通过 Tampermonkey 扩展安装它。

你可以找到最终代码sn -p here

【问题讨论】:

    标签: angularjs userscripts


    【解决方案1】:

    当用户脚本运行时 Angular 不可用这一事实表明 Angular 是异步加载的,这对于任何 SPA 来说都是很正常的(还要检查 @run-at 是否设置为 @987654326 @,这不是理想的行为)。

    用户脚本的通常解决方法是监视所需的变量:

    var initWatcher = setInterval(function () {
        console.log('watch');
        if (unsafeWindow.angular) {
            clearInterval(initWatcher);
            init();
        }
    }, 100);
    
    function init() {
        console.log('angular', unsafeWindow.angular);
    }
    

    如果不需要跨浏览器兼容性,则可以使用 FF 特定的Object.prototype.watch 代替:

    unsafeWindow.watch('angular', function (prop, oldVal, newVal) {
        console.log('watch');
        if (newVal) {
            unsafeWindow.unwatch('angular');
            // angular is still undefined ATM, run init() a bit later
            setTimeout(init);
        }
        return newVal;
    });
    
    function init() {
        console.log('angular', unsafeWindow.angular);
    }
    

    【讨论】:

    • 基本正确,但并不总是按预期工作,具体取决于用户脚本引擎和@grant 模式。 OP 没有提供足够的细节。可能需要脚本注入(并且是唯一通用的方法)。或者,在支持 @require 的引擎上,只为 @require 一个单独的 angular 副本用于脚本范围可能更聪明。
    • @BrockAdams 对,即使对于不同的 GM 版本,安全权限也会有所不同(我相信最后一个没有问题的是 1.x),并且对于 unsafeWindow 的可怕“权限被拒绝”是微不足道的。单独的副本无法解决问题,因为 Angular 应用程序状态存储在 angular 对象中。但是在页面加载 Angular 之前执行 @require 可能会有所帮助 - Angular won't redefine window.angular,GM 脚本可以先定义它。
    • 感谢您的详细解答。这很奇怪,但它仍然不起作用。它找不到“unsafeWindow.angular”,这就是为什么在控制台中我看到许多“监视”行。把代码放在这里 - github.com/stevermeister/userscripts/blob/master/…
    • @STEVER 您的用户环境是什么?我已经检查过它并让它在任意站点(docs.angularjs.org)Greasemonkey 3.2 上正常工作。我喜欢这个主意,我发现自己从控制台挖了几次喷油器。根据我的需要对其进行了一些修改,请随时use it
    • @STEVER 将 @grant none 更改为 @grant unsafeWindow,这是 Tampermonkey afaik 特有的。
    猜你喜欢
    • 2012-02-05
    • 2021-03-29
    • 1970-01-01
    • 1970-01-01
    • 2011-05-10
    • 1970-01-01
    • 2019-03-31
    • 2014-04-01
    相关资源
    最近更新 更多