• Settings
    • Locale
    • Change the locale of the datepicker, schedule and client side validation messages.

      Language
      English
      English
      English
      French
      German
      German
      German
      Italian
      Korean
      Spanish
      Catalan
      Dutch
      Portuguese
      Portuguese
      Arabic
      Arabic
      Bulgarian
      Bangla
      Bosnian
      Czech
      Greek
      Estonian
      Persian
      Finnish
      Danish
      Hindi
      Indonesian
      Icelandic
      Croatian
      Japanese
      Hungarian
      Hebrew
      Georgian
      Central Kurdish
      Khmer
      Kyrgyz
      Kazakh
      Lithuanian
      Latvian
      Malay
      Norwegian
      Polish
      Romanian
      Russian
      Slovak
      Slovenian
      Serbian
      Serbian
      Swedish
      Thai
      Turkish
      Ukrainian
      Uzbek
      Vietnamese
      Chinese
      Chinese
  • Resources

MarkText Basic

MarkText highlights search terms within specified containers using mark.js by Julien Royer.

MarkText Tag Documentation

MarkText highlights search terms within specified containers using mark.js.

NameTypeRequiredDefaultDescription
id String false generated Unique identifier of the component in a namingContainer.
rendered boolean false true Boolean value to specify the rendering of the component, when set to false component will not be rendered.
binding UIComponent false generated An EL expression referring to a server side UIComponent instance in a backing bean.
widgetVar String false generated ('widget_' + componentClientId) Name of the client-side widget.
accuracy String false partially Search accuracy level: 'partially', 'complementarily', or 'exactly'.
acrossElements Boolean false false Search across element boundaries.
caseSensitive Boolean false false Whether the search should be case sensitive.
diacritics Boolean false true Whether accented and unaccented letters are treated as the same during matching.
exclude List false Array of exclusion selectors. Matches inside these elements will be ignored.
for String true Search expression to resolve the target component to search within.
iframes Boolean false false Whether matching should include same-origin iframe documents.
iframesTimeout Integer false 5000 Maximum wait time in milliseconds for iframe loading.
onDone String false Client-side callback executed after marking is complete. The callback receives totalMatches as a parameter.
separateWordSearch Boolean false true Whether to match each word separately.
style String false Inline style of the component.
styleClass String false Style class of the component.
synonyms Object false Map of synonyms for term matching.
value String true Search terms to highlight. Can be a string or array of strings.
wildcards String false disabled Wildcard matching mode: 'disabled'|'enabled'|'withSpaces'.
Tag Documentation Widget Source Basic Matching Search Terms Scope
Basic Usage

Type a search term: matches inside the panel are highlighted.

Search term:
Searchable Content

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

PrimeFaces Extensions provides additional components for PrimeFaces. MarkText is a new component that highlights search terms within specified containers using mark.js.

Advanced Features

Multiple search terms on the same content, custom styles and combined properties.

Search term 1:Search term 2:
Advanced Features - Multiple Terms with Custom Styles and Combined Properties

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

Update Search

The mark AJAX event sends the matched terms and positions to a server-side listener.

Search term:
Searchable Content

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

PrimeFaces Extensions provides additional components for PrimeFaces. MarkText is a new component that highlights search terms within specified containers using mark.js.

Backend Data from Mark Event Listener
Last Matched Terms: No data received yet
Last Positions: No data received yet
Done Callback

The client-side onDone callback fires after mark.js completes marking and receives the total number of matches, without an AJAX request. Compare with Update Search, where a server-side p:ajax event="mark" listener receives the matched terms and positions.

Search term:
Searchable Content

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

Done Callback Result
No search performed yet.
Total matches: 0

Usage


<style>
    .marktext-highlight,
    mark {
        background-color: yellow !important;
        color: black !important;
    }
    .custom-highlight {
        background-color: lightgreen !important;
        color: darkgreen !important;
        font-weight: bold;
    }
</style>

<div class="card">
    <h5>Basic Usage</h5>
    <p>Type a search term: matches inside the panel are highlighted.</p>
    <h:form id="formBasicUsage">
        <h:panelGrid columns="3" cellpadding="4">
            <h:outputText value="Search term:"/>
            <p:inputText id="searchInput" value="#{markTextController.searchTerm}" placeholder="Enter search term">
                <p:ajax event="keyup" delay="500" update="searchContainer markText"/>
            </p:inputText>
            <p:commandButton value="Highlight" update="searchContainer markText" icon="pi pi-search"/>
        </h:panelGrid>

        <p:panel id="searchContainer" header="Searchable Content" style="margin-top: 20px">
            <h:panelGroup id="searchContent" layout="block">
                <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
                <p>PrimeFaces Extensions provides additional components for PrimeFaces. MarkText is a new component that highlights search terms within specified containers using mark.js.</p>
            </h:panelGroup>
        </p:panel>

        <pe:markText id="markText" for="searchContent" value="#{markTextController.searchTerm}" styleClass="marktext-highlight"/>
    </h:form>
</div>

