jquery highlight()在动态表中打破

时间:2012-10-17 18:35:59

标签: php jquery mysql ajax jquery-plugins

我正在处理一个突出显示功能的问题。我基本上以某种方式从与当前表单数据匹配的数据库中加载记录。然后,当有人填写表单时,如果他们描述了我的系统中已存在的问题,它将突出显示他们的描述与现有记录相同的单词。我的问题是桌子坏了。它会在一定程度上起作用,但有时会将PHP循环部分从表的其余部分中分离出来,然后它没有格式化,并且突出显示功能将不起作用。更具体地说,一旦破坏,表格主体中的td标签就不会遵循标题行的格式。 导致不良后果的条件:

  1. 通过文字区域标签
  2. 如果必须立即删除或应用太多类(通过删除所有类,添加许多单词或删除或搜索多次出现的单个字符)
  3. 主页上的html&&用于触发突出显示的脚本

    <textarea name="description" id="description"></textarea>
    <script>
     var delay = (function(){
     var timer = 0;
     return function(callback, ms){
     clearTimeout (timer);
     timer = setTimeout(callback, ms);
     };
     })();
     $(function(){
        $("#description").keydown(function(){
        delay((function(){
        $("#displayer *").removeClass('highlight');
        var1 = $('textarea#description').val().split(' ');
        for (var i=0;i<var1.length;i++){
        $("#displayer *").highlight(var1[i], "highlight")};
        }),1000);
        });
        });
     </script>
    

    基于ajax调用构建搜索表的外部php是:

    echo '<TABLE BORDER="0" CELLSPACING="5" CELLPADDING="5" id="displayer"><FONT     FACE="ARIAL">';
    
       echo ' <tr> '; 
    echo '   <td width="20" ALIGN="LEFT" height="1">ID</td>'; 
    echo '   <td width="89" ALIGN="LEFT" height="1">Date</td> '; 
    echo '   <td width="200" ALIGN="LEFT" height="1" >Description</td>'; 
    echo '   <td width="89" ALIGN="LEFT" height="1" >Solution</td>'; 
    echo '   <td width="20" ALIGN="LEFT" height="1" >User:</td>'; 
    echo '   <td ALIGN="LEFT" height="1" >Key?:</td>';
    echo '   <td ALIGN="LEFT" height="1" >Part:</td>';
    echo '   <td ALIGN="LEFT" height="1" >Classified As:</td>';
    echo ' </tr>   '; 
     for ($i=1; $i <= $num_results; $i++)
        {
       $row = mysql_fetch_array($result1); 
    
         echo '<TR BGCOLOR="#EFEFEF">';
         echo '<TD width="20">';
         echo  stripslashes($row['0']) ;
         echo '</TD>';
         echo '<TD width="89" >';
         echo  $row['1'] ;
         echo '</TD>';
         echo '<TD width="200">';
         echo  stripslashes($row['6']) ;
         echo '</TD>';
         echo '<TD width="89">';
         echo  stripslashes($row['11']) ;
         echo '</TD>';
         echo '<TD  width="20">';
         echo  $row['5'] ;
         echo '</TD>';
          echo '<TD>';
          if ($row['8'] == 1)
         {echo  'Yes' ;}
         else 
         {echo 'No' ;}
    
         echo '</TD>';
         echo '<td>'.$row['10'].'</td>';
         echo '<td>'.$row['9'].'</td>';
    
         echo '</TR>';
    
        }
             echo '</TABLE>';
    

    外部精彩插件:

    jQuery.fn.highlight = function (str, className) {
        var regex = new RegExp(str, "gi");
        return this.each(function () {
            $(this).contents().filter(function() {
                return this.nodeType == 3 && regex.test(this.nodeValue);
            }).replaceWith(function() {
                return (this.nodeValue || "").replace(regex, function(match) {
                    return "<span class=\"" + className + "\">" + match + "</span>";
                });
            });
        });
    };
    

    我认为我应该为某种逃避添加一个空的测试,以解决第一个条件,但是对于第二个,我不确定发生了什么。任何建议都绝对值得赞赏。很抱歉这篇文章很庞大且令人费解,但我希望每个人都能获得我能提供的所有信息。

1 个答案:

答案 0 :(得分:0)

$(function(){
    $("#description").keydown(function(){
        delay((function(){
        var divClone = $("#disp_hidden .serial_display").clone();
        $("#displayer .serial_display").replaceWith(divClone);
                if ($.trim($('textarea#description').val()) != ''){
                var1 = $('textarea#description').val().trim().split(' ');
            for (var i=0;i<var1.length;i++){
            $("#displayer *").highlight(var1[i], "highlight")};
            };
        }),1000);
        });
        });

隐藏表克隆,在新编辑时替换,修复。