在HTML中更改EventSource

时间:2014-05-27 10:44:23

标签: javascript php jquery

基本上,我尝试做的是将参数通过URL传递给php代码,但是,似乎在on message事件的函数体中,我无法更改资源。这是以下代码:

var source = new EventSource("get_message.php?latest_chat_ID=0");
var i = 0;
    $(source).on("message", function (event) {
        var data = event.originalEvent.data;

        ++i;

        source = new EventSource("get_message.php?latest_chat_ID=" + i);
        // $.post("get_message.php", {latest_chat_ID: 0}, function (data, status) {});

        $("#messages").html($("#messages").html() + data);
    });

我想知道 -

  1. 如何解决这个问题?
  2. 还有其他方法将数据发送到PHP页面吗? (我打算使用$ .post {} jQuery函数,但这将执行两次脚本 - 一次是从触发EventSource事件,一次是从.post {}请求执行?)
  3. 我也理解存在替代技术,例如WebSockets和诸如node.js之类的库,它们更适合双向通信。但是,我的大多数基本代码都是在考虑SSE实现的情况下编写的,我想坚持这一点。

1 个答案:

答案 0 :(得分:0)

如果您想继续使用SSE,我认为您需要重写与以下相似的内容。你现在所拥有的不起作用的原因是因为你只是在听第一个EventSource,而只是改变变量。更改时,jQuery不会重用该变量。另外,我可能会跳过使用jQuery,因为它会尝试缓存你不想缓存的东西。

var listenToServer = function(i) {
  source = new EventSource("get_message.php?latest_chat_ID=" + i);
  source.onmessage = function(event) {
    var data = event.originalEvent.data;
    $messages.html($messages.html() + data);
    listenToServer(i + 1);
  }
},
$messages = $('#messages'),
source;

listenToServer(0);

我也继续进行缓存$('#messages'),因此您不会反复创建新对象。在函数外部留下source,这样您就不必担心使用各种EventSource s进行垃圾回收。