<div class="card">
    <h5>Advanced Features</h5>
    <p>Multiple search terms on the same content, custom styles and combined properties.</p>
    <h:form id="formAdvancedFeatures">
        <h:panelGrid columns="5" cellpadding="4">
            <h:outputText value="Search term 1:"/>
            <p:inputText id="searchInput1" value="#{markTextController.searchTerm}" placeholder="Enter first search term">
                <p:ajax event="keyup" delay="500" update="advancedPanel markText1 markText2"/>
            </p:inputText>
            <h:outputText value="Search term 2:"/>
            <p:inputText id="searchInput2" value="#{markTextController.searchTerm2}" placeholder="Enter second search term">
                <p:ajax event="keyup" delay="500" update="advancedPanel markText1 markText2"/>
            </p:inputText>
            <p:commandButton value="Highlight" update="advancedPanel markText1 markText2" icon="pi pi-search"/>
        </h:panelGrid>

        <p:panel id="advancedPanel" header="Advanced Features - Multiple Terms with Custom Styles and Combined Properties">
            <h:panelGroup id="advancedContent" layout="block">
                <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
            </h:panelGroup>
        </p:panel>

        <pe:markText id="markText1" for="advancedContent" value="#{markTextController.searchTerm}" styleClass="marktext-highlight" caseSensitive="false" separateWordSearch="true" accuracy="partially"/>
        <pe:markText id="markText2" for="advancedContent" value="#{markTextController.searchTerm2}" styleClass="#{markTextController.customStyleClass}" caseSensitive="true" separateWordSearch="false" accuracy="exactly"/>
    </h:form>
</div>

<div class="card">
    <h5>Update Search</h5>
    <p>The <i>mark</i> AJAX event sends the matched terms and positions to a server-side listener.</p>
    <h:form id="formUpdateSearch">
        <p:messages id="messages" showSummary="true" showDetail="true"/>

        <h:panelGrid columns="2" cellpadding="4">
            <h:outputText value="Search term:"/>
            <p:inputText id="searchInput" value="#{markTextController.searchTermUpdate}" placeholder="Enter search term">
                <p:ajax event="keyup" delay="300" update="markText" process="@this"/>
            </p:inputText>
        </h:panelGrid>

        <p:panel id="searchContainer" header="Searchable Content" style="margin-top: 20px">
            <p>#{markTextController.processedTextFirstPart}</p>
            <p>#{markTextController.processedTextSecondPart}</p>
        </p:panel>

        <p:panel id="backendDataPanel" header="Backend Data from Mark Event Listener" style="margin-top: 20px">
            <h:outputText value="Last Matched Terms: #{empty markTextController.lastMatchedTerms ? 'No data received yet' : markTextController.lastMatchedTerms}"/>
            <br/>
            <h:outputText value="Last Positions: #{empty markTextController.lastPositions ? 'No data received yet' : markTextController.lastPositions}"/>
        </p:panel>

        <pe:markText id="markText" for="searchContainer" value="#{markTextController.searchTermUpdate}"
                     styleClass="marktext-highlight" caseSensitive="false">
            <p:ajax event="mark" listener="#{markTextController.onHighlight}" update="backendDataPanel messages"/>
        </pe:markText>
    </h:form>
</div>

<div class="card">
    <h5>Done Callback</h5>
    <p>
        The client-side <code>onDone</code> callback fires after mark.js completes marking and receives the total number of matches,
        without an AJAX request. Compare with <i>Update Search</i>, where a server-side <code>p:ajax event="mark"</code> listener
        receives the matched terms and positions.
    </p>
    <h:form id="formDoneCallback">
        <h:panelGrid columns="2" cellpadding="4">
            <h:outputText value="Search term:"/>
            <p:inputText id="doneSearchInput" value="#{markTextDoneController.searchTerm}" placeholder="Enter search term"
                         onkeyup="PF('markTextWvDone').updateMark(this.value)"/>
        </h:panelGrid>

        <p:panel id="searchContainer" header="Searchable Content" style="margin-top: 20px">
            <p>#{markTextDoneController.processedText}</p>
        </p:panel>

        <p:panel id="donePanel" header="Done Callback Result" style="margin-top: 20px">
            <h:outputText id="doneLabel" value="No search performed yet."/>
            <br/>
            <h:outputText value="Total matches: "/>
            <h:outputText id="doneCount" value="0"/>
        </p:panel>

        <pe:markText id="markText" widgetVar="markTextWvDone" for="searchContainer" value="#{markTextDoneController.searchTerm}"
                     styleClass="marktext-highlight" caseSensitive="false"
                     onDone="markDone(totalMatches)"/>
    </h:form>
    <script>
        function markDone(totalMatches) {
            document.getElementById('formDoneCallback:doneCount').textContent = totalMatches;
            document.getElementById('formDoneCallback:doneLabel').textContent = totalMatches === 0
                ? 'No matches found.'
                : 'Marking complete: ' + totalMatches + ' match' + (totalMatches !== 1 ? 'es' : '') + ' highlighted.';
        }
    </script>
</div>