জাভাস্ক্রিপ্ট ব্যবহার করে কীভাবে পাঠ্যকে হাইলাইট করবেন


103

কেউ আমাকে জাভাস্ক্রিপ্ট ফাংশন সাহায্য করতে পারে যা একটি ওয়েব পৃষ্ঠায় পাঠ্য হাইলাইট করতে পারে। এবং প্রয়োজনীয়তাটি হ'ল - একবারে হাইলাইট করা, পাঠ্যের সমস্ত উপস্থিতি হাইলাইট করার মতো নয় যেমন আমরা অনুসন্ধানের ক্ষেত্রে করি।


4
আপনি যদি ফাংশনের কোড পোস্ট করেন তবে আমরা সহায়তা করতে সক্ষম হব। আপনি যদি আমাদের জন্য এমন একটি ফাংশন তৈরি করতে বলেন তবে ... তার সম্ভাবনা কম। আপনাকে নিজের কিছু করতে হবে। কিছু করা শুরু করুন এবং আটকে গেলে ফিরে আসুন।
ফেলিক্স ক্লিং

7
হ্যাঁ আমি কীভাবে জিজ্ঞাসা করব তা আমি পড়েছি এবং আমি নিজে থেকে কিছু করেছি তবে আমি আটকে গিয়েছিলাম এবং সে কারণেই আমি জিজ্ঞাসা করেছি। আমি অ্যান্ড্রয়েডে কাজ করি এবং জাভাস্রিপ্ট সম্পর্কে খুব কম জ্ঞান আছে যে কারণে আমি নিজে থেকে এটি করতে পারছি না। আগে আমি একটি আলাদা জাভাস্ক্রিপ্ট ব্যবহার করছিলাম যা কাজটি করেছে তবে নির্দিষ্ট সীমাবদ্ধতা ছাড়াই নয়। এই প্রশ্নটি জিজ্ঞাসা করার সময় আমি সঠিক শব্দ ব্যবহার করতে পারি নি এবং এর জন্য আমি দুঃখিত তবে দয়া করে অন্যথায় ভাবেন না।
অঙ্কিত

4
এই প্লাগইনটি আপনার পক্ষে আগ্রহী হতে পারে: github.com/julmot/jmHightlight । এটি কীওয়ার্ডগুলি আলাদাভাবে বা একটি শব্দ হিসাবে হাইলাইট করতে পারে, আপনার কাস্টম উপাদান এবং শ্রেণিবদ্ধের সাথে মিলটি হাইলাইট করতে পারে এবং ডায়াক্রিটিক্সের জন্যও অনুসন্ধান করতে পারে। শীর্ষে এটি আপনাকে সেই প্রসঙ্গে ফিল্টার করতে দেয় যেখানে ম্যাচগুলির জন্য অনুসন্ধান করা উচিত।
বউ

4
চেকআউট নিম্নলিখিত Regex উপায় ... stackoverflow.com/a/45519242/2792959

আমি এখানে সে সম্পর্কে একটি নিবন্ধ প্রস্তুত করেছি, exhesham.com/2017/11/20/…
হেশাম ইয়াসিন

উত্তর:


107

আপনি jquery হাইলাইট প্রভাব ব্যবহার করতে পারেন ।

তবে আপনি যদি কাঁচা জাভাস্ক্রিপ্ট কোডটিতে আগ্রহী হন, তবে আমি কী পেয়েছি তা একবার দেখুন একটি HTML এ কীভাবে অনুলিপি করুন, ফাইলটি খুলুন এবং "হাইলাইট" ক্লিক করুন - এটি "ফক্স" শব্দটি হাইলাইট করা উচিত। পারফরম্যান্স অনুযায়ী আমি মনে করি এটি ছোট পাঠ্য এবং একক পুনরাবৃত্তির জন্য করবে (যেমন আপনি নির্দিষ্ট করেছেন)

function highlight(text) {
  var inputText = document.getElementById("inputText");
  var innerHTML = inputText.innerHTML;
  var index = innerHTML.indexOf(text);
  if (index >= 0) { 
   innerHTML = innerHTML.substring(0,index) + "<span class='highlight'>" + innerHTML.substring(index,index+text.length) + "</span>" + innerHTML.substring(index + text.length);
   inputText.innerHTML = innerHTML;
  }
}
.highlight {
  background-color: yellow;
}
<button onclick="highlight('fox')">Highlight</button>

<div id="inputText">
  The fox went over the fence
</div>

সম্পাদনা:

ব্যবহার replace

আমি দেখেছি এই উত্তরটি কিছু জনপ্রিয়তা পেয়েছে, আমি ভেবেছিলাম আমি এটি যুক্ত করতে পারি। আপনি সহজেই প্রতিস্থাপন ব্যবহার করতে পারেন

"the fox jumped over the fence".replace(/fox/,"<span>fox</span>");

বা একাধিক ঘটনার জন্য (প্রশ্নের জন্য প্রাসঙ্গিক নয়, তবে মন্তব্যে জিজ্ঞাসা করা হয়েছিল) আপনি কেবল globalস্থান পরিবর্তন করতে পারেন নিয়মিত অভিব্যক্তি।

"the fox jumped over the other fox".replace(/fox/g,"<span>fox</span>");

আশা করি এটি আগ্রহী কমেন্টারদের সহায়তা করবে।

পুরো ওয়েব পৃষ্ঠায় এইচটিএমএল প্রতিস্থাপন

পুরো ওয়েব পৃষ্ঠার জন্য এইচটিএমএল প্রতিস্থাপন করতে innerHTML, আপনার নথির বডি উল্লেখ করা উচিত ।

document.body.innerHTML


