2013-05-07 108 views
1

我有一個未執行的回調函數。我懷疑它被視爲一個字符串,但我不確定。 代碼如下。 此外,這裏有一個簡化的jsFiddle更詳細:http://jsfiddle.net/oakley808/sH5XE/3/Javascript回調函數未執行

基本上它只是迭代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 
); 

} 

回答

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 
    } 
    ] 
}  
1

jsFiddle Demo

那是因爲它只是一個字符串。你可以做什麼只是讓這些持有你的RSS功能的對象,然後使用字符串訪問調用函數

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

然後

cbHolder[config.feeds[i].cb] 
0

你在這是正確的,你是唯一當這個.rss插件期待一個函數時傳遞一個字符串。你不能激發一個字符串。

如果您想要引用一個函數作爲字符串引用,那麼您將需要引用該函數作爲某個作用域對象的方法。

例如:

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

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

executeCallback('something', obj) 

在這裏看到: http://jsfiddle.net/sH5XE/4/

0

解決方案1 ​​

該解決方案是證明3僅在配置對象可以是一個真正的JS對象。

Fiddle with the solution 1

解決方案2

如果你要找回你的配置對象throught 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