2010-11-17 32 views
1

我試圖做一個書籤,將加載了黑客新聞的討論對我在,如果它存在的頁面。JavaScript的書籤給出了語法錯誤「()」

下面的代碼,因爲我有它在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的。)

取消對函數定義行(並刪除其他節點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的錯誤控制檯給我提供非常有用的消息「語法錯誤」,然後在第二個括號後面加上一個「()」錯誤。因爲它的夜間和Firefox的夜間不想在此刻配合我沒有使用Firebug

這個問題的解決可能會很快就到我這裏來(通常我弄明白從解釋在該文本框中一切的過程中),但我想我會很感激有這方面的幫助。這真的很困擾我。 :/

回答

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

噢人,我是這麼認爲的應該給我在頂部的酒吧之一,當有人打我一個答案:( – Domenic 2010-11-17 03:21:13

+0

@Domenic:它採用輪詢偶然,而不是等待輪詢(保持單個連接打開,直到出了事)或現代的WebSockets PUSH方式(fo新的瀏覽器)。這意味着你可能不會在一兩分鐘內找到答案。有時害蟲。 – 2010-11-17 03:37:46

+0

啊,我記得以前跑過這個。儘管您的解決方案確實可以防止發生錯誤,但它並不能幫助我解決實際問題。但是,我想,這是另一個問題,而且之前已經提過很多次。 – 2010-11-17 08:39:55