আপনার উত্তরের জন্য অনেক ধন্যবাদ তবে আপনি কীভাবে জাভাস্ক্রিপ্টে রঙটি নির্দিষ্ট করবেন তাও আমাকে বলতে পারেন
অঙ্কিত

আপনি এর "<span class='highlight'>"সাথে প্রতিস্থাপন করতে পারেন "<span style='color: " + color + ";'>", রঙটি এমন কিছু হওয়া উচিতvar color = "#ff0000";
ইয়ানিরো

আমি যদি পুরো পৃষ্ঠায় কোনও শব্দের সমস্ত উপস্থিতি হাইলাইট করতে চাই? @ গুই মোগ্রবী
বাকের নকভি

4
একটি সাধারণ "প্রতিস্থাপন" ব্যবহার করা একটি খারাপ ধারণা । আমি এখানে কেন বর্ণনা করেছি: stackoverflow.com/a/32758672/3894981
dude

4
এটি দুর্দান্ত ধারণা নয় কারণ এটি HTML ট্যাগ / বৈশিষ্ট্য / ইত্যাদি হাইলাইট করার চেষ্টা করবে। উদাহরণস্বরূপ, এর ক্ষেত্রে কী ঘটবে: <img src="fox.jpg" /> আপনি অবৈধ এইচটিএমএল পাবেন যা দেখতে পছন্দ করবে: <img src="<span class='highlight'>fox</span>.jpg" /> ভাল নয়
ডিসিপোর্টার

51

এখানে প্রদত্ত সমাধানগুলি বেশ খারাপ।

  1. আপনি রেজেক্স ব্যবহার করতে পারবেন না, কারণ আপনি এইচটিএমএল ট্যাগগুলিতে অনুসন্ধান / হাইলাইট করেন।
  2. আপনি রিজেক্স ব্যবহার করতে পারবেন না, কারণ এটি ইউটিএফ * (ল্যাটিন / ইংরেজি অক্ষরের সাথে কোনও কিছুই) দিয়ে সঠিকভাবে কাজ করে না।
  3. কারণ এই যখন অক্ষর একটি বিশেষ HTML স্বরলিপি, যেমন নেই কাজ করে আপনি শুধু একটি innerHTML.replace ব্যবহার করতে পারবেন না, &amp;এর জন্য &, &lt;<, জন্য &gt;জন্য>, &auml;একটি জন্য, &ouml;হে জন্য &uuml;তোমার জন্য &szlig;SS জন্য, ইত্যাদি

তোমাকে যা করতে হবে:

লুপ HTML ডকুমেন্ট মাধ্যমে সমস্ত পাঠ্য নোড খুঁজে পেতে, textContentসঙ্গে হাইলাইট টেক্সট অবস্থান পেতে indexOf(একটি ঐচ্ছিক সঙ্গে toLowerCaseযদি এটা কেস-অবশ হওয়া উচিত) পরিশেষে যোগ সবকিছু আগে, indexofযেমন textNode, পরিশেষে যোগ একটি হাইলাইট বিঘত সঙ্গে মিলেছে পাঠ্য, এবং বাকী পাঠ্য নোডের জন্য পুনরাবৃত্তি করুন (হাইলাইট স্ট্রিংটি স্ট্রিংয়ে একাধিকবার সংঘটিত হতে পারে textContent)।

এর জন্য কোডটি এখানে:

var InstantSearch = {

    "highlight": function (container, highlightText)
    {
        var internalHighlighter = function (options)
        {

            var id = {
                container: "container",
                tokens: "tokens",
                all: "all",
                token: "token",
                className: "className",
                sensitiveSearch: "sensitiveSearch"
            },
            tokens = options[id.tokens],
            allClassName = options[id.all][id.className],
            allSensitiveSearch = options[id.all][id.sensitiveSearch];


            function checkAndReplace(node, tokenArr, classNameAll, sensitiveSearchAll)
            {
                var nodeVal = node.nodeValue, parentNode = node.parentNode,
                    i, j, curToken, myToken, myClassName, mySensitiveSearch,
                    finalClassName, finalSensitiveSearch,
                    foundIndex, begin, matched, end,
                    textNode, span, isFirst;

                for (i = 0, j = tokenArr.length; i < j; i++)
                {
                    curToken = tokenArr[i];
                    myToken = curToken[id.token];
                    myClassName = curToken[id.className];
                    mySensitiveSearch = curToken[id.sensitiveSearch];

                    finalClassName = (classNameAll ? myClassName + " " + classNameAll : myClassName);

                    finalSensitiveSearch = (typeof sensitiveSearchAll !== "undefined" ? sensitiveSearchAll : mySensitiveSearch);

                    isFirst = true;
                    while (true)
                    {
                        if (finalSensitiveSearch)
                            foundIndex = nodeVal.indexOf(myToken);
                        else
                            foundIndex = nodeVal.toLowerCase().indexOf(myToken.toLowerCase());

                        if (foundIndex < 0)
                        {
                            if (isFirst)
                                break;

                            if (nodeVal)
                            {
                                textNode = document.createTextNode(nodeVal);
                                parentNode.insertBefore(textNode, node);
                            } // End if (nodeVal)

                            parentNode.removeChild(node);
                            break;
                        } // End if (foundIndex < 0)

                        isFirst = false;


                        begin = nodeVal.substring(0, foundIndex);
                        matched = nodeVal.substr(foundIndex, myToken.length);

                        if (begin)
                        {
                            textNode = document.createTextNode(begin);
                            parentNode.insertBefore(textNode, node);
                        } // End if (begin)

                        span = document.createElement("span");
                        span.className += finalClassName;
                        span.appendChild(document.createTextNode(matched));
                        parentNode.insertBefore(span, node);

                        nodeVal = nodeVal.substring(foundIndex + myToken.length);
                    } // Whend

                } // Next i 
            }; // End Function checkAndReplace 

            function iterator(p)
            {
                if (p === null) return;

                var children = Array.prototype.slice.call(p.childNodes), i, cur;

                if (children.length)
                {
                    for (i = 0; i < children.length; i++)
                    {
                        cur = children[i];
                        if (cur.nodeType === 3)
                        {
                            checkAndReplace(cur, tokens, allClassName, allSensitiveSearch);
                        }
                        else if (cur.nodeType === 1)
                        {
                            iterator(cur);
                        }
                    }
                }
            }; // End Function iterator

            iterator(options[id.container]);
        } // End Function highlighter
        ;


        internalHighlighter(
            {
                container: container
                , all:
                    {
                        className: "highlighter"
                    }
                , tokens: [
                    {
                        token: highlightText
                        , className: "highlight"
                        , sensitiveSearch: false
                    }
                ]
            }
        ); // End Call internalHighlighter 

    } // End Function highlight

};

