2

我有以下 Javascript 代码,其中 feed 是 rss feed 的有效 url。

jQuery(function() {

        jQuery.getFeed({
            url:feed,
            success: function(feed){
                      alert(feed);
                      }
        });
    });}

当我运行这个警报永远不会出现。使用萤火虫我可以看到正在建立的连接和来自提要的响应。

注意:我知道这是一个安全问题,并且某些浏览器会阻止它,目前情况并非如此,因为我已经解决了该问题并且浏览器不再阻止连接

编辑:由于某种原因,我无法在此处显示评论:

该调用目前没有被脚本代理,因为这是一个测试,我只是覆盖了浏览器安全设置:

netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead");
4

4 回答 4

3

根据您提供的信息,我们可以看到您的呼叫是正确的。问题可能出在其他地方。建议您挖掘 jFeed 源代码并在 $.ajax 成功方法中禁用提要解析:

    $.ajax({
        type: 'GET',
        url: options.url,
        data: options.data,
        dataType: 'xml',
        success: function(xml) {
            var feed = xml; // <== was "var feed = new JFeed(xml);"
            if(jQuery.isFunction(options.success)) options.success(feed);
        }
    });

如果您的警报弹出,这是一个提要解析问题。在这种情况下,您可以检查 xml 是否正确并在此处提交以供进一步调查。


我已经运行了一些测试并检查了 jQuery 代码。您说您解决了浏览器安全问题:我猜您在服务器上安装了一个代理脚本,该脚本将从远程服务器下载 rss 文件,然后将其传输到您的 ajax 请求(因为浏览器会阻止 ajax 调用服务器与您的页面所在的服务器不同)。当使用 dataType : 'xml' 进行 ajax 调用时,jQuery 期望响应的内容类型包含字符串“xml”:

var ct = xhr.getResponseHeader("content-type"),
  xml = type == "xml" || !type && ct && ct.indexOf("xml") >= 0,
  data = xml ? xhr.responseXML : xhr.responseText;

以下是我的问题:

  • 您是否像我想的那样使用脚本作为代理脚本?
  • 此脚本是否将内容类型设置为包含 xml 的内容?

这是 jFeed 附带的一个简约的 php 示例:

<?php
header('Content-type: application/xml');
$handle = fopen($_REQUEST['url'], "r");

if ($handle) {
    while (!feof($handle)) {
        $buffer = fgets($handle, 4096);
        echo $buffer;
    }
    fclose($handle);
}
?>
于 2009-03-19T13:23:34.617 回答
2

只是为那些需要使用自定义名称空间从提要中获取内容的人添加它,使用 jFeed,您可以执行类似的操作

<dc:creator>SomeBody Name</dc:creator>
<media:thumbnail url="someimage.jpg" />

将您自己的项目添加到 JFeed Prototype

JFeedItem.prototype = {
        title: '',
        link: '',
        description: '',
        updated: '',
        id: '',
        mcontent:'',
        mdescr:'',
        mcredit: '',
        dcreator:'',
        mthumbnail:''
    };

然后在您使用的 JRss 和 JAtom 的原型中,添加以下项目循环

item.dcreator = $(this).find("dc\\:creator").eq(0).text();
item.mcontent = $(this).find("media\\:content").eq(0);
item.mdescr = $(this).find("media\\:description").eq(0).text();
item.mcredit = $(this).find("media\\:creator").eq(0).text();
item.mthumbnail = $( $(this).find("media\\:thumbnail").eq(0) ).attr("url");

希望这一天能帮助那些在使用 jQuery 处理 xml 中的命名空间时遇到困难的人。我正在使用 NYT 的 RSSfeeds,需要让媒体缩略图显示在视频内容的链接中,并且不得不花一些时间来弄清楚如何通过命名空间工作

于 2009-08-09T18:34:12.833 回答
0

我有一个类似的问题。尝试将 URL 硬编码到 url: 中,看看是否可行,而不是设置提要变量。

您在段的末尾有一个额外的 },这只是代码的额外部分吗?

于 2009-03-19T12:24:17.507 回答
0

如果您想从自定义命名空间中读取内容,还有一件事:

上面的('转义冒号')方法在 Chrome 中无法正常工作,但这种('nodeName')方法将在所有浏览器中工作:

item.mediaThumbnail = $($(this).find("[nodeName=media:thumbnail]").eq(0)).attr("url");

于 2010-03-09T10:12:52.767 回答