我正在尝试创建一个书签,它将加载我正在访问的页面的黑客新闻讨论,如果它存在的话。
这是代码,因为我可以在node.js的REPL中运行:
// node.js stuff
require.paths.unshift('.');
var sys = require('util');
var alert = sys.puts;
var XMLHttpRequest = require("XMLHttpRequest").XMLHttpRequest;
//javascript: (function () {
//url = 'http://api.ihackernews.com/getid?url=' + encodeURIComponent(window.location.href);
url = 'http://api.ihackernews.com/getid?url=' + encodeURIComponent('http://blog.asmartbear.com/self-doubt-fraud.html');
http = new XMLHttpRequest();
http.open("GET", url, true);
http.onreadystatechange = (function () {
if (this.readyState == 4) {
alert('foo');
var ids = eval('(' + this.responseText + ')');
if (ids.length > 0) {
ids.reverse();
//window.href = ids[0];
alert(ids[0]);
} else {
alert('No stories found.');
}
}
});
http.send();
//})();
这可以按预期工作。 (它利用a little file在节点中模拟XMLHttpRequest。)
取消注释函数定义行(并删除其他node-js的东西)给我一个很好的小单行,一次packed:
javascript:(function(){url='http://api.ihackernews.com/getid?url='+encodeURIComponent(window.location.href);http=new XMLHttpRequest();http.open("GET",url,true);http.onreadystatechange=(function(){if(this.readyState==4){alert('foo');var ids=eval('('+this.responseText+')');if(ids.length>0){window.href=ids[0]}else{alert('No stories found.')}}});http.send()})();
然而,运行它会提示Firefox的错误控制台给我一个非常有帮助的消息“语法错误”,然后是“()”一个指向第二个括号后面的错误。
我没有使用Firebug,因为它的夜间和Firefox每晚都不想合作。
对此的解决方案可能很快就会出现(通常我会在解释本文框中的所有内容的过程中弄清楚),但我想我会对此有所帮助。真的很困扰我。 :/
答案 0 :(得分:3)
这是因为您的回复是空白的(由于same origin policy)基本上是执行此操作:
eval('()'); //SyntaxError: Unexpected token )
你需要添加一个检查是否有响应,如下所示:
http.onreadystatechange = (function () {
if (this.readyState == 4) {
if(this.responseText) { //was the response empty?
var ids = eval('(' + this.responseText + ')');
if (ids.length > 0) {
ids.reverse();
window.href = ids[0];
}
} else {
alert('No stories found.');
}
}
});