তারপরে আপনি এটি ব্যবহার করতে পারেন:

function TestTextHighlighting(highlightText)
{
    var container = document.getElementById("testDocument");
    InstantSearch.highlight(container, highlightText);
}

এইচটিএমএল ডকুমেন্টের একটি উদাহরণ এখানে

<!DOCTYPE html>
<html>
    <head>
        <title>Example of Text Highlight</title>
        <style type="text/css" media="screen">
            .highlight{ background: #D3E18A;}
            .light{ background-color: yellow;}
        </style>
    </head>
    <body>
        <div id="testDocument">
            This is a test
            <span> This is another test</span>
            äöüÄÖÜäöüÄÖÜ
            <span>Test123&auml;&ouml;&uuml;&Auml;&Ouml;&Uuml;</span>
        </div>
    </body>
</html>

যাইহোক, আপনি যদি একটি ডাটাবেস দিয়ে অনুসন্ধান করেন LIKE,
যেমন WHERE textField LIKE CONCAT('%', @query, '%')[যা আপনার করা উচিত নয়, আপনার ফুলটেক্সট-অনুসন্ধান বা লুসিন ব্যবহার করা উচিত], তবে আপনি প্রতিটি অক্ষরকে character দিয়ে পালাতে পারেন এবং একটি এসকিউএল-এসেসেপ-স্টেটমেন্ট যুক্ত করতে পারেন, সেভাবে আপনি বিশেষ অক্ষরগুলি দেখতে পাবেন যেগুলি লাইক-এক্সপ্রেশন।

যেমন

WHERE textField LIKE CONCAT('%', @query, '%') ESCAPE '\'

এবং @ ক্যোয়ারির মানটি কিন্তু '%completed%'নয়'%\c\o\m\p\l\e\t\e\d%'

(পরীক্ষিত, এসকিউএল-সার্ভার এবং পোস্টগ্র্যাস এসকিউএল এবং ESCAPE সমর্থন করে এমন প্রতিটি আরডিবিএমএস সিস্টেমের সাথে কাজ করে)


একটি সংশোধিত টাইপস্ক্রিপ্ট-সংস্করণ:

namespace SearchTools 
{


    export interface IToken
    {
        token: string;
        className: string;
        sensitiveSearch: boolean;
    }


    export class InstantSearch 
    {

        protected m_container: Node;
        protected m_defaultClassName: string;
        protected m_defaultCaseSensitivity: boolean;
        protected m_highlightTokens: IToken[];


        constructor(container: Node, tokens: IToken[], defaultClassName?: string, defaultCaseSensitivity?: boolean)
        {
            this.iterator = this.iterator.bind(this);
            this.checkAndReplace = this.checkAndReplace.bind(this);
            this.highlight = this.highlight.bind(this);
            this.highlightNode = this.highlightNode.bind(this);    

            this.m_container = container;
            this.m_defaultClassName = defaultClassName || "highlight";
            this.m_defaultCaseSensitivity = defaultCaseSensitivity || false;
            this.m_highlightTokens = tokens || [{
                token: "test",
                className: this.m_defaultClassName,
                sensitiveSearch: this.m_defaultCaseSensitivity
            }];
        }


        protected checkAndReplace(node: Node)
        {
            let nodeVal: string = node.nodeValue;
            let parentNode: Node = node.parentNode;
            let textNode: Text = null;

            for (let i = 0, j = this.m_highlightTokens.length; i < j; i++)
            {
                let curToken: IToken = this.m_highlightTokens[i];
                let textToHighlight: string = curToken.token;
                let highlightClassName: string = curToken.className || this.m_defaultClassName;
                let caseSensitive: boolean = curToken.sensitiveSearch || this.m_defaultCaseSensitivity;

                let isFirst: boolean = true;
                while (true)
                {
                    let foundIndex: number = caseSensitive ?
                        nodeVal.indexOf(textToHighlight)
                        : nodeVal.toLowerCase().indexOf(textToHighlight.toLowerCase());

                    if (foundIndex < 0)
                    {
                        if (isFirst)
                            break;

                        if (nodeVal)
                        {
                            textNode = document.createTextNode(nodeVal);
                            parentNode.insertBefore(textNode, node);
                        } // End if (nodeVal)

                        parentNode.removeChild(node);
                        break;
                    } // End if (foundIndex < 0)

                    isFirst = false;


                    let begin: string = nodeVal.substring(0, foundIndex);
                    let matched: string = nodeVal.substr(foundIndex, textToHighlight.length);

                    if (begin)
                    {
                        textNode = document.createTextNode(begin);
                        parentNode.insertBefore(textNode, node);
                    } // End if (begin)

                    let span: HTMLSpanElement = document.createElement("span");

                    if (!span.classList.contains(highlightClassName))
                        span.classList.add(highlightClassName);

                    span.appendChild(document.createTextNode(matched));
                    parentNode.insertBefore(span, node);

                    nodeVal = nodeVal.substring(foundIndex + textToHighlight.length);
                } // Whend

            } // Next i 

        } // End Sub checkAndReplace 


        protected iterator(p: Node)
        {
            if (p == null)
                return;

            let children: Node[] = Array.prototype.slice.call(p.childNodes);

            if (children.length)
            {
                for (let i = 0; i < children.length; i++)
                {
                    let cur: Node = children[i];

                    // https://developer.mozilla.org/en-US/docs/Web/API/Node/nodeType
                    if (cur.nodeType === Node.TEXT_NODE) 
                    {
                        this.checkAndReplace(cur);
                    }
                    else if (cur.nodeType === Node.ELEMENT_NODE) 
                    {
                        this.iterator(cur);
                    }
                } // Next i 

            } // End if (children.length) 

        } // End Sub iterator


        public highlightNode(n:Node)
        {
            this.iterator(n);
        } // End Sub highlight 


        public highlight()
        {
            this.iterator(this.m_container);
        } // End Sub highlight 


    } // End Class InstantSearch 


} // End Namespace SearchTools 

ব্যবহার:

let searchText = document.getElementById("txtSearchText");
let searchContainer = document.body; // document.getElementById("someTable");
let highlighter = new SearchTools.InstantSearch(searchContainer, [
    {
        token: "this is the text to highlight" // searchText.value,
        className: "highlight", // this is the individual highlight class
        sensitiveSearch: false
    }
]);


// highlighter.highlight(); // this would highlight in the entire table
// foreach tr - for each td2 
highlighter.highlightNode(td2); // this highlights in the second column of table

দুর্দান্ত উত্তর .. পদ্ধতিটি ওভারকিলের মতো দেখায় তবে সংক্ষিপ্ত! স্পষ্টতই সেই পদ্ধতিটির সাথে একটি গতি পরীক্ষা করতে আগ্রহী হবে যেমন আমার ক্ষেত্রে ফলাফলগুলি ডমটিতে লোড হয় (যেমন হাজার হাজার ফলাফল থাকতে পারে ), আগ্রহী যদি এই পদ্ধতিটি অলস লোডটিতে একটি উচ্চতর বিলম্বকে যুক্ত করে।
পোগরিন্ডিস

6
দুঃখিত, তবে আপনার কোন যুক্তিই সত্য নয় are 1. আপনি একেবারে একটি RegExp ব্যবহার করতে পারেন, আপনার কেবল HTML মানের ভিতরে নয়, তবে কোনও উপাদানটির পাঠ্য মানটি অনুসন্ধান করা উচিত। 2. আপনি একেবারে, বৈশিষ্ট্যসূচক অক্ষর RegExp ব্যবহার করতে পারেন বাস্তবায়িত যেমন mark.js । ৩. এইচটিএমএল স্বরলিপিগুলি ব্রাউজারের ডম-এ প্রকৃত অক্ষরগুলিতে রূপান্তরিত হবে, সুতরাং আপনি এগুলিও একেবারে ব্যবহার করুন!
শহরবাসী

4
@ জুলমোট; থেকে 1: যার অর্থ আপনার প্রতিটি উপাদান দিয়ে পুনরাবৃত্তি করা দরকার যা আমি যা করি তা অবিকল। আপনি যদি বিন্যাসটি হারাতে আগ্রহী না হন তবে এক্ষেত্রে আপনি ডকুমেন্ট.বডি.ইন.নেটেক্সটেক্সে অনুসন্ধান করতে পারবেন যা বেশ ধীর হয়ে যাবে। ৩.ডম-এ নয়, তবে টেক্সট-উপাদানটির অভ্যন্তরীণ পাঠ্য বা টেক্সট কনটেন্ট সম্পত্তি। যার অর্থ আবারও আপনাকে পাঠ্য উপাদানগুলির মাধ্যমে পুনরাবৃত্তি করতে হবে; RegEx AFAIK দিয়ে করা যায় না। 2: চিহ্ন.জেগুলি জানেন না, তবে আমি jQuery.each করে এমন সমস্ত কিছু এড়াতে চাইব কারণ এটি খুব ধীর।
স্টিফান স্টেইগার

4
@ স্টেফানস্টেইগার ১. তারপরে আপনার সিদ্ধান্ত সম্পর্কিত সম্পর্কটি সংশোধন করা উচিত, যেমন এটি বলে যে আমরা কোনও রেজিএক্সপেক্টের সাথে মোটেই অনুসন্ধান করতে পারি না, যা সত্য নয় It এটি jQuery.each ব্যবহার করে না। এটা চিন্তা করছো কেন? ৩. এটি সত্য নয়, অন্তত ফায়ারফক্সে। &auml;যেমন ব্যবহার করার পরেও প্রকৃত চরিত্রে রূপান্তরিত হবে innerHTML
শহরবাসী

4
হাই @ স্টেফ্যানস্টেইগার আসলে, আমি আপনার সমাধানগুলি ব্যবহার করছি। এই এক নিখুঁত। তবে কিছু সমস্যা আছে যেমন, যদি II এর একটি পি থাকে যেখানে দুটি স্প্যান থাকে এবং একটি স্প্যানে ডিপ্লোমা এমএসবিটিইর মতো ডেটা থাকে এবং দ্বিতীয় স্প্যানটিতে 2012 এর ডেটা থাকে। এখন যদি স্ট্রিংটি আমি হাইলাইট করতে চাই তা ডিপ্লোমা এমএসবিটিই ২০১২, এই পুরো স্ট্রিংটি তখন আমি পরীক্ষা করে দেখলাম এটি কার্যকর হয় না, যা মিলছে তার সব কিছু যদি একটি স্প্যানে উপস্থিত থাকে তবে এটি কাজ করে, তবে যদি পাঠ্য সামগ্রীটি আলাদা আলাদা ট্যাগে থাকে তবে এটা কাজ করে না. আপনি এই সম্পর্কে কিছু বলতে পারেন?
গণেশ্ক

42

কেন একটি স্ব-তৈরি হাইলাইটিং ফাংশন ব্যবহার করা একটি খারাপ ধারণা

আপনার নিজের হাইলাইটিং ফাংশনটি স্ক্র্যাচ থেকে শুরু করা সম্ভবত এটির পক্ষে খারাপ ধারণা হবার কারণ হ'ল আপনি অন্যদের ইতিমধ্যে সমাধান করা সমস্যাগুলিতে অবশ্যই চলে যাবেন। চ্যালেঞ্জগুলি:

  • আপনার ম্যাচগুলিকে DOM ইভেন্টগুলি বিনষ্ট না করে এবং DOM পুনঃজন্মকে বারবার ট্রিগার না করে আপনার HTML উপাদানগুলির সাথে পাঠ্য নোডগুলি সরিয়ে ফেলতে হবে (উদাহরণস্বরূপ এটি হবে innerHTML)
  • আপনি যদি হাইলাইট হওয়া উপাদানগুলি মুছতে চান তবে আপনাকে এইচটিএমএল উপাদানগুলি তাদের সামগ্রীর সাথে মুছে ফেলতে হবে এবং আরও অনুসন্ধানের জন্য বিভক্ত পাঠ্য নোডগুলিও একত্র করতে হবে। এটি প্রয়োজনীয় কারণ প্রতিটি হাইলাইটার প্লাগইন ম্যাচের জন্য পাঠ্য নোডের ভিতরে অনুসন্ধান করে এবং যদি আপনার কীওয়ার্ডগুলি কয়েকটি পাঠ্য নোডে বিভক্ত হয়ে থাকে তবে সেগুলি পাওয়া যাবে না।
  • আপনার প্লাগইন এমন পরিস্থিতিতে কাজ করে যা আপনি ভাবেননি তা নিশ্চিত করার জন্যও আপনাকে পরীক্ষা তৈরি করতে হবে। এবং আমি ক্রস ব্রাউজার পরীক্ষা সম্পর্কে কথা বলছি!

জটিল মনে হচ্ছে? আপনি যদি কিছু বৈশিষ্ট্যগুলি চান যেমন হাইলাইট করা থেকে কিছু উপাদানকে উপেক্ষা, ডায়াক্রিটিক্স ম্যাপিং, প্রতিশব্দ ম্যাপিং, আইফ্রেমে ভিতরে অনুসন্ধান করা, পৃথক শব্দের অনুসন্ধান ইত্যাদি ইত্যাদি আরও জটিল হয়ে ওঠে।

একটি বিদ্যমান প্লাগইন ব্যবহার করুন

একটি বিদ্যমান, ভাল বাস্তবায়িত প্লাগইন ব্যবহার করার সময়, আপনাকে উপরে বর্ণিত জিনিসগুলি নিয়ে চিন্তা করতে হবে না। নিবন্ধটি 10 jQuery এর টেক্সট হাইলাইটার প্লাগিন SitePoint জনপ্রিয় হাইলাইটার প্লাগিন তুলনা করা হয়।

চিহ্ন.জেএস এ দেখুন

চিহ্ন.js হ'ল এমন একটি প্লাগইন যা খাঁটি জাভাস্ক্রিপ্টে লিখিত হয় তবে এটি jQuery প্লাগইন হিসাবে উপলব্ধ। অপশনগুলির সাথে অন্যান্য প্লাগিনগুলির চেয়ে বেশি সুযোগ দেওয়ার জন্য এটি তৈরি করা হয়েছিল:

  • সম্পূর্ণ শব্দটির পরিবর্তে আলাদাভাবে কীওয়ার্ড অনুসন্ধান করুন
  • মানচিত্র ডায়াক্রিটিক্স (উদাহরণস্বরূপ যদি "জাস্টো" এছাড়াও "জাস্টো" এর সাথে মেলে)
  • কাস্টম উপাদানগুলির মধ্যে ম্যাচগুলি উপেক্ষা করুন
  • কাস্টম হাইলাইটিং উপাদান ব্যবহার করুন
  • কাস্টম হাইলাইটিং ক্লাস ব্যবহার করুন
  • মানচিত্র কাস্টম প্রতিশব্দ
  • iframes ভিতরেও অনুসন্ধান করুন
  • পদ পাওয়া যায় নি

ডেমো

বিকল্পভাবে আপনি এই ঝাঁকুনি দেখতে পারেন ।

ব্যবহারের উদাহরণ :

// Highlight "keyword" in the specified context
$(".context").mark("keyword");

// Highlight the custom regular expression in the specified context
$(".context").markRegExp(/Lorem/gmi);

এটি গিটহাবের ( প্রকল্পের রেফারেন্স ) মুক্ত এবং বিকাশযুক্ত মুক্ত উত্স ।


4
একা পাঠ্য হাইলাইট করা আমার পক্ষে jQuery অন্তর্ভুক্ত করার পক্ষে যথেষ্ট উপযুক্ত কারণ নয়।
রায়

10
@ রয় আমি এই বিষয়টি মনে রেখেছি সুখবর, v6.0.0 হিসাবে mark.js jQuery এর নির্ভরতা মওকুফ এবং এটি এখন তোলে ঐচ্ছিকরূপে jQuery এর প্লাগইন যেমন ব্যবহার করতে।
শহরবাসী

সমস্ত সত্য, ব্যতীত: 1 ম পয়েন্টটি সম্ভব নয়, কারণ আপনি নিবন্ধিত ইভেন্ট হ্যান্ডলারগুলি পেতে পারেন না এবং এমনকি আপনি যদি বেনাম ফাংশন সেট করতে পারেন না ... 2 য়: চিহ্নিত.js দুটি ট্যাগের মধ্যেও টেক্সট খুঁজে পায় না, যেমন <span> s </span> এডিটি সেড পাবেন না ... 3 য়: যখনই কোনও ব্রাউজার আসে (নতুন সংস্করণ সহ) আপনি এখনও এটি পরীক্ষা করেন নি, এটি ভেঙে যেতে পারে। এটি সর্বদা সত্য, আপনি যতগুলি পরীক্ষা লেখেন তা নয়। 17 কেবিতে, চিহ্নগুলি এটির জন্য খুব বড়।
স্টিফান স্টেইগার

আপনি কী স্টিফ্যানস্টেইগারকে উল্লেখ করছেন? সেই তথ্য ব্যতীত প্রথম পয়েন্টটিতে কিছু বলতে পারি না। তবে, দ্বিতীয় মন্তব্যটি ভুল, চিহ্নিত.js acrossElementsবিকল্পটি ব্যবহার করে ট্যাগগুলির মধ্যে ম্যাচগুলি খুঁজে পেতে পারে । এবং তৃতীয় মন্তব্য; চিহ্নিত.জেএস এটি সরবরাহ করে এমন কার্যকারিতার তুলনায় বড় নয়। এবং না, ভবিষ্যতে কিছু ভাঙ্গার সম্ভাবনা নেই, যেহেতু মার্ক.জেএস পরীক্ষা করা হয়েছিল যেমন ক্রোম 30 শুরু করা এবং ক্রস ব্রাউজার ইউনিট পরীক্ষার সমস্ত নতুন সংস্করণে এবং আসন্ন সংস্করণগুলির সাথে কোনও সমস্যা ছিল না।
শহরবাসী

@ ডড: প্রথম অনুচ্ছেদের পরে তিনটি পয়েন্ট। আহ, ঠিক আছে, আমি যে ডেমোটির দিকে চেয়েছিলাম সেই বিকল্পটি অনুপস্থিত। সেক্ষেত্রে এটি কিছুটা বুদ্ধিমান হতে পারে। তবে এখনও, আমি এটি খুব বড় বলে মনে করি।
স্টিফান স্টেইগার

10
function stylizeHighlightedString() {

    var text = window.getSelection();

    // For diagnostics
    var start = text.anchorOffset;
    var end = text.focusOffset - text.anchorOffset;

    range = window.getSelection().getRangeAt(0);

    var selectionContents = range.extractContents();
    var span = document.createElement("span");

    span.appendChild(selectionContents);

    span.style.backgroundColor = "yellow";
    span.style.color = "black";

    range.insertNode(span);
}

4
মোহিত, এসও তে স্বাগতম কোডটির কিছু বর্ণনা সুন্দর লাগবে!
নিপ্পি 26'12

অন্য নোড না তৈরি করে পাঠ্য বাছাই করার উপায় থাকতে পারে না?
ডেভ গ্রেগরি

@ ব্যবহারকারী191433 প্রশ্নটি কেবল পাঠ্য নির্বাচন করা নয়, শৈলী প্রয়োগ করার ক্ষেত্রেও। তার জন্য আপনার নোড দরকার।
ক্রিস্টোফ

জাভাস্ক্রিপ্ট সিএসএসে span.style.backgroundColor = "yellow";অনুবাদ করে এমন অনুস্মারক / টিপ style="background-color: yellow;"- এটি উটকেস এবং ড্যাশড-নোটেশনের মধ্যে সূক্ষ্ম পার্থক্য আমাকে প্রথমে ছড়িয়ে দেয়।
মার্কহু

4
স্ট্যাকওভারফ্লো . com/ জিজ্ঞাসাগুলি / 14৯৯৪74/৪/২ এ পিএস মোহিতের উত্তরটি এই কোডটির একটি আরও সুবিন্যস্ত বৈকল্পিক। (উদাহরণস্বরূপ শুরু এবং শেষের ভেরিয়েবল বাদ জন্য যা এখানে একমাত্র ডায়গনিস্টিক / অ কার্মিক আছে।)
MarkHu

8

এখানে আমার regexp খাঁটি জাভাস্ক্রিপ্ট সমাধান:

function highlight(text) {
    document.body.innerHTML = document.body.innerHTML.replace(
        new RegExp(text + '(?!([^<]+)?<)', 'gi'),
        '<b style="background-color:#ff0;font-size:100%">$&</b>'
    );
}

আমি যে লেখার ব্লকটি হাইলাইট করার চেষ্টা করছি তার মধ্যে এইচটিএমএল ট্যাগ রয়েছে এটি আমার পক্ষে পুরোপুরি কাজ করে।
জন চ্যাপম্যান

আপনি one|two|three
রেজিপ্যাক্স

পাঠ্যের শেষে যদি একটি >অক্ষর থাকে তবে এটি পাঠ্যটি প্রতিস্থাপন করবে না । (?!([^<]+)?<)এটি কাজ করার জন্য ব্যবহার করে রেজেক্সটি সংশোধন করুন ।
আর্চি রেইস

অনুরোধ অনুসারে সংশোধিত
ক্লিমেন তুয়ার

পারফেক্ট! এটি আমার জন্য সেরা
মার্কো বুরোমেটো

6

অন্য কোনও সমাধানের সত্যিকার অর্থেই আমার প্রয়োজন মাপসই হয় না এবং যদিও স্টেফান স্টাইজারের সমাধানটি আমি প্রত্যাশা মতো কাজ করেছি তবে আমি এটি কিছুটা ভার্জোজাল পেয়েছি।

নিম্নলিখিত আমার প্রচেষ্টা:

/**
 * Highlight keywords inside a DOM element
 * @param {string} elem Element to search for keywords in
 * @param {string[]} keywords Keywords to highlight
 * @param {boolean} caseSensitive Differenciate between capital and lowercase letters
 * @param {string} cls Class to apply to the highlighted keyword
 */
function highlight(elem, keywords, caseSensitive = false, cls = 'highlight') {
  const flags = caseSensitive ? 'gi' : 'g';
  // Sort longer matches first to avoid
  // highlighting keywords within keywords.
  keywords.sort((a, b) => b.length - a.length);
  Array.from(elem.childNodes).forEach(child => {
    const keywordRegex = RegExp(keywords.join('|'), flags);
    if (child.nodeType !== 3) { // not a text node
      highlight(child, keywords, caseSensitive, cls);
    } else if (keywordRegex.test(child.textContent)) {
      const frag = document.createDocumentFragment();
      let lastIdx = 0;
      child.textContent.replace(keywordRegex, (match, idx) => {
        const part = document.createTextNode(child.textContent.slice(lastIdx, idx));
        const highlighted = document.createElement('span');
        highlighted.textContent = match;
        highlighted.classList.add(cls);
        frag.appendChild(part);
        frag.appendChild(highlighted);
        lastIdx = idx + match.length;
      });
      const end = document.createTextNode(child.textContent.slice(lastIdx));
      frag.appendChild(end);
      child.parentNode.replaceChild(frag, child);
    }
  });
}

// Highlight all keywords found in the page
highlight(document.body, ['lorem', 'amet', 'autem']);
.highlight {
  background: lightpink;
}
<p>Hello world lorem ipsum dolor sit amet, consectetur adipisicing elit. Est vel accusantium totam, ipsum delectus et dignissimos mollitia!</p>
<p>
  Lorem ipsum dolor sit amet, consectetur adipisicing elit. Numquam, corporis.
  <small>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Accusantium autem voluptas perferendis dolores ducimus velit error voluptatem, qui rerum modi?</small>
</p>

আমিও এর মতো কিছু ব্যবহার করার পরামর্শ দেব পালাবার স্ট্রিং-regexp আপনার কীওয়ার্ড বিশেষ অক্ষর আছে যা regexes মধ্যে পলান করা প্রয়োজন হবে থাকতে পারে যদি:

const keywordRegex = RegExp(keywords.map(escapeRegexp).join('|')), flags);

