Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将函数内容移动到外部文件_Javascript_Html_Ajax_Json_Canvas - Fatal编程技术网

Javascript 将函数内容移动到外部文件

Javascript 将函数内容移动到外部文件,javascript,html,ajax,json,canvas,Javascript,Html,Ajax,Json,Canvas,我在HTML5画布上使用kinetic.js。我创建了一个形状如下的层: var layer = new Kinetic.Layer(); var tile = new Kinetic.Shape({ sceneFunc: function(context) { context.fillStyle="rgb(255,255,255)"; context.beginPath(); context.moveTo(256,197); context.lineTo(1

我在HTML5画布上使用kinetic.js。我创建了一个形状如下的层:

var layer = new Kinetic.Layer();
var tile = new Kinetic.Shape({
  sceneFunc: function(context) {
    context.fillStyle="rgb(255,255,255)";
    context.beginPath();
    context.moveTo(256,197);
    context.lineTo(177,241);
    context.bezierCurveTo(172,237,167,232,162,228);
    context.lineTo(0,100);
    context.fill();
  }
});
layer.add(tile);
现在我需要将sceneFunc中的所有内容移动到一个外部文件中。将来会有很多不同形状的文件。然后我需要能够加载外部文件并在sceneFunc中执行代码。例如:

var layer = new Kinetic.Layer();
var tile = new Kinetic.Shape({
  sceneFunc: function(context) {
    //call and execute shape code here
  }
});
layer.add(tile);
在单独的文件中包含以下代码:

context.fillStyle="rgb(255,255,255)";
context.beginPath();
context.moveTo(256,197);
context.lineTo(177,241);
context.bezierCurveTo(172,237,167,232,162,228);
context.lineTo(0,100);
context.fill();
有没有办法做到这一点?我知道我可以创建外部文件的脚本标记,但这将在sceneFunc函数之外执行代码。使用带有XMLHttpRequest的ajax调用并使用eval对其进行解析也是如此


如何从外部文件读取代码,然后在正确的位置执行它

你不能完全按照你想做的去做,但你可以这样做:

创建一个形状函数数组

var shapes=[];
然后在小文件中有如下内容

shapes.push(function(context){
  context.fillStyle="rgb(255,255,255)";
  // shape drawing code here
});
shapes.forEach(function(shape) {
  shape(context);
});
在数组声明之后使用标记加载小文件,然后在场景中执行以下操作

shapes.push(function(context){
  context.fillStyle="rgb(255,255,255)";
  // shape drawing code here
});
shapes.forEach(function(shape) {
  shape(context);
});

您可以使用XHR和eval执行类似的操作,在这种情况下,您可以通过编程方式添加shapes.push内容,而不是将其放在小文件中,但您需要仅在加载所有形状后异步调用形状创建。

。如果可能的话,我一直在努力避免创建脚本标记。您是否能够使用XHR和eval展示您的其他建议的示例?使用eval是否不安全?另外,当我使用JS创建脚本标记并将其附加到doc头时,shapes数组直到我请求查看之后才填充。因此,我最后看到的是一个空数组……是的,如果您以编程方式注入脚本,则需要执行类似的异步操作,或者在注入其他脚本之后,也可以注入调用Kinetic.js的脚本。很抱歉,我现在没有时间创建一个使用XHR的示例,但我想到的是使用XHR或jquery或其他XHR包装器启动异步请求,跟踪有多少处于活动状态,并在请求的回调中检查它是否是最后一个,如果是,则调用Dynamics。如果您完全控制了所有脚本(在本例中就是这样),那么eval是安全的。