我正在编写一个将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后停止。 / p>
我不知道如何使用CSS word-break
,因为我需要设置一个宽度 - 我无法为每个用户设置的宽度,因为我不能相信宽度页面加载。
答案 0 :(得分: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);
});
}