এটি আমার পক্ষে ভাল কাজ করেছে তবে এটি "চিহ্নমুক্ত" করারও একটি উপায় প্রয়োজন
jwzumwalt

5

আমার একই সমস্যা রয়েছে, একটি গুচ্ছ পাঠ্য একটি এক্সএমএলএইচটিপি অনুরোধের মাধ্যমে আসে। এই পাঠ্যটি এইচটিএমএল বিন্যাসিত। আমি প্রতিটি ঘটনা হাইলাইট করা প্রয়োজন।

str='<img src="brown fox.jpg" title="The brown fox" />'
    +'<p>some text containing fox.</p>'

সমস্যাটি হ'ল ট্যাগগুলিতে আমার পাঠ্য হাইলাইট করার দরকার নেই। উদাহরণস্বরূপ আমাকে শিয়াল হাইলাইট করা প্রয়োজন:

এখন আমি এটি দিয়ে প্রতিস্থাপন করতে পারি:

var word="fox";
word="(\\b"+ 
    word.replace(/([{}()[\]\\.?*+^$|=!:~-])/g, "\\$1")
        + "\\b)";
var r = new RegExp(word,"igm");
str.replace(r,"<span class='hl'>$1</span>")

আপনার প্রশ্নের উত্তর দেওয়ার জন্য: আপনি জিজেটি রেজিপ্যাক্স বিকল্পগুলিতে ছেড়ে দিতে পারেন এবং কেবলমাত্র প্রথম ঘটনাটি প্রতিস্থাপন করা হবে তবে এটি এখনও ইমগ এসসিআর সম্পত্তি হিসাবে রয়েছে এবং চিত্র ট্যাগটি নষ্ট করে:

