Я пытаюсь добавить <abbr>
теги к аббревиатурам, найденным на веб-сайте. Я запускаю это как расширение Chrome, но я уверен, что проблема в самом javascript и не имеет большого отношения к материалам Chrome (я буду включать источник на всякий случай).Попытка заменить HTML путем клонирования узлов, но получить странные результаты
Я должен упомянуть, что я использую много кода от this link, который был предложен по другому ответу. К сожалению, я получаю неожиданные результаты, поскольку мой конечный результат немного отличается от того, что обсуждается там.
Во-первых у меня есть массив аббревиатур (укороченных здесь, я включил все это на JSFiddle)
"ITPHR": "Inside-the-park home run:hits on which the batter successfully touched all four bases, without the contribution of a fielding error or the ball going outside the ball park.",
"pNERD": "Pitcher's NERD: expected aesthetic pleasure of watching an individual pitcher",
"RISP": "Runner In Scoring Position: a breakdown of the batter's batting average with runners in scoring position, which include runners at second and third bases.",
"SBA/ATT": "Stolen base attempts: total number of times the player has attempted to steal a base (SB+CS)",
то matchText()
функция от ранее связанного artile
var matchText = function (node, regex, callback, excludeElements) {
excludeElements || (excludeElements = ['script', 'style', 'iframe', 'canvas']);
var child = node.firstChild;
do {
switch (child.nodeType) {
case 1:
if (excludeElements.indexOf(child.tagName.toLowerCase()) > -1) {
continue;
}
matchText(child, regex, callback, excludeElements);
break;
case 3:
child.data.replace(regex, function (all) {
var args = [].slice.call(arguments),
offset = args[args.length - 2],
newTextNode = child.splitText(offset);
newTextNode.data = newTextNode.data.substr(all.length);
callback.apply(window, [child].concat(args));
child = newTextNode;
});
break;
}
} while (child = child.nextSibling);
return node;
}
и, наконец, мой код который циклически проходит через массив аббревиатур и ищет все термины один за другим (это может быть не оптимальный способ делать вещи, пожалуйста, дайте мне знать, если у вас есть идея)
var abbrList = Object.keys(acronyms);
for (var i = 0; i < abbrList.length; i++) {
var abbrev = abbrList[i];
abbrevSearch = abbrev.replace('%', '\\%').replace('+', '\\+').replace('/', '\\/');
console.log("Looking for " + abbrev);
matchText(document.body.getElementsByTagName("*"), new RegExp("\\b" + abbrevSearch + "\\b", "g"), function (node, match, offset) {
var span = document.createElement("abbr");
// span.className = "sabrabbr"; // If someone decides to style them
span.setAttribute("title", acronyms[abbrev].replace(''', '\''));
span.textContent = match;
node.parentNode.insertBefore(span, node.nextSibling);
});
}
В качестве ссылки здесь являются Chrome-специфичные файлы:
manifest.json { "Название": "Сабра" Сокращения, "вариант": "0.1", " manifest_version" : 2, "описание": "добавляет всплывающие подсказки с определением к наиболее часто используемым акронимы в бейсбол.",
"icons": {
"16" : "images/16.png",
"48" : "images/48.png",
"128" : "images/128.png"
},
"permissions": [
"activeTab"
],
"browser_action": {
"default_icon": "images/16.png",
"default_title": "SABR Acronyms"
},
"content_scripts": [
{
"matches": ["http://*/*"],
"js": ["content.js","jquery.min.js"],
"css": ["sabr.css"]
}
],
"web_accessible_resources": ["content.js", "sabr.js", "sabr.css","jquery.min.js","jquery-2.0.3.min.map"]
}
content.js
var s = document.createElement('script');
s.src = chrome.extension.getURL('sabr.js');
(document.head||document.documentElement).appendChild(s);
s.onload = function() {
s.parentNode.removeChild(s);
};
Я загрузил все на JSFiddle, так как это самый простой способ, чтобы увидеть код в действии. Я скопировал <body>...</body>
страницы, содержащей статью с несколькими используемыми акронимами. Многие из них должны быть подняты, но нет. Точные совпадения также подбираются, но не все время. Также кажется, что проблема заключается в одиночных/2-буквенных акронимах (таких как IP в таблице). Регулярное выражение довольно простое, я думал, что \b
сделает трюк.
Спасибо!