防止JQuery .HTML在显示之前覆盖之前的.HTML

时间:2015-12-01 12:40:45

标签: javascript jquery html css

我目前正在使用多维数组存储值,然后根据它是否满足两个要求进行循环,数字是否匹配,是否具有设置状态E.G 487 Online。

这实际上会根据事件在服务器创意中捕获并插入MD数组中而实时发生变化,并且事情的一切都很重要。

尝试以下列格式直观地表示每个呼叫状态:

  1. 如果手机设备在线,则转为红色,否则变为绿色并执行.HTML。
  2. 如果手机响了,请转为黄色并执行.HTML。
  3. 如果电话正在通话中,请将磁贴转为橙色并执行.HTML。
  4. 如果手机只是挂断然后做.HTML(但它没有这样做)然后通过css类使用.addClass变成蓝色......然后在3秒后将其删除。 (它不会显示,因为在线状态会立即被捕获,所以你甚至看不到它变成蓝色,因此使用setTimeout来阻止它。)
  5. 步骤1到3相应地工作,问题出现在步骤4中。

    我遇到的问题是每次手机改变状态时都使用JQuery .HTML来覆盖磁贴中的内容但经过一些调试和摆弄后我发现问题似乎是JQuery .HTML和/或如何我正在使用它和setTimeOut我想但我不知道为什么。

    问题 Hangup事件被捕获........。HTML这里似乎没有显示,似乎被.HTML覆盖在网上事件中,在挂机后直接被捕获,因此显示来自在线事件的.html。

    我发现当我在步骤1删除.HTML时它会停止问题,但是我在第1步中需要它。但是如果我把它留在那里它似乎覆盖了步骤4中的.HTML,我也需要一些原因。

    Array看起来像这样,带有分机号码,SIP设备状态,设备所处的当前状态,例如振铃:

      [ '487', 'online', 'Hangup' ],
      [ '488', 'online' ],
      [ '477', 'online', 'Hangup' ] ]
    

    服务器端事件通常在捕获事件时的样子:

    477 and 487 both hungup
    [ [ '487', 'online', 'Hangup' ], [ '477', 'online', 'Hangup' ] ]
    something happened to a ChannelDestroyed
    Channel Output ChannelDestroyed
    something happened to an endpoint
    EndpointStateChange
    477 current state is: online
    [ [ '487', 'online', 'Hangup' ], [ '477', 'online', 'Hangup' ] ]
    

    此处是我的代码:

    //Handles events to signal current call states aka if 488 dials 487 highlight both tiles with those values.
    socket.on("eventsCalls", function (calldata) {
        for (var i = 0; i < calldata.length; i++) {
            if (calldata[i][0] && calldata[i][2] === "Ringing") {
                $("div[class*='tile']:contains('" + calldata[i][0] + "')").css("background-color", "yellow").append("<h4>User</h4><p>" + calldata[i][0] + " Is Ringing</p>");
            } else if (calldata[i][0] && calldata[i][2] === "Hangup") {
                $("div[class*='tile']:contains('" + calldata[i][0] + "')").html("<h4>User</h4><p>" + calldata[i][0] + " just hungup</p>").addClass("hangup");
                setTimeout(function () {
                    $("div[class*='tile']").removeClass("hangup");
                }, 3000);
            } else if (calldata[i][0] && calldata[i][2] === "ANSWER") {
                $("div[class*='tile']:contains('" + calldata[i][0] + "')").css("background-color", "orange").html("<h4>User</h4><p>" + calldata[i][0] + " Is Busy</p>");
            }
        }
    });
    // Handles which sip devices are currently registered and displays them on the web page.
    socket.on("eventsRegister", function (regisdata) {
        for (var i = 0; i < regisdata.length; i++) {
            if (regisdata[i][0] && regisdata[i][1] === "online") {
                $("div[class*='tile']:contains('" + regisdata[i][0] + "')").css("background-color", "green").html("<h4>User</h4><p>" + regisdata[i][0] + " Online</p>");
            } else if (regisdata[i][0] && regisdata[i][1] === "offline") {
                $("div[class*='tile']:contains('" + regisdata[i][0] + "')").css("background-color", "red").html("<h4>User</h4><p>" + regisdata[i][0] + " Offline</p>");
            }
        }
    });
    

    这个问题有没有更好的替代方案或解决方法?

    编辑:JSFiddle想知道什么是尝试难以复制事件的捕获但当它遇到挂断时.html似乎被在线事件覆盖,似乎同时发生我认为。它对我的代码中的最后两个事件的颜色改变不起作用,但挂起的.HTML似乎被在线覆盖。

1 个答案:

答案 0 :(得分:1)

我无法肯定地说,但您的setTimeout缺少delay参数。

var hangupDelay = 5000; // 5 seconds. 
setTimeout(function () {
                $("div[class*='tile']").removeClass("hangup");
            }, hangupDelay );

这应该会在5秒后删除挂断类。

如果您未指定setTimeout延迟参数;你几乎立即得到它:

https://developer.mozilla.org/en/window.setTimeout#Minimum_delay_and_timeout_nesting

  

延迟是毫秒(千分之一秒)的数量   函数调用应该延迟。如果省略,则默认为0   实际延迟可能更长;见下面的注释。

这可能会导致挂断类立即被删除并且似乎无法正常工作。