Я пытаюсь подключить document.createElement
для изменения значения свойства src
для каждого назначения.
Вот что я делаю:
var original = document.createElement;
document.createElement = function (tag) {
var element = original.call(document, tag);
if (tag.toLowerCase() === 'script') {
Object.defineProperty(element.__proto__, 'src', {
set: function(newValue) {
element['src'] = 'test';
}
});
}
return element;
};
Проблема сэто то, что element['src'] = 'test';
снова и снова вызывает setter
, вызывая переполнение стека.Я пробовал другой подход, где я сохраняю локальную переменную снаружи и устанавливаю ее значение newValue
и добавляю getter
к свойству src
, которое возвращает ее вместо.Проблема с этим подходом заключается в том, что если позже элемент script добавляется в dom, то добавляется тег script с атрибутом not src
, как метод append каким-то образом пытается получить свойство src
другим способом, чемдоступ к нему обычно, так что getter
не вызывается, и поэтому у меня остается пустой тег сценария.
Что я могу сделать в этой ситуации, любые мысли о том, как я могу сделать это, чтобы я мог "заменить'значение, предназначенное для использования с атрибутом src
сценариев с другим значением?
РЕДАКТИРОВАТЬ: Это крюк, который я закончил:
Object.defineProperty(HTMLScriptElement.prototype, 'src', {
set: function(newValue) {
const r = /(?:[^:]+:)?\\/\\//;
if (r.test(newValue)) {
this.setAttribute("src", 'http://localhost:8080/v1/proxy?url=' + (newValue.startsWith('http') ? encodeURIComponent(newValue) : encodeURIComponent('http:' + newValue)));
} else {
this.setAttribute("src", 'http://localhost:8080/v1/proxy?url=' + encodeURIComponent(absolute('${originalHost}', newValue)));
}
}
});
Я понял, что мне нужно покрытьвсе возможные способы изменения src
атрибутов элемента script
, включая setAttribute('src', '...')
Если бы я перехватил setAttribute
, я бы вызвал переполнение стека, поскольку я уже перехватил свойство src
setter
и использовал setAttribute
внутриЭто.Как я могу добиться перехвата setAttribute
, чтобы иметь полный контроль над значением src
, не вызывая переполнение стека?