2013-05-22 60 views
2

我正在构建一个Meteor.js应用程序,我想要做的事情之一是从保存的页面拉标题和元描述标签。我正在使用this cross domain program,并有一半的代码工作。跨域JavaScript - 拉Meta标签

这是摘录;它需要在标签“URL”形式给出的值,并运行代码:

$.get(url, function(response){ 
     if ((suggestedTitle=((/<title>(.*?)<\/title>/m).exec(response.responseText))) != null){ 
      $('#title').val(suggestedTitle[1]); 
     }else{ 
      $('#title').val(url); 
     } 
     if ((suggestedDesc=($('meta[name=description]').attr('content'))) != undefined){ 
     $('#desc').val(suggestedDesc[1]); 
     }else{ 
     $('#desc').val('Description for this page cannot be found.'); 
     } 
    }); 

我承认它不是使用正则表达式解析HTML(听取各种意见的替代最好的做法,但我没有看过但是除此之外,该脚本成功从URL中提取标题或返回Web地址(如果无法找到该地址),但描述失败并仅返回后备文本。希望得到一些帮助,谢谢:)

+0

使用'$(response.responseText).find('meta [name =“description”]')'或其他。没有'$(response.responseText)'部分,你没有看到回应 - 你会看当前页面。既然你已经知道使用正则表达式不是解析HTML的好方法,那么让jQuery以正确的方式去做;那么只需遍历该DOM对象 – Ian

+0

我已经试过这个,但由于某种原因仍然无法让它工作......它告诉我的响应是未定义的。我在页面上添加了一个元描述,看看它是否会尝试拉取该元素...您是否有更长的代码示例? – brandonjschwartz

+0

我刚刚添加了一个似乎可行的答案。我希望它有帮助! – Ian

回答

1

而不是使用正则表达式或jQuery来解析响应,使用DOM方法来通过响应文本。试试这个:

$.ajax({ 
    url: "http://www.google.com", 
    type: "GET", 
    async: true 
}).done(function (response) { 
    var div = document.createElement("div"), 
     responseText = response.results[0], 
     title, metas, meta, name, description, i; 
    div.innerHTML = responseText; 
    title = div.getElementsByTagName("title"); 
    title = title.length ? title[0].innerHTML : undefined; 
    metas = div.getElementsByTagName("meta"); 
    for (i = 0; i < metas.length; i++) { 
     name = metas[i].getAttribute("name"); 
     if (name === "description") { 
      meta = metas[i]; 
      description = meta.getAttribute("content"); 
      break; 
     } 
    } 
    console.log("Title:", title); 
    console.log("Description:", description); 
}).fail(function (jqXHR, textStatus, errorThrown) { 
    console.log("AJAX ERROR:", textStatus, errorThrown); 
}); 

DEMO:http://jsfiddle.net/KLdsG/3/

我把你在上面提供的(它的精缩所以它会适合你仍然可以看到你自己的代码

显然插件,它使用http://www.google.com,但你应该能够放入任何URL并且它的工作原理是一样的,而且你可以把它放到一个可重复使用的函数中 - 我只是想举个例子,我认为它和$.get()的作用相同,而不是$.ajax()

您不能直接使用response.responseText,因为返回的项目是由几件事组成的对象。要获取HTML,您可以使用response.results[0]response.results显然是一个数组,我不确定还有什么可以在那里(如索引1,2,3等)。

当我尝试使用$(response.results[0])时发现了奇怪的事情,所以我只是坚持正常的DOM操作。