Javascript usercript - Найти и заменить: текстовые узлы и HTML - PullRequest
0 голосов
/ 13 октября 2018

Я пытаюсь создать пользовательский скрипт (Tampermonkey), чтобы добавить несколько вспомогательных кнопок на сайт, и первоначально я использовал скрипт ниже, основанный на опубликованном здесь .

setInterval(function() {

//RegEx for finding any string of digits after "ID: " up to the next space
var myRegexp = /ID:\s(\d*?)\s/gi;

];
var txtWalker   = document.createTreeWalker (
    document.body,
    NodeFilter.SHOW_TEXT,
    {   acceptNode: function (node) {
            //-- Skip whitespace-only nodes
            if (node.nodeValue.trim() )
                return NodeFilter.FILTER_ACCEPT;

            return NodeFilter.FILTER_SKIP;
        }
    },
    false
);
var txtNode     = null;

while (txtNode  = txtWalker.nextNode () ) {
    var oldTxt  = txtNode.nodeValue;

    //Find all instances
    match = myRegexp.exec(oldTxt);

    while (match != null) {

        //Get group from match
        var idNum = match[1]

        //Replace current match with added info
        oldTxt = oldTxt.(idNum, idNum+"| <SomeHTMLHere> "+idNum+"    | ");

        //Update text
        txtNode.nodeValue = oldTxt;

        //Check for remaining matches
        match = myRegexp.exec(oldTxt);
    }
}

}, 5000);

Теперь я хотел бы добавить немного больше функциональности к тексту, возможно, что-то, что можно будет щелкнуть, чтобы скопировать в буфер обмена или вставить в другое место.Теперь я знаю, что я работаю с текстовыми узлами в исходном скрипте, но я хотел знать, была ли в любом случае адаптация текущего скрипта для вставки HTML в эти точки без переписывания с нуля.

Основная проблема сsite - это ID: ##### значения, которые я ищу, отображаются в одном и том же элементе, как показано ниже, поэтому я могу просто найти их по элементу (или, по крайней мере, не так, как мне известно в JS).

<div>
ID: 1234567 | Text
ID: 45678 | Text
</div>

Если бы кто-то мог указать мне правильное направление, которое было бы замечательно, или хотя бы сказать, что это невозможно без переписывания.

1 Ответ

0 голосов
/ 14 октября 2018

Хорошо, так что переписать это на самом деле получилось довольно хорошо.Работает намного приятнее и лаконичнее.Надеюсь, это поможет кому-то в будущем.Если кто-то хочет предложить что-то улучшенное, пожалуйста, не стесняйтесь!

setInterval(function() {

//Regex
var reg = /ID:\s(\d*?)\s/gi;
var result;

//Get all classes that this applies to
$('.<parentClass>').each(function(i, obj) {
    var text = $(this).html();

    //Do until regex can't be found anymore
    while (result = reg.exec(text)) {

        //Get first regex group
        var str = result[1];
        //Add in desired HTML
        var newhtml = $(this).html().replace(str, '|<span class="marked">' + str + '</span>|');
        //Replace
        $(this).html(newhtml);
    }
});

//Click function for added HTML
$(".marked").click(function(){

    //Get text inside added HTML
    var id = $(this).text();
    //Construct desired string
    var Str = "someText " + id;
    //Insert into message box
    textarea = document.querySelector('.<inputArea>')
    textarea.value = Str;
    textarea.focus();
});

}, 5000);
...