1

我有一个未执行的回调函数。我怀疑它被视为字符串,但我不确定。代码如下。此外,这里有一个简化的 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
  );

}
4

4 回答 4

2

是的,您将配置对象存储为 json 而不是 js 对象。引号导致它被视为字符串。从“rssdone”引用中删除引号,它应该可以工作:

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
    }
  ]
}    
于 2013-05-07T23:03:35.850 回答
1

jsFiddle Demo

那是因为它只是一个字符串。您可以做的只是创建一个包含您的 rss 函数的对象,然后使用字符串访问器调用该函数

var cbHolder = {};
cbHolder.rssdone = function(){
 $('#cbBlock').append('did some callback     stuff<br>');   
};

接着

cbHolder[config.feeds[i].cb]
于 2013-05-07T23:07:04.593 回答
0

您是正确的,因为您仅在此 .rss 插件需要一个函数时才传递一个字符串。你不能触发一个字符串。

如果您想触发作为字符串引用的函数,则需要将该函数作为某个范围对象的方法进行引用。

例如:

var obj = {
  something: function () {
    alert('here')
  } 
}

function executeCallback (reference, scope) {
   scope[reference]()
}

executeCallback('something', obj)

见这里:http: //jsfiddle.net/sH5XE/4/

于 2013-05-07T23:09:54.790 回答
0

解决方案 1

这个方案只有在config对象可以是真正的js对象的情况下才适用。

摆弄解决方案1

解决方案 2

如果您要通过 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 ];
  );
}

摆弄solition 2

于 2013-05-07T23:16:51.633 回答