2014-12-06 38 views
0

我最近開始使用Node.js和Socket.io,並且在「發送」套接字函數時遇到了一些問題。 這裏我的代碼:Node.js和Socket.io我怎麼能發射DOM對象,而它似乎不可能?

var socket = io.connect(':1337'); 
function Object(id, urlImg){ 
     this.id = id; 
     this.image = new Image(); 
     this.image.url = urlImg; 
    } 

    var myObject = new Object(1, "img/myImg.jpg"); 

    socket.emit("myEvent", myObject); 

我從socket.io.js這個錯誤:

Uncaught RangeError: Maximum call stack size exceeded 

,如果我刪除的對象new Image()此代碼纔有效。所以我有嘗試類似:

socket.emit("myEvent", new Image()); 

socket.emit("myEvent", $("#id")); 

或再次

socket.emit("", document.getElementById("id")); 

,但我也有同樣的錯誤消息。所以,如果我嘗試直接發送參數中的DOM對象或我的對象參數中的DOM對象,則會出現此問題。如何才能發出DOM對象?

+0

爲什麼你就不能只發送圖像網址是什麼? – 2014-12-06 17:28:51

回答

1

您無法通過webSocket發送DOM對象。 socket.io將嘗試將對象序列化爲JSON,以便它可以發送該JSON,並且所有DOM對象都包含循環引用,這些引用在正常序列化時將失敗。

你應該做的只是抓住你需要的屬性,發送這些屬性,然後在接收端,你可以在那裏建立一個DOM對象,並有相應的屬性。

在您的特定示例中,您可以發送id和圖像url,然後在其他接收瀏覽器中使用這些屬性構建DOM對象。

如果重要的性能派的變量命名idurlImg,那麼你可以這樣做:

socket.emit("myEvent", {id: id, url: urlImg}); 
+0

謝謝我已經這樣做了,它效果很棒!我注意到我也不能發送對象方法,我不知道爲什麼!當我將它發送到另一個套接字時,我必須將函數重新賦給我的對象:/。我認爲這也是不可能的?謝謝 :) – 2014-12-08 08:57:35