调用另一个函数以获得返回值后,函数返回未定义

时间:2020-08-01 02:23:23

标签: javascript jquery function

上下文

我有一个网站,用户可以在其中创建文章,其他用户可以进入并突出显示这些文章,以便他们对突出显示进行评论。用户选择文章文本后,我想获取所选文本的HTML内容。这样做之后,我想对照文章的HTML检查文本,以查看文章是否匹配。这样做是因为我使用.cloneContents()来获取所选文本的HTML,该文本会自动关闭所有节点以使字符串有意义。我首先要获得选择:

if (window.getSelection) {

sel = window.getSelection();

}

然后我通过函数getSelectionHTML运行此函数,该函数返回所选文本的HTML:

    function getSelectionHTML() {

        var html = "";

        if (typeof window.getSelection != "undefined") { //for non-IE browsers

            var sel = window.getSelection(); //get selection

            if (sel.rangeCount) { //if selection was made?

                var container = document.createElement("div"); //create element to add content to

                for (var i = 0, len = sel.rangeCount; i < len; ++i) {

                    container.appendChild(sel.getRangeAt(i).cloneContents()); //get stuff and clone contents (???)

                }

                html = container.innerHTML;

            }

        } else if (typeof document.selection != "undefined") { //for IE < 9

            if (document.selection.type == "Text") {

                html = document.selection.createRange().htmlText;

            }

        }

        return html;

    }

这两个功能都可以正常工作。将getSelectionHTML的结果分配给变量selectedHTML之后,我通过调用var exists = checkIfTextExists(selectedHTML)

检查从此变量中选择的HTML是否与文章匹配
    function checkIfTextExists(highlight) {

        let $text = $("#articleContents");
        let textCurrent = $text.html().trim();
        let textToHighlight = highlight;
        let ifTextExists = textCurrent.indexOf(textToHighlight) > -1;

        if (ifTextExists) { //if text exists

            return true;

        } else {

            return false;

        }

    }

如果文章中存在文本,则在文章中突出显示匹配的文本。如果没有,则通过函数cutContent()运行它,该函数从HTML字符串中切掉结束标记:

    function cutContent(selectedHTML) {

        var str = selectedHTML;

        var tag = str.lastIndexOf("</");
        var splitContent = str.substring(0, tag);

        var check = checkIfTextExists(splitContent);

        if (check === true) {

            return splitContent;

        } else {

            cutContent(splitContent);

        }

    }

如果剪切的文本通过checkIfTextExists()函数并返回true,则插入突出显示。但是,如果返回false,我将再次调用cutContent(),这将再次运行该函数。问题是,当我设置变量var highlightHTML = cutContent(selectedHTML)console.log(highlightHTML)时,它返回undefined而不是切割值。仅当从功能checkIfTextExists()至少调用一次功能cutContent()时,似乎才发生这种情况。

问题

为什么我的函数返回undefined而不是剪切内容?我的语法有什么用,它使我无法在变量(var exists = checkIfTextExists(selectedHTML))中调用一个函数,然后从该函数调用另一个函数,然后返回第一个函数,并返回一次出现的新值。功能运行?让我知道是否有任何问题。谢谢。

0 个答案:

没有答案