javascript - 动态加载脚本会改变其行为

标签 javascript javascript-framework jquery-events paperjs

我希望 paperjs 在按下按钮打开动画后加载,但如果在页面加载后加载纸张,paperscript 似乎不起作用。

如果您注释掉 setTimeout 并取消注释直接 $.getScript - paperjs 将触发 alert('hi')。我不明白。

<html>
    <head>
        <script src="http://code.jquery.com/jquery-latest.js"></script>
        <script>
            $(document).ready(function () {
                var paperUrl = 'http://cdnjs.cloudflare.com/ajax/libs/paper.js/0.22/paper.js';
                $("#jq").text("jQuery is now loaded.")
                var lateLoad = function() {
                    $.getScript(paperUrl, function() {
                        $("#pp").text("Paperjs is now loaded.");
                    });
                };
                //setTimeout(lateLoad, 100);
                $.getScript(paperUrl, function() {
                    $("#pp").text("Paperjs is now loaded.");
                });
            });
        </script>
    </head>
    <body>
        <script type="text/paperscript" canvas="myCanvas">
            $('body').css({"background-color": "#999"});
            alert('hi!');
        </script>
        <p id="jq">jQuery NOT loaded yet.</p>
        <p id="pp">Paperjs NOT loaded yet.</p>
    </body>
</html>

我在 Windows 7 x64 上使用 Chrome 23.0.1271.97 m。有人知道这里发生了什么吗?

最佳答案

我想我也想出了一个解决方法 - paper.PaperScript.load() 或详细说明:

<html>
    <head>
        <script src="http://code.jquery.com/jquery-latest.js"></script>
        <script>
            $(document).ready(function () {
                $("#jq").text("jQuery is now loaded.")
                var paperUrl = 'http://cdnjs.cloudflare.com/ajax/libs/paper.js/0.22/paper.js';
                var lateLoad = function() {
                    $.getScript(paper_url, function() { 
                        $("#pp").text("Paperjs is now loaded.");
                        paper.PaperScript.load(); // <-- The fix!
                    });
                };
                setTimeout(lateLoad, 1000);
                //$.getScript(paperUrl, function() {
                //    $("#pp").text("Paperjs is now loaded.");
                //});
            });
        </script>
    </head>
    <body>
        <script type="text/paperscript" canvas="myCanvas">
            $('body').css({"background-color": "#999"});
            alert('hi!');
        </script>
        <p id="jq">jQuery NOT loaded yet.</p>
        <p id="pp">Paperjs NOT loaded yet.</p>
    </body>
</html>

这会导致 paperscript 扫描所有的 paperscripts。我在 https://github.com/paperjs/paper.js/blob/master/src/core/PaperScript.js#L270 找到了它在 github repo 中搜索“paperscript”时。虽然它仍然没有解释为什么纸在动态加载时不自己执行 load()。

编辑 - 我明白出了什么问题。与https://github.com/jquery/jquery/blob/master/src/core.js#L768有关因为 paperjs 不检查窗口加载事件是否已经触发,即 document.readyState === "complete"。我向 paperjs 提交了拉取请求 https://github.com/paperjs/paper.js/pull/156

关于javascript - 动态加载脚本会改变其行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14110205/

相关文章:

sencha-touch - 如何创建 Sencha Touch 应用程序的 APK 文件?

JavaScript 将文本写入图像

javascript从字符串数组构造一个对象

javascript - 在 react + jsx 中动态设置 svg circle attr

javascript - 使用 JQuery 粘贴事件后将焦点更改为下一个输入

Javascript 用 jQuery 函数替换函数

jquery - 将 jQuery 单击事件分配给正文中除少数 div 及其子元素之外的所有内容

javascript - 如何将 svg 组或异物正确定位到 d3 地球上?

javascript - 单击按钮即可编辑标签 View - Sproutcore

ember.js - 客户端 Javascript 应用程序 - 没有哈希标记的 url 路由