javascript bookmarklet在'()'上出现语法错误

时间:2010-11-17 03:09:12

标签: javascript bookmarklet

我正在尝试创建一个书签,它将加载我正在访问的页面的黑客新闻讨论,如果它存在的话。

这是代码,因为我可以在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每晚都不想合作。

对此的解决方案可能很快就会出现(通常我会在解释本文框中的所有内容的过程中弄清楚),但我想我会对此有所帮助。真的很困扰我。 :/

1 个答案:

答案 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.');
        }
    }
});