Javascript Bookmarklet无响应

时间:2013-03-06 20:25:01

标签: javascript regex bookmarklet

Javascript newb here。创建书签以自动执行简单的任务。主要是学习练习。它将扫描CNN.com上的成绩单,例如:(http://transcripts.cnn.com/TRANSCRIPTS/1302/28/acd.01.html)。它将抓取页面顶部的主要故事,节目中访客的名称和标题,并对其进行格式化,以便将它们复制粘贴到另一个文档中。

我想出了一个简单的版本,其中包含一些抓取子标题的jQuery,然后使用正则表达式来查找guest虚拟机的名称(它还将排除(begin videoclip)和(end videoclip)之间的所有内容,但我还没有那么远。它会提醒他们(最终会在弹出窗口中打印出来,警报只是为了排除故障)。

我正在使用http://benalman.com/code/test/jquery-run-code-bookmarklet/来创建书签。我的问题是,一旦创建了bookmarklet,它就完全没有响应。点击它没有任何反应。我已经尝试过最小化代码而没有结果。我的猜测是cnn.com的javascript与我的冲突,但我不知道如何解决这个问题。或者我是否需要包含一些代码来加载和存储当前页面上的文本?这是代码(我已经包含了注释,但是当我使用bookmarklet生成器时,我把它们拿出来了。)感谢您的帮助!

//Grabs the subheading
var leadStories=$(".cnnTransSubHead").text();
//Scans the webpage for guest name and title.  Includes a regular expression to find any
//string that starts with a capital letter, includes a comma, and ends in a colon.  
var scanForGuests=/[A-Z ].+,[A-Z0-9 ].+:/g;
//Joins the array created by scanForGuests with a semicolon instead of a comma
var guests=scanForGuests.join(‘; ‘);
//Creates an alert in the proper format including stories and guests.
alert(“Lead Stories: “ + leadStories + “. ” + guests + “. SEE TRANSCRIPT FIELD FOR FULL TRANSCRIPT.“)   

1 个答案:

答案 0 :(得分:0)

转到该页面。打开开发人员工具(在chrome中使用ctrl + shift + j)并将代码粘贴到控制台中以查看错误。


$中的var leadStories = $(".cnnTransSubHead").text();来自jQuery,提供的链接没有加载到页面中的jQuery。

在任何现代浏览器上,你应该能够在没有jQuery的情况下获得相同的结果:

 var leadStories = document.getElementsByClassName('cnnTransSubHead')
     .map(function(el) { return el.innerText } );

接下来我们有:

var scanForGuests=/[A-Z ].+,[A-Z0-9 ].+:/g;
var guests=scanForGuests.join('; ');

scanForGuests是一个正则表达式,你实际上从未将它与任何东西相匹配 - 所以.join()会抛出一个错误。我不确定你要做什么。您是否正在尝试扫描该正则表达式的页面全文?在这种情况下,这样的事情将是你最好的选择

document.body.innerText.match(scanForGuests);

请记住,虽然innerText删除了html标记,但它远非完美,其中弹出的内容非常受页面html结构的影响。也就是说,在我的快速测试中它似乎有效。

最后,对于类似这样的事情,您应该使用immediately invoked function,或者将所有变量都粘贴到全局上下文中。

所以把它们放在一起就可以得到这样的东西:

(function() {
     var leadStories = document.getElementsByClassName('cnnTransSubHead')
         .map(function(el) { return el.innerText } );
    var scanForGuests=/[A-Z ].+,[A-Z0-9 ].+:/g;
    var guests = document.body.innerText.match(scanForGuests).join("; ");
    alert("Leads: " + leadStories + " Guests: " + guests);
})();