javascript - 对象没有方法 'apply'

标签 javascript jquery

我正在动态地创建一些 DOM 元素,例如,

var anchorElement = jQuery('<a />',{text:property.text});
var liElement = jQuery('<li />',{"class":"navlink_"+i,id:"navlink_"+i});
anchorElement.on('click',property.fnctn);
liElement.append(anchorElement);
parentID.append(liElement);

其中 property 是一个 JSON 对象。 property.text 是我想放入 anchor 元素的文本。 (工作正常)

我想将点击事件处理程序附加到该 anchor 元素。 需要绑定(bind)到该元素的函数在 JSON 中指定,我们可以像这样访问它

property.fnctn

以下行应将事件处理程序绑定(bind)到 anchor 元素。

anchorElement.on('click',property.fnctn);

这行不通,所以我尝试将其转换为字符串,例如

anchorElement.on('click',property.fnctn.toString());

没有成功...

当我点击这个链接时,错误记录在控制台中

该对象没有“应用”方法。 这是什么原因……???

我可以通过像

这样的轻微变通来让它工作
anchorElement.attr('onclick',property.fnctn+"()");

上面的语句有效,但我想知道为什么 .on() API 不工作。

谢谢 :) AÐitya.

最佳答案

更新:

你说过 property.actfn 是一个字符串,"paySomeoneClick"。最好不要将字符串用于事件处理程序,而是使用函数。如果您希望调用字符串中定义的函数 paySomeoneClick,并且该函数是全局函数,您可以这样做:

anchorElement.on('click',function(event) {
    return window[property.fnctn](event);
});

这是可行的,因为全局函数是全局对象的属性,可以通过浏览器上的 window 访问,并且因为下面描述的括号符号。

如果函数在您引用的对象上,则:

anchorElement.on('click',function(event) {
    return theObject[property.fnctn](event);
});

之所以可行,是因为在 JavaScript 中,您可以通过两种方式访问​​对象的属性:使用文字属性名称的点符号(foo.bar 访问 bar 属性 foo) 和带字符串属性名称的括号表示法 (foo["bar"])。它们是等效的,当然除了括号中的符号外,字符串可以是表达式的结果,包括来自 property.fnctn 等属性值。

但我建议退后一步并进行一些重构,这样您就不会在字符串中传递函数名称。 有时这是正确的答案,但根据我的经验,这种情况并不常见。 :-)

原始答案:

(假设 property.fnctn 是一个函数,而不是字符串。但可能对某些人有用...)

代码

anchorElement.on('click',property.fnctn);

会将函数附加到事件,但在调用函数期间,this 将引用 DOM 元素,不是您的属性对象。

要解决这个问题,请使用 jQuery 的 $.proxy :

anchorElement.on('click',$.proxy(property.fnctn, property));

...或 ES5 的 Function#bind :

anchorElement.on('click',property.fnctn.bind(property));

...或闭包:

anchorElement.on('click',function(event) {
    return property.fnctn(event);
});

更多阅读(在我的博客上):

关于javascript - 对象没有方法 'apply',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11666301/

相关文章:

javascript - 运算符(operator)执行顺序

javascript - 在 chrome、safari 和 IE 中重新加载选定的索引

javascript - 在 Gridster 上,拖动期间将小部件保持在鼠标下方

javascript - 当用户名和传递请求通过ajax完成时如何重定向页面

javascript - 如何从异步调用返回响应?

javascript - 尝试针对特定菜单项以仅更改菜单 CSS 中的前四项

javascript - Bootstrap 进度条动态元素 - 动态改变宽度

javascript - html页面加载数据后的$http.get成功事件

javascript - 对同步 AJAX 请求的 ASP.NET MVC 操作

javascript - 使用变量全局替换字符串