javascript bookmarklet дает синтаксическую ошибку на '()' - PullRequest
1 голос
/ 17 ноября 2010

Я пытаюсь создать букмарклет, который загрузит обсуждение Hacker News для страницы, на которой я нахожусь, если она существует.

Вот код, который у меня есть для запуска в REPL файла node.js:

// 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();
//})();

Это работает как ожидалось. (Он использует небольшой файл для имитации XMLHttpRequest в узле.)

Раскомментирование строк определения функции (и удаление других вещей node-js) дает мне симпатичную небольшую однострочную строку, однажды упакованную :

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 Ответ

3 голосов
/ 17 ноября 2010

Это потому, что ваш ответ пустой (из-за той же политики происхождения ) в основном выполняет это:

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