我有一个没有执行的回调函数。我怀疑它被视为字符串,但我不确定。 代码如下。 另外,这里有一个简化的jsFiddle,其中包含更多详细信息:http://jsfiddle.net/oakley808/sH5XE/3/
基本上它只是使用对象的设置迭代for循环。最后一行config.feeds[i].cb
失败了。任何想法?
// the callback function
function rssdone(){
$('#cbBlock').append('did some callback stuff<br>');
}
// the settings for the loop below
var config = {
"feeds": [
{
"container": "#block1",
"url":"http://apps1.eere.energy.gov/news/rss/program.cfm?topic=1010",
"limit":"4",
"layoutTemplate": "<ol type='1'>{entries}</ol>",
"entryTemplate": "<li>{title}</li>",
"cb":"rssdone"
},
{
"container": "#block2",
"url":"http://apps1.eere.energy.gov/news/rss/financial_opps_solar.cfm",
"limit":"2",
"layoutTemplate": "<ol type='A'>{entries}</ol>",
"entryTemplate": "<li>{title}</li>",
"cb":"rssdone"
}
]
}
// the logic
for( var i=0; i < config.feeds.length; i+=1 ) {
$( config.feeds[i].container ).rss(
config.feeds[i].url,
{
limit: config.feeds[i].limit,
layoutTemplate: config.feeds[i].layoutTemplate,
entryTemplate: config.feeds[i].entryTemplate
},
// this fails to use the callback for some reason
config.feeds[i].cb
// use this instead and it works!
// rssdone
);
}
答案 0 :(得分:2)
是的,您将配置对象存储为json而不是js对象。引号使它被视为一个字符串。删除&#34; rssdone&#34;周围的引号引用,它应该工作:
var config = {
"feeds": [
{
"container": "#block1",
"url":"http://apps1.eere.energy.gov/news/rss/program.cfm?topic=1010",
"limit":"4",
"layoutTemplate": "<ol type='1'>{entries}</ol>",
"entryTemplate": "<li>{title}</li>",
"cb":rssdone
},
{
"container": "#block2",
"url":"http://apps1.eere.energy.gov/news/rss/financial_opps_solar.cfm",
"limit":"2",
"layoutTemplate": "<ol type='A'>{entries}</ol>",
"entryTemplate": "<li>{title}</li>",
"cb":rssdone
}
]
}
答案 1 :(得分:1)
的 jsFiddle Demo
强> 的
那是因为它只是一个字符串。你可以做的只是创建一个持有rss函数的对象,然后使用字符串访问器来调用函数
var cbHolder = {};
cbHolder.rssdone = function(){
$('#cbBlock').append('did some callback stuff<br>');
};
然后
cbHolder[config.feeds[i].cb]
答案 2 :(得分:0)
你是正确的,因为你只是在这个.rss插件期待一个函数时传递一个字符串。你不能发射一个字符串。
如果要激活一个以字符串形式引用的函数,则需要将该函数作为某个范围对象的方法引用。
例如:
var obj = {
something: function () {
alert('here')
}
}
function executeCallback (reference, scope) {
scope[reference]()
}
executeCallback('something', obj)
答案 3 :(得分:0)
只有配置对象可以是真正的js对象时,此解决方案才适用。
如果要通过AJAX检索配置对象并且它将是JSON对象,则无法从中引用回调函数。在这种情况下,一种可能的方法是将回调函数存储在全局作用域(窗口对象)上,并使用变量名来引用该函数:
// the callback function
window.rssdone = function(){
$('#cbBlock').append('did some callback stuff<br>');
};
// the settings for the loop below
var config = {
"feeds": [
{
...
"cb":"rssdone"
},
{
...
"cb":"rssdone"
}
]
} ;
// the logic
for( var i=0; i < config.feeds.length; i+=1 ) {
$( config.feeds[i].container ).rss(
config.feeds[i].url,
{
limit: config.feeds[i].limit,
layoutTemplate: config.feeds[i].layoutTemplate,
entryTemplate: config.feeds[i].entryTemplate
},
// reference to the callback on the global scope
window[ config.feeds[i].cb ];
);
}