подключите скрипт document.createElement для изменения src - PullRequest
0 голосов
/ 09 июня 2018

Я пытаюсь подключить 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, не вызывая переполнение стека?

1 Ответ

0 голосов
/ 09 июня 2018

Это действительно плохая практика - связываться с методами и прототипами, которые вы не создавали, но в любом случае это может быть вашим решением.

Просто замените "element['src'] = 'test';" на "element.setAttribute('src', 'test');".Таким образом, вы можете избежать использования собственности.Метод setAttribute взаимодействует с атрибутами элемента напрямую, а не через средства получения атрибутов браузера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...