<img src="brown <span class='hl'>fox</span>.jpg" title="The brown <span 
class='hl'>fox</span> />

এইভাবেই আমি এটি সমাধান করেছি তবে ভাবছিলাম যে এর থেকে আরও ভাল উপায় আছে কি না, এমন কিছু যা আমি নিয়মিত প্রকাশে মিস করেছি:

str='<img src="brown fox.jpg" title="The brown fox" />'
    +'<p>some text containing fox.</p>'
var word="fox";
word="(\\b"+ 
    word.replace(/([{}()[\]\\.?*+^$|=!:~-])/g, "\\$1")
    + "\\b)";
var r = new RegExp(word,"igm");
str.replace(/(>[^<]+<)/igm,function(a){
    return a.replace(r,"<span class='hl'>$1</span>");
});

এটিই ছিল কেবলমাত্র রেইগেক্স সমাধান যা আমার সাথে <img src="word">বা ঝামেলা ছাড়াই কাজ করেছিল <a href="word">
yvesmancera

4
সুবর্ণ নিয়ম: কখনই নয়। ব্যবহার। নিয়মিত। এক্সপ্রেশন। প্রতি. মেস। সম্পর্কিত. সঙ্গে. এক্সএমএল।
স্কটএমসিগ্রিডি

4

সাধারণ টাইপস্ক্রিপ্ট উদাহরণ

