简体   繁体   English

单击时,“ jQuery搜索下一个和上一个文本的出现次数”更改格式

[英]JQuery Search Next and Previous Text Occurrence changes format when clicking

I have implemented a search function with next and previous features When a user clicks on search , the first occurrence will be highlighted, then when the next button is clicked, the next occurrence is highlighted and the previous one's highlight is removed. 我已经实现了具有下一个和上一个功能的搜索功能,当用户单击search时,将高亮显示第一个匹配项,然后单击下一个按钮时,将突出显示下一个匹配项,并删除上一个突出显示的内容。 This is also done when pressing the previous button. 按下上一个按钮时,也会执行此操作。 The issue I am having, is that when I click on any of the 3 buttons, the format of the page is changed. 我遇到的问题是,当我单击这三个按钮中的任何一个时,页面的格式都会更改。 How can I change this so that when I search or click on next/ previous, the buttons work, but the format of the web-page doesn't change? 如何更改此设置,以便当我搜索或单击“下一个/上一个”时,这些按钮起作用,但网页的格式没有改变?

The following is my code: 以下是我的代码:

  var searchIndex = -1; var searchTermOld =''; $(document).ready(function(){ $('.searchbox').on('change',function(){ if($(this).val()===''){ var selector= "#pageContent"; $(selector+' span.match').each(function(){ $(this).replaceWith($(this).html()); }); } searchIndex = -1; $('.searchNext').attr("disabled", "disabled"); $('.searchPrev').attr("disabled", "disabled"); searchTermOld = $(this).val(); }); $('.searchbox').on('keyup',function(){ var selector= "#pageContent"; if($(this).val()===''){ $(selector+' span.match').each(function(){ $(this).replaceWith($(this).html()); }); } if($(this).val() !== searchTermOld){ $(selector+' span.match').each(function(){ $(this).replaceWith($(this).html()); }); searchIndex = -1; $('.searchNext').attr("disabled", "disabled"); $('.searchPrev').attr("disabled", "disabled"); } }); $('.search').on('click',function(){ if(searchIndex == -1){ var searchTerm = $('.searchbox').val(); searchAndHighlight(searchTerm); } else searchNext(); if($('.match').length >1){ $('.searchNext').removeAttr("disabled"); $('.searchPrev').removeAttr("disabled"); } }); $('.searchNext').on('click',searchNext); $('.searchPrev').on('click',searchPrev); }); function searchAndHighlight(searchTerm) { if (searchTerm) { var searchTermRegEx, matches; var selector= "#pageContent"; $(selector+' span.match').each(function(){ $(this).replaceWith($(this).html()); }); try { searchTermRegEx = new RegExp('('+searchTerm+')', "ig"); } catch (e) { return false; } $('.highlighted').removeClass('highlighted'); matches = $(selector).text().match(searchTermRegEx); if (matches !==null && matches.length > 0) { var txt = $(selector).text().replace(searchTermRegEx, '<span class="match">$1</span>'); $(selector).html(txt); searchIndex++; $('.match:first').addClass('highlighted'); $(document).scrollTop($('.match').eq(searchIndex).offset().top); return true; } return false; } return false; } function searchNext(){ searchIndex++; if (searchIndex >= $('.match').length) searchIndex = 0; $('.highlighted').removeClass('highlighted'); $('.match').eq(searchIndex).addClass('highlighted'); $(document).scrollTop($('.match').eq(searchIndex).offset().top); } function searchPrev(){ searchIndex--; if (searchIndex < 0) searchIndex = $('.match').length - 1; $('.highlighted').removeClass('highlighted'); $('.match').eq(searchIndex).addClass('highlighted'); $(document).scrollTop($('.match').eq(searchIndex).offset().top); } 
 .highlighted { background-color:yellow; padding:1px 2px; margin:0 -2px; border-radius: 5px; box-shadow: 0 1px 4px rgba(0, 0, 0, 0.7); } 
 <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.0.2/jquery.min.js"></script> <div class="searchBtn" style="float: right;"> <input class="searchbox" type="text"/> <button class="search">Search</button> <button class="searchNext">Next</button> <button class="searchPrev">Prev</button> </div> <div id="pageContent" style="width: 60%; height: 100%; float: right;"> <div class="sections"> <h3> Lorem </h3> Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas sed neque sollicitudin, sollicitudin nibh vel, elementum odio. Proin eu tempus tellus. Donec auctor turpis faucibus, aliquet purus non, fringilla ex. Nullam tempus dui et velit ornare, vel laoreet sapien mattis. Sed ultrices porta sem ut ullamcorper. Suspendisse dolor turpis, tempor sed metus sit amet, lacinia porta nisi. Maecenas porta maximus tellus, eu sollicitudin mauris facilisis malesuada. Nunc ullamcorper felis molestie commodo dictum. Fusce porta orci at urna efficitur, non pretium augue fermentum. Nunc eleifend cursus tellus in hendrerit. Suspendisse ut justo nec orci lacinia dapibus quis et est. Donec vulputate ante et consectetur accumsan. Nunc bibendum risus sit amet sodales varius. Praesent luctus ac ligula eu semper. Nunc gravida imperdiet mauris, eu iaculis tellus ultrices ac. Curabitur ac rutrum diam. Donec at rhoncus leo. Aenean tempor consectetur sem. Nulla leo urna, gravida a gravida et, lacinia a ante. Sed vel commodo lacus. Donec sodales condimentum aliquet. Donec iaculis nisl nulla, nec auctor tortor consequat in. Donec nec arcu diam. In vitae scelerisque augue, eu sodales lectus. Sed dictum malesuada lectus sed viverra. Aliquam lacinia massa quis est lobortis, vitae sodales diam scelerisque. Integer congue, nibh rutrum eleifend feugiat, dui justo varius dui, vitae commodo ex risus eu sapien. Sed id ultricies magna, a suscipit nibh. Phasellus nisi erat, ultricies at nunc vitae, condimentum volutpat neque. Maecenas nec bibendum augue, id accumsan nibh. Vestibulum ornare leo vitae orci ullamcorper, vitae maximus massa dictum. Praesent rhoncus lectus vel mi sagittis tempus. Cras eros massa, efficitur at lobortis et, ornare vitae tortor. Morbi ipsum velit, lobortis in dui eget, tempor ultricies eros. Curabitur et aliquam sapien, a aliquam arcu. Phasellus tempus porttitor ligula in mollis. Maecenas venenatis sem mollis elementum rutrum. In dapibus est mi. Cras quis porta libero. Aliquam auctor tellus in ligula vehicula, vel volutpat mauris ultricies. Nunc vitae justo sagittis, congue felis quis, mattis sem. Nullam eu tortor nibh. Curabitur pellentesque enim vel orci placerat, vitae bibendum massa laoreet. In eu auctor turpis. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Vivamus id mattis arcu, et imperdiet urna. Proin at sagittis augue, et tempus dui. Cras consequat ultricies dignissim. Interdum et malesuada fames ac ante ipsum primis in faucibus. Fusce auctor lectus mi, in eleifend felis fermentum non. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. In pharetra pellentesque euismod. Suspendisse ut orci tincidunt, cursus ante vel, molestie sem. Nulla sodales velit a erat tempus, non dapibus leo convallis. Aenean libero mauris, auctor quis consectetur vitae, tincidunt quis nisl. Etiam dignissim sagittis mattis. Curabitur euismod, nisi vitae auctor euismod, lectus enim gravida mi, viverra porttitor lectus diam euismod sapien. Nunc et lacus sapien. Curabitur arcu tortor, congue ac lorem eget, suscipit eleifend mauris. Vivamus cursus libero nec ante euismod, ut euismod ipsum iaculis. Suspendisse potenti. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas sed neque sollicitudin, sollicitudin nibh vel, elementum odio. Proin eu tempus tellus. Donec auctor turpis faucibus, aliquet purus non, fringilla ex. Nullam tempus dui et velit ornare, vel laoreet sapien mattis. Sed ultrices porta sem ut ullamcorper. Suspendisse dolor turpis, tempor sed metus sit amet, lacinia porta nisi. Maecenas porta maximus tellus, eu sollicitudin mauris facilisis malesuada. Nunc ullamcorper felis molestie commodo dictum. Fusce porta orci at urna efficitur, non pretium augue fermentum. Nunc eleifend cursus tellus in hendrerit. Suspendisse ut justo nec orci lacinia dapibus quis et est. Donec vulputate ante et consectetur accumsan. Nunc bibendum risus sit amet sodales varius. Praesent luctus ac ligula eu semper. Nunc gravida imperdiet mauris, eu iaculis tellus ultrices ac. Curabitur ac rutrum diam. Donec at rhoncus leo. Aenean tempor consectetur sem. Nulla leo urna, gravida a gravida et, lacinia a ante. Sed vel commodo lacus. Donec sodales condimentum aliquet. Donec iaculis nisl nulla, nec auctor tortor consequat in. Donec nec arcu diam. In vitae scelerisque augue, eu sodales lectus. Sed dictum malesuada lectus sed viverra. Aliquam lacinia massa quis est lobortis, vitae sodales diam scelerisque. Integer congue, nibh rutrum eleifend feugiat, dui justo varius dui, vitae commodo ex risus eu sapien. Sed id ultricies magna, a suscipit nibh. Phasellus nisi erat, ultricies at nunc vitae, condimentum volutpat neque. Maecenas nec bibendum augue, id accumsan nibh. Vestibulum ornare leo vitae orci ullamcorper, vitae maximus massa dictum. Praesent rhoncus lectus vel mi sagittis tempus. Cras eros massa, efficitur at lobortis et, ornare vitae tortor. Morbi ipsum velit, lobortis in dui eget, tempor ultricies eros. Curabitur et aliquam sapien, a aliquam arcu. Phasellus tempus porttitor ligula in mollis. Maecenas venenatis sem mollis elementum rutrum. In dapibus est mi. Cras quis porta libero. Aliquam auctor tellus in ligula vehicula, vel volutpat mauris ultricies. Nunc vitae justo sagittis, congue felis quis, mattis sem. Nullam eu tortor nibh. Curabitur pellentesque enim vel orci placerat, vitae bibendum massa laoreet. In eu auctor turpis. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Vivamus id mattis arcu, et imperdiet urna. Proin at sagittis augue, et tempus dui. Cras consequat ultricies dignissim. Interdum et malesuada fames ac ante ipsum primis in faucibus. Fusce auctor lectus mi, in eleifend felis fermentum non. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. In pharetra pellentesque euismod. Suspendisse ut orci tincidunt, cursus ante vel, molestie sem. Nulla sodales velit a erat tempus, non dapibus leo convallis. Aenean libero mauris, auctor quis consectetur vitae, tincidunt quis nisl. Etiam dignissim sagittis mattis. Curabitur euismod, nisi vitae auctor euismod, lectus enim gravida mi, viverra porttitor lectus diam euismod sapien. Nunc et lacus sapien. Curabitur arcu tortor, congue ac lorem eget, suscipit eleifend mauris. Vivamus cursus libero nec ante euismod, ut euismod ipsum iaculis. Suspendisse potenti. </div> </div> 

