2010-11-17 3 views
1

Я пытаюсь сделать букмарклет, который будет загружать обсуждение Hacker News для страницы, на которой я включен, если она существует.javascript bookmarklet дает синтаксическую ошибку в '()'

Вот код, как я его запустить в РЕПЛ Node.js'S:

// 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 в узле.)

раскомментировать строки определения функции (и удаление другого узла-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 не хотят сотрудничать на данный момент.

Решение этого, вероятно, скоро придет ко мне (как правило, я выясню это из процесса объяснения всего в этом текстовом поле), но, полагаю, я был бы признателен за любую помощь в этом. Меня это очень беспокоит. :/

ответ

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

Все, кого я думал, что SO должен был дать мне один из этих баров наверху, когда кто-то бьет меня до ответа :( – Domenic

+0

@Domenic: он использует случайный опрос, а не ожидающий опрос (поддерживая единственное соединение, пока что-то не произойдет) или современный способ WebSockets PUSH (fo r новых браузеров). Это означает, что вы не можете узнать минутку или два. Иногда вредителем. –

+0

А, я помню, как раньше бегал по этому поводу. Хотя ваше решение предотвращает возникновение ошибки, это не помогает моей реальной проблеме. Но это, я полагаю, для другого вопроса, и это было задано много раз. –

Смежные вопросы