从HTML节点之间提取特定文本的优雅方式?

时间:2013-02-08 11:46:58

标签: javascript jquery regex dom greasemonkey

从下面的字符串我需要动态更改“6.903”数字来进行计算。

是否有一些正则表达式或一些jQuery技巧可以轻松或优雅地执行此操作?

<a href="javascript:void(0)" class="" id="buddyTrigger">
38.760&nbsp;<img border="0" align="absmiddle" alt="Arany" src="/img/symbols/res2.gif">
&nbsp;&nbsp;5&nbsp;<img border="0" align="absmiddle" alt="Pokolkristály" src="/img/symbols/res3.gif">
&nbsp;&nbsp;220&nbsp;<img border="0" align="absmiddle" alt="Szilánk" src="/img/symbols/res_splinters.png">
&nbsp;&nbsp;91&nbsp;/&nbsp;125&nbsp;<img border="0" align="absmiddle" alt="Akciópont" src="/img/symbols/ap.gif">
&nbsp;&nbsp;6.903&nbsp;/&nbsp;82.100&nbsp;<img border="0" align="absmiddle" alt="Életerő" src="/img/symbols/herz.png">
&nbsp;&nbsp;<img border="0" align="absmiddle" alt="Szint" src="/img/symbols/level.gif">&nbsp;41    &nbsp;&nbsp;
<img border="0" align="absmiddle" alt="Harci érték" src="/img/symbols/fightvalue.gif">&nbsp;878</a>

这是我的代码作为lenghty解决方案,我能以某种方式简化吗?

<script type="text/javascript">
    var dataIn=$('#infobar div.gold').html();
    var dataPrep2Split=dataIn.replace(/<img(.*)>/g,';');
    var dataSplit=dataPrep2Split.split(';');
    var myData2Int=parseInt(dataSplit[18].replace('.',''));
    if(myData2Int<=10000) {
        $('#player').find('button.btn').remove();
        var putBack=dataIn.replace(dataSplit[18],'<span class="newmessage">'+dataSplit[18]+'</span>');
        $('#infobar div.gold').html(putBack);
    }
</script>

1 个答案:

答案 0 :(得分:2)

使用DOM方法;使用.html()替换内容通常会破坏页面功能。此外,正则表达式可能会因最小的变化而中断。

您正试图抓住 Life 价值吗?最后是<img>alt="Életero"

所以文本节点是(基于Q代码):

var lifeValTxtNd    = $("#buddyTrigger img[alt='Életero']")[0].previousSibling;


这会从6903

等内容中获得6.903 / 82.100
var lifeVal         = $.trim (lifeValTxtNd.nodeValue)
                    .replace (/^\s*(\d*)\.?(\d+)\s*\/.+$/, "$1$2")
                    ;
lifeVal             = parseInt (lifeVal, 10);


然后将该部分包含在span中:

$("#buddyTrigger img[alt='Életero']").before (
    '<span class="newmessage">' + lifeValTxtNd.nodeValue + '</span>'
);

lifeValTxtNd.parentNode.removeChild (lifeValTxtNd);


这样做:

  1. 不会破坏页面上的任何事件侦听器。
  2. 不太容易受到页面布局/内容的影响。
  3. 更容易理解和维护。
  4. 如果表现是一个因素,会跑得更快。