I have also inserted a jsfiddle link: 我还插入了一个jsfiddle链接:

https://jsfiddle.net/gwkudae8/ https://jsfiddle.net/gwkudae8/

This is because your code changes content of that div to text... the easiest way to fix it would be to change text() to html() like this: 这是因为您的代码将该div的内容更改为text ...修复它的最简单方法是将text()更改为html()如下所示:

function searchAndHighlight(searchTerm) {
    if (searchTerm) {
        var searchTermRegEx, matches;
        var  selector= "#pageContent";
        $(selector+' span.match').each(function(){
        $(this).replaceWith($(this).html());
      });
        try {
            searchTermRegEx = new RegExp('('+searchTerm+')', "ig");
        } catch (e) {
            return false;
        }
        $('.highlighted').removeClass('highlighted');
        matches = $(selector).html().match(searchTermRegEx);
        if (matches !==null && matches.length > 0) {
            var txt = $(selector).html().replace(searchTermRegEx, '<span class="match">$1</span>');
            $(selector).html(txt);
            searchIndex++;
            $('.match:first').addClass('highlighted');
           $(document).scrollTop($('.match').eq(searchIndex).offset().top);

          return true;
        }
      return false;
    }
  return false;
}

https://jsfiddle.net/gwkudae8/5/ https://jsfiddle.net/gwkudae8/5/

