我对javascript比较陌生,我面临一些困难。我有两个java脚本文件,如下所示。我在获取getRss函数内的变量entry_title的值并将其存储在变量Rss1_title和Rss2_title中遇到麻烦。创建一个全局变量并将其分配给entry_title将使事情变得更糟,因为我将无法知道标题来自哪个Rss url。是否有一个简单的方法来获得回调函数的值?
<script type="text/javascript" src="jsRss.js"></script>
<script type="text/javascript" src="notification.js"></script>
My notification.js file
function get_rss1_feeds(){
var Rss1_title = getRss("http://yofreesamples.com/category/free-coupons/feed/?type=rss");
}
function get_rss2_feeds(){
var Rss2_title = getRss("http://yofreesamples.com/category/real-freebies/feed/?type=rss");
}
setTimeout('get_rss1_feeds()',8000);
setTimeout('get_rss2_feeds()',7000);
我的jsRss.js文件:
function getRss(url){
if(url == null) return false;
google.load("feeds", "1");
// Our callback function, for when a feed is loaded.
function feedLoaded(result) {
if (!result.error) {
var entry = result.feed.entries[0];
var entry_title = entry.title; // need to get this value
}
}
function Load() {
// Create a feed instance that will grab feed.
var feed = new google.feeds.Feed(url);
// Calling load sends the request off. It requires a callback function.
feed.load(feedLoaded);
}
google.setOnLoadCallback(Load);
}
错误:
当setTimeout(get_rss1_feeds, 8000);方法调用时,我得到一个空白屏幕。我在控制台中得到一个错误,说八进制文字和八进制转义序列被弃用,它指向这个脚本中的第6行。是因为我使用谷歌api来解析我的Rss吗?
if (window['google'] != undefined && window['google']['loader'] != undefined) {
if (!window['google']['feeds']) {
window['google']['feeds'] = {};
google.feeds.Version = '1.0';
google.feeds.JSHash = '8992c0a2cdf258e5bd0f517c78243cd6';
google.feeds.LoadArgs = 'file75feeds46v 751';
}
google.loader.writeLoadTag("css", google.loader.ServiceBase + "/api/feeds/1.0/8992c0a2cdf258e5bd0f517c78243cd6/default+en.css", false);
google.loader.writeLoadTag("script", google.loader.ServiceBase + "/api/feeds/1.0/8992c0a2cdf258e5bd0f517c78243cd6/default+en.I.js", false);
}
由于它是一个不同的作用域,您可以在回调中返回它,或者以另一种方式提供它,例如将它导出到对所需位置可见的更高作用域。在本例中,它是全局作用域,所以我建议不要这样做。
function getRss(url, callback) {
//...
function feedLoaded(result) {
if (!result.error) {
var entry = result.feed.entries[0];
var entry_title = entry.title; // need to get this value
callback && callback(entry_title);
}
}
并这样命名
function get_rss1_feeds() {
var Rss1_title = getRss("http://yofreesamples.com/category/free-coupons/feed/?type=rss", function(entry_title) {
// This scope has access to entry_title
});
}
作为题外话,像这样使用setTimeout:
setTimeout(get_rss1_feeds, 8000);
而不是
setTimeout("get_rss1_feeds()", 8000);
,因为后者使用eval,而前者传递对函数的引用。
尽管这会使您的代码混乱,但您可以将变量附加到window对象。例如:
function a()
{
window.testStr = "test";
}
function b()
{
alert(window.testStr);
}
或者甚至创建自己的对象,而不是使用window,如下:
var MyRSSReader = {
TitleOne : '',
TitleTwo : ''
}
MyRSSReader.TitleOne = "My title";
维基百科有一篇关于全局变量的好文章,以及为什么全局变量不好。