দ্রষ্টব্য: আমি অনেক কিছুতে @ স্টেফানের সাথে একমত হওয়ার পরে আমার কেবল একটি সাধারণ ম্যাচ হাইলাইট করা দরকার:

module myApp.Search {
    'use strict';

    export class Utils {
        private static regexFlags = 'gi';
        private static wrapper = 'mark';

        private static wrap(match: string): string {
            return '<' + Utils.wrapper + '>' + match + '</' + Utils.wrapper + '>';
        }

        static highlightSearchTerm(term: string, searchResult: string): string {
            let regex = new RegExp(term, Utils.regexFlags);

            return searchResult.replace(regex, match => Utils.wrap(match));
        }
    }
}

এবং তারপরে প্রকৃত ফলাফলটি তৈরি করা:

module myApp.Search {
    'use strict';

    export class SearchResult {
        id: string;
        title: string;

        constructor(result, term?: string) {
            this.id = result.id;
            this.title = term ? Utils.highlightSearchTerm(term, result.title) : result.title;
        }
    }
}

3

এইচটিএমএল 5 যেহেতু আপনি <mark></mark>পাঠ্য হাইলাইট করতে ট্যাগ ব্যবহার করতে পারেন । আপনি এই ট্যাগগুলির মধ্যে কিছু পাঠ্য / কীওয়ার্ড মোড়ানোর জন্য জাভাস্ক্রিপ্ট ব্যবহার করতে পারেন। এখানে পাঠ্যটি কীভাবে চিহ্নিত এবং চিহ্নিত করতে হবে তার একটি ছোট্ট উদাহরণ।

জেএসফিডল ডেমো


innerHTMLবিপদজনক. এটি ইভেন্টগুলি মুছে ফেলবে।
শহরবাসী

4
এটিও সঠিকভাবে কাজ করে না কারণ উদাহরণস্বরূপ, আপনি JSFIDDLE "Lorem" এ প্রবেশ করলে এটি কেবল এটির প্রথম উদাহরণ চিহ্নিত করে।
agm1984

4
ওয়েল আপনাকে কেবল কীওয়ার্ডের সমস্ত উপস্থিতি প্রতিস্থাপন করতে হবে। এখানে বিশ্বব্যাপী রিজেক্সের
ক্যাস্পার তায়েমেন্স

2

2019 এর দ্রুত এগিয়ে, ওয়েব এপিআই-তে এখন পাঠ্যকে হাইলাইট করার জন্য স্থানীয়ভাবে সমর্থন রয়েছে:

const selection = document.getSelection();
selection.setBaseAndExtent(anchorNode, anchorOffset, focusNode, focusOffset);

এবং আপনি যেতে ভাল! anchorNodeহল নির্বাচন নোড, focusNodeনির্বাচন শেষ নোড। এবং, যদি সেগুলি পাঠ্য নোড offsetহয় তবে তা সংশ্লিষ্ট নোডগুলির মধ্যে শুরু এবং শেষ চরিত্রের সূচক the এখানে ডকুমেন্টেশন দেওয়া আছে