Please note that then it will have problems with searching "some phrase" when it will be partially formatted like " some <span>phrase</span> " and there is no easy way to fix that. 请注意,当它被部分格式化为“ some <span>phrase</span> ”时,搜索“某些短语”将会遇到问题,并且没有简单的方法可以解决该问题。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 单击上一个/下一个月时,阻止jQuery Datepicker刷新 - Stop jQuery Datepicker from refreshing when clicking previous/next month 如何使用jquery中的下一个和上一个功能从页面搜索文本 - How to search text from page with next and previous functionality in jquery jquery搜索并替换第n次出现的文本 - jquery search and replace text from nth occurrence 创建使用jQuery但不使用插件单击“下一个/上一个”时移动的响应式滑块 - Creating responsive slider that moves when clicking “next/previous” using jquery, but not using plugin 单击按钮时,转到下一页并刷新上一个Jquery Mobile - When clicking a button go to next page and refresh the previous one Jquery Mobile 单击“下一步”按钮时,jQuery选项卡突出显示 - Jquery Tabs Highlight When Clicking 'Next' Button 单击下一步按钮时删除以前的 JS function - Remove previous JS function when clicking next button 单击带有香草的下一个/上一个兄弟时显示/隐藏子菜单 Javascript - Show/hide submenus when clicking next/previous sibling with vanilla Javascript 单击幻灯片上的下一个或上一个按钮时创建新间隔 - make new interval when clicking on next or previous button on a slide 当按下下一个和上一个按钮时,如何使用javascript和jquery更改文本值? - How can I use javascript and jquery to change a text value when next and previous buttons are pressed?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM