0

我正在编写一个将 jQuery 用于论坛的 GreaseMonkey 脚本。我试图强制帖子中的长词中断,以避免拉伸页面。

最初我有这样的事情:

        $('.post').html(function(i, v) {
            var edited = false;
            // Break tags, links, and line breaks into separate 
            var words = v.replace(/<span(.+)<\/script\>/gi, " ").replace(/\</ig, " ").replace(/http:[^ ]+/gi, " ").replace(/&[^;]+;/gi, " ").replace(/[\n|\r]/g, " ").split(" ");
            for (var ii = 0; ii < words.length; ii++) {
                if (words[ii].length > word_length) {
                    edited = true;
                    v = v.replace(words[ii], insert_breaks(words[ii]));
                }
            }
            if (edited) return v;
        });

该网站在每个帖子中自然有不同的元素(例如粗体标签、锚点等),所以我把它们去掉,只留下文本,然后我检查字长(前面定义),并用它损坏的部分替换这个词. 有些帖子将包含一些 JavaScript,格式为<span>...</span><script>...</script>,这就是为什么我使用你看到的第一个替换。

我遇到的问题是,当一个单词被破坏并且我返回v时,元素中包含的本机 JavaScript 被破坏,并且 GreaseMonkey 脚本在替换元素的 HTML 后停止。

我看不到如何使用 CSS word-break,因为我需要设置一个宽度——我不能为每个用户设置一个宽度,而且我不能相信页面加载时的宽度。

4

1 回答 1

0

找到了解决方案。我发现最好的方法是循环遍历元素中的每个节点,如果它是文本节点,则从那里修改文本。这是它的要点:

    function insert_breaks(mtext) {
        if (mtext.length <= word_length) {
            return mtext;
        } else {
            mresult = mtext.substr(0, word_length) + " ";
            var newsection = mtext.substr(word_length);
            return mresult + insert_breaks(newsection);
        }               
    }

    function checkTextNodes(node) {
        if (node.nodeType == 3) {
            var v = node.nodeValue;
            var edited = false;
            var words = v.split(" ");
            for (var ii = 0; ii < words.length; ii++) {
                if (words[ii].length > word_length) {
                    edited = true;
                    v = v.replace(words[ii], insert_breaks(words[ii]));
                }
            }       
            if (edited) node.nodeValue = v; 
        } else {
            for (var i = 0; i < node.childNodes.length; i++) {
                checkTextNodes(node.childNodes[i]); 
            }
        }
    }

    function word_break() { 
        $('.post').contents().each(function() {
            checkTextNodes(this);
        });         
    }
于 2013-09-29T00:21:17.740 回答