用图像和其他东西替换动态内容

时间:2013-11-19 09:39:38

标签: javascript html5 css3 lightstreamer

我正在努力研究如何以最佳方式设计这种代码:

<td><div data-source="lightstreamer" data-field="yellow-cards">-</div></td>

数据源节点将使用内容(即1,2 ...)进行动态处理,但我必须显示图像(如果节点内容为1,则为黄牌;如果节点内容为2,则为红色卡) 。我无法修改标记,因为它将由第三部分提供。

如果您对如何以干净的方式实现该结果有任何提示,我将非常感谢,因为我现在还不确定该如何做到这一点。

非常感谢你!

张志贤

3 个答案:

答案 0 :(得分:2)

如果您不必支持旧浏览器(需要使用css选择器),您可以通过利用数据更新选项来改进您的解决方案:该选项告诉Lightstreamer客户端库将更新值放在某处否则,而不是将其作为html节点的内容。在这种情况下,我们可以告诉库填充名为“data-card”的自定义属性。

生成的html将如下所示:

<div data-source="lightstreamer" data-field="yellowCards" data-update="data-card" data-card="0">-</div>

现在我们告诉浏览器使用简单的CSS基于这样的数据卡属性的值来着色元素:

div[data-card="0"] {background: white;display: none;}
div[data-card="1"] {background: yellow;}
div[data-card="2"] {background: red;}

这样您就不必为网格更新编写任何处理程序。

HTH

答案 1 :(得分:0)

您可以使用CSS选择器来定位'yellow-cards'属性。 如果你不想显示,那么text-indent会通过偏移来隐藏innerHTML。

例如:

div[data-field='yellow-cards'] { background:url(<yellow card image>); text-indent:-5000px; }

如果您不能依赖数据字段值,则必须使用javascript选择所有div节点并通过它们检查innerHTML。

var divarray = document.getElementById(<table id>).getElementsByTagName("DIV")
for (loop=0;loop<divarray.length;loop++) {
    switch(divarray[loop].innerHTML){
    case "-": divarray[loop].className="novalue";
              break;
    case "1": divarray[loop].className="yellowcard";
              break;
    case "2": divarray[loop].className="redcard";
              break;
    }
}

然后遍历检查innerHTML并根据值应用类。第一种方法是最好的,因为第二种方法会明显改变页面加载时的显示。

答案 2 :(得分:0)

好的,我发现的解决方案严格基于LightStreamer。 鉴于DynaGrid:

// Create Home Players Grid
    var homePlayersGrid = new DynaGrid("homePlayersGrid",true);
    var fieldList = ["key", "command", "jersey", "lastName", "sequence","substituted","yellowCards","redCards","autoGoals","goals"]; 
    var homePlayersSubscription = new Subscription("COMMAND","homePlayers",fieldList);
    homePlayersSubscription.addListener(homePlayersGrid);
    homePlayersGrid.setSort("sequence",false,true);
    client.subscribe(homePlayersSubscription);

链接到HTML表格:

<tr id="homePlayersGrid" data-source="lightstreamer">
        <td><div data-source="lightstreamer" data-field="sequence">-</div></td>
        <td><div data-source="lightstreamer" data-field="jersey">-</div></td>
        <td><div data-source="lightstreamer" data-field="lastName">-</div></td>
        <td><div data-source="lightstreamer" data-field="substituted">-</div></td>
        <td><div data-source="lightstreamer" data-field="yellowCards">-</div></td>
        <td><div data-source="lightstreamer" data-field="redCards">-</div></td>
        <td><div data-source="lightstreamer" data-field="autoGoals">-</div></td>
        <td><div data-source="lightstreamer" data-field="goals">-</div></td>
    </tr>

我添加一个侦听器来检测对内容的任何更新:

homePlayersGrid.addListener({
      onVisualUpdate: function(key,info,domNode) {
        if (info == null) {return;}
        formatYellowCards(domNode,info);
      }
    });

其中formatYellowCards()是一个函数,它将正确类的类设置为更改的数据字段:

function formatYellowCards(domNode, info) { //onChangingValues
       if (info == null) {return;}
       info.setCellStyle("yellowCards","transition","yellowCards-"+info.getCellValue("yellowCards"));
    }

最后,CSS很简单:

.transition {background: green;text-indent: -5000px}
.yellowCards-0 {background: white;display: none;text-indent: -5000px}
.yellowCards-1 {background: yellow;text-indent: -5000px}
.yellowCards-1 {background: red;text-indent: -5000px}