У меня есть usercript (Tampermonkey в Chrome), который запускается либо при открытии страницы пользователем, либо может открывать страницу в отдельном окне (где затем запускается соответствующий скрипт). Когда страница открывается пользователем, все работает как положено.
Однако, когда страница открывается в другом окне, эта функция иногда не обрабатывает текст должным образом.
Код:
function processTableRows() {
var regex = new RegExp(/(.*?)(\d{7})/);
var texts = document.querySelectorAll(".table__row");
var out = [];
texts.forEach(text=> {
var fixMonth = text.innerText.replace(/(\d*)月/, function(p1) {
const monthNames = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
return monthNames[(parseInt(p1) - 1)];
}).replace(regex,
"example.com/page.html?id=$2\n$1");
out.push(fixMonth);
});
return out;
}
Пример страницы с текстом (перед сценарием):
05 6月 2019 8989898
Some text
Some more text
Когда пользователь открывает страницу , и пользовательский скрипт, и код в консоли выдают ожидаемый результат:
example.com/page.html?id=8989898
05 Jun 2019
Some text
Some more text
Однако, когда он запускается в отдельном окне, он возвращает (и скрипт TM, и консоль запускаются):
05 Jun 2019
example.com/page.html?id=8989898
Some text
Some more text
Я не могу представить себе, почему второй replace()
, кажется, функционирует по-другому в отдельном окне. Я думал, что это может быть связано с некоторыми из регулярных выражений JavaScript, например, перемещение индекса, влияющего на цепочечный вызов, но MDN указывает, что он возвращает только строку.
EDIT:
Дополнительная информация, полученная после комментариев, которые были ниже:
Когда страница запускается в новом (всплывающем) окне, она становится маленькой и оригинальный текст выглядит так:
05 6月 2019
8989898
Some text
Some more text
Однако, когда окно больше (например, когда пользователь посещает его), оно выглядит следующим образом:
05 6月 2019 8989898
Some text
Some more text