এমনকি তাদের একটি লাইভ ডেমো রয়েছে


ওহ উজ্জ্বল। কেবল এটির মতো এটি ব্যবহার করুন: সিলেকশন.সেটবেসএন্ডএক্সেন্ট (কাঙ্ক্ষিত নোড, 0, কাঙ্ক্ষিত নোড, 1); আপনার প্রয়োজন একমাত্র নোডটি হাইলাইট করতে। এবং এটি গুটেনবার্গের সাথে কাজ করে
টনিঅ্যান্ডার

1

আমিও ভাবছিলাম যে আপনি এই বিষয়ে যা শিখলেন তা চেষ্টা করতে পারেন পোস্টে ।

আমি ব্যবহার করতাম:

function highlightSelection() {
			var userSelection = window.getSelection();
			for(var i = 0; i < userSelection.rangeCount; i++) {
				highlightRange(userSelection.getRangeAt(i));
			}
			
		}
			
			function highlightRange(range) {
			    var newNode = document.createElement("span");
			    newNode.setAttribute(
			       "style",
			       "background-color: yellow; display: inline;"
			    );
			    range.surroundContents(newNode);
			}
<html>
	<body contextmenu="mymenu">

		<menu type="context" id="mymenu">
			<menuitem label="Highlight Yellow" onclick="highlightSelection()" icon="/images/comment_icon.gif"></menuitem>
		</menu>
		<p>this is text, select and right click to high light me! if you can`t see the option, please use this<button onclick="highlightSelection()">button </button><p>

আপনি এটি এখানে চেষ্টা করে দেখতেও পারেন : http://henriquedonati.com / প্রকল্প / এক্সটেনশন / এক্সটেনশন। html

এক্সসি


1

আমরা যদি এটিও পৃষ্ঠা লোডে হাইলাইট করতে চাই তবে একটি নতুন উপায় আছে।

শুধু যোগ কর #:~:text=Highlight%20These

এই লিঙ্কটি অ্যাক্সেস করার চেষ্টা করুন

/programming/38588721#:~:text=Highlight%20a%20text


-1

ব্যবহার করে রেঞ্জের ধরণে আউটসাইড কনটেন্টস () পদ্ধতি । এটির একমাত্র যুক্তি এমন একটি উপাদান যা এই ব্যাপ্তিটি মোড়বে।

function styleSelected() {
  bg = document.createElement("span");
  bg.style.backgroundColor = "yellow";
  window.getSelection().getRangeAt(0).surroundContents(bg);
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.