使用Rawgit获取Javascript文件

使用Rawgit获取Javascript文件,javascript,jquery,ajax,github,Javascript,Jquery,Ajax,Github,我试图通过Ajax在我的网站中包含一个JS文件,方法是使用Rawgit从我的GitHub存储库中获取它。出于某种原因,当我使用开发或生产URL时,它不起作用,但是当我直接从Github使用文件的原始版本时,问题就停止了。当我使用CSS文件的开发URL时,我没有遇到任何问题。有人知道为什么会这样吗 这是我的密码: $.get("https://rawgit.com/Larpee/The-Khan-Quiz/master/game.js", function (game) { var ske

我试图通过Ajax在我的网站中包含一个JS文件,方法是使用Rawgit从我的GitHub存储库中获取它。出于某种原因,当我使用开发或生产URL时,它不起作用,但是当我直接从Github使用文件的原始版本时,问题就停止了。当我使用CSS文件的开发URL时,我没有遇到任何问题。有人知道为什么会这样吗

这是我的密码:

$.get("https://rawgit.com/Larpee/The-Khan-Quiz/master/game.js", function (game) {
    var sketchProc = function (processingInstance) {
        with (processingInstance) {
            size(400, 400);
            frameRate(30);
            eval(game);
        }
    };

    var canvas = document.getElementById("game");
    var processingInstance = new Processing(canvas, sketchProc);
});
更新:我认为出现问题是因为GitHub(不是Rawgit)将文件作为
.txt
文件提供,而Rawgit将文件作为
.js
提供


我仍然希望得到一个解释,解释为什么使用
.js
扩展名获取我的JavaScript文件不起作用,尽管

对于RawGit,您会得到
内容类型:application/JavaScript;charset=utf-8
如预期,GitHub提供
内容类型:text/plain;字符集=utf-8
。这似乎是唯一的区别

我检查了您的示例,发现当使用RawGit(并获得脚本响应)时,
success
回调根本不会执行,但使用GitHub它会执行(例如,添加一个
console.log('foo');
语句)。我还发现在脚本上运行
eval()
会引发异常:

Uncaught ReferenceError: createFont is not defined
我自己用一个语法正确的占位符JS文件进行了一次repo,在这种情况下,
success
callbacks for
$。get()
在RawGit和GitHub上都执行了,后来添加了对未定义名称的引用,这导致对RawGit URL的调用无法执行其回调

教训?当你得到一个带有
$.get()
的脚本时,它实际上会立即执行,如果
eval()
失败,那么一切都会在那里无声地结束。这得到了的支持,这也意味着(在我看来)这种处理脚本数据的疯狂方式在版本2.1.0中结束了

这让我建议,除了修复脚本之外,您还应该使用
$.getScript()
(不确定是否必须确保结果头具有
application/javascript
),或者显式插入带有JS的脚本元素并具有
onload
回调:

(function(d, script) {
    script = d.createElement('script');
    script.type = 'text/javascript';
    script.async = true;
    script.onload = function(){
        // remote script has loaded
    };
    script.src = '[RawGit URL]';
    d.getElementsByTagName('head')[0].appendChild(script);
}(document));
此外,您使用的
with
块应为:

var sketchProc = function (processing) { 
    processing.size(400, 400); 
    processing.frameRate(30); 
}

var canvas = $('#game'); // use jQuery since you have it 
var processingInstance = new Processing(canvas, sketchProc);

// game code now manipulates `processingInstance`
// either directly in scope (or even better as object with parameter)
processingInstance.draw = function () {
    var processing = this;
    // if your code originally used `processing` throughout,
    // do this so that it refers to the specific instance you've created
    // ...
}
processingInstance.loop();
// if initialized without a `.draw()` method like above, you need to start the loop manually once there is one 

Processing.js文档中有很多基本上是Java语言的示例,需要进行一些小的修改才能正确处理js scope.Sad!

非常感谢您的努力,但还有一点我不明白:如果我的代码的问题是jQuery执行脚本时甚至没有运行回调,那么ow将避免这种行为(我不希望执行脚本,只希望执行回调,因为我正在对包含脚本的字符串使用
eval()
)。当
$.get()
接收到它被告知是JavaScript的数据时,它调用
$.globalEval()
,将该内容作为参数,运行
eval()
在全局范围内的数据上。这是默认行为,您似乎无法更改它。您的问题是,当脚本在全局范围内执行时,它会抛出一个错误,因为(至少一个)引用了全局范围内未定义的变量,所以
$.get()的其余部分
,其中包括对结果运行回调,但以静默方式失败。有几种不同的方法可以解决此问题。是的,对未定义函数和变量的调用是因为代码使用了一个名为Processing.js的库,其中包含许多用于在画布标记中绘制和设置元素动画的预定义函数。这就是我需要修改的原因e只能在回调中执行。我想我会继续让Ajax代码以文本文件的形式接收代码,这就解决了问题。谢谢你向我解释这个问题,它让我发疯。我会给你奖金为什么你要动态加载脚本?因为我需要用Ajax cal执行的回调函数l、 你还有什么建议?