Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/410.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
从html动态调用javascript对象函数_Javascript_Html_Function_Object - Fatal编程技术网

从html动态调用javascript对象函数

从html动态调用javascript对象函数,javascript,html,function,object,Javascript,Html,Function,Object,我正在开发一种基于javascript文本的游戏引擎。我有一个带有“onuse”方法的javascript对象。当我这样使用它时,它的效果非常好: var button = new CanvasObject(); button.text = "test" // Necessary for the next code sample button.onuse = function(){ button.x += 1 }; // Some simple reaction; innerHTML += (

我正在开发一种基于javascript文本的游戏引擎。我有一个带有“onuse”方法的javascript对象。当我这样使用它时,它的效果非常好:

var button = new CanvasObject();
button.text = "test" // Necessary for the next code sample
button.onuse = function(){ button.x += 1 }; // Some simple reaction;
innerHTML += ( "<span onclick=' + buttonObjectInstance.name + ".onuse()'>" );
var startButton = ButtonObject('startButton');
我在画布对象中有一段代码,当绘制CanvaObject时,会将其包装在一个span标记中,如下所示:

<span onclick = "function{ button.x += 1 }">test</span>
// Or to make the HTML cleaner:
<span onclick = canvas.callFunction(5)>test</span>
// where canvas.callFunction will call the function needed.
// Canvas keeps an array of functions that can be called.
当我使用第一种技术从HTML调用函数时,我的引擎只会将其作为匿名函数调用。然后,“this”将被定义为窗口。我希望ButtonObject的每个实例都具有相同的“onuse”函数,因此每次定义它时,就像我对CanvaObject所做的那样,似乎都需要很多额外的代码。我想到的一个可能的解决方案是修改引擎的工作方式,使每个对象都有一个“name”属性,这相当于它的javascript名称。这样,引擎就可以像这样简单地编写字符串:

var button = new CanvasObject();
button.text = "test" // Necessary for the next code sample
button.onuse = function(){ button.x += 1 }; // Some simple reaction;
innerHTML += ( "<span onclick=' + buttonObjectInstance.name + ".onuse()'>" );
var startButton = ButtonObject('startButton');

这真的是我唯一的选择吗?或者有没有方法在对象的上下文中调用函数而不必知道该对象的名称

将函数绑定到此,以备以后使用:

ButtonObject.method('onuse', function(){
   this.x++; // Some function requiring 'this'.
} .bind(ButtonObject)  );

当然,如果不是调用上下文中的ButtonObject,请将其绑定到包含您的方法的任何对象。

可能只是星期五,但是说什么?听起来您需要将该方法添加到对象的
原型中,但我真的不知道您在做什么。@Mathletics-我之前使用过这种方法,但我将其更改为Douglass Crockford的技术,如问题中所链接的。这允许我让ButtonObject从CanvaObject继承所有函数。据我所知,这不会导致代码中与我的问题相关的任何问题。对象函数仍然像“button.doSomething()”一样被调用。这无疑是朝着正确方向迈出的一步,所以谢谢你。现在的问题是,我的函数无法识别构造函数中未定义的函数。例如,我有另一个
ButtonObject.method('render',function(){etc..})
。当我试图在绑定'onuse'中调用它时,它说该方法不存在。我相信这是因为它只绑定构造函数;我不确定剩下的代码是什么样子的。啊,谢谢你,这基本上解决了这个问题。我将方法定义放入构造函数中,并将其绑定到“this”。我担心“继承”代码会覆盖我的函数,但结果很好。