Javascript回调函数没有执行

时间:2013-05-07 23:00:56

标签: javascript

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

答案 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)

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

答案 3 :(得分:0)

解决方案1 ​​

只有配置对象可以是真正的js对象时,此解决方案才适用。

Fiddle with the solution 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 ];
  );
}

Fiddle with the solition 2