@jesudode

Как изменить метод класса в неизменяемом js коде?

Есть код на сайте. Скрипт подгружается с облака, его изменить возможности нет. Есть html. Его изменить возможности тоже нет. FTP тоже недоступен. Есть одно условие: есть возможность добавить код только после/перед <head> и <body>. В этом скрипте есть класс form и метод submitForm. Как мне переопределить метод submitForm после загрузки скрипта, если у меня есть возможность добавить код только по данному условию?

Сама задача: есть форма на сайте. При нажатии на кнопку отправить срабатывает form.submitForm().

код формы:
<div class="form-wrapper common-form" data-layout="vertical" data-style="colored">
	<div class="input-wrapper js-input-wrapper">
		<input class="js-input" type="text" name="Имя" placeholder="Имя" spellcheck="false" data-sort="0">
	</div>
	<div class="input-wrapper js-input-wrapper">
		<input class="js-input" type="text" name="Мэйл" placeholder="Мэйл">
	</div>
	<div class="input-wrapper js-input-wrapper">
		<input class="js-input" type="text" name="Номер телефона" placeholder="Номер телефона">
	</div>
	<div class="button">
		<div class="caption">Отправить</div>
	</div>
</div>


Код submitForm:
submitForm: function(e) {
        this.xhr && this.xhr.abort(), this.xhr = $.ajax({
            dataType: "json",
            contentType: "application/json",
            url: "/api/connect/forms/submit",
            data: JSON.stringify(this.getFormData()),
            method: "POST",
            error: function(t) {
                e({
                    status: t.status,
                    responseJSON: t.responseJSON,
                    responseText: t.responseText
                });
            }
        }), t.analytics && t.analytics.sendEvent("Form Submit Click");
    }


Мне лишь нужно дописать на success:
document.location.href = "...";

Данный код работает только в консоли хрома после загрузки страницы
form.prototype.submitForm = function { console.log('test') }
form.prototype.submitForm() // test


UPD: проблема в том, что в подгружаемом скрипте создается экземпляр класса, который я изменить не могу. На сайте есть форма, которая при изменении метода в прототипе класса все равно работает по старому методу. Возможно ли вообще такое сделать?
  • Вопрос задан
  • 586 просмотров
Решения вопроса 1
rockon404
@rockon404
Frontend Developer
Вариант 1:
1. Cмотрите по коду какой слушатель вешается на форму.
2. Если есть доступ к хандлеру, снимаете.
3. Вешаете свой.

Вариант 2:
1. Если доступа к хандлеру нет, то подменяете элемент:
var old_element = document.getElementById("btn");
var new_element = old_element.cloneNode(true);
old_element.parentNode.replaceChild(new_element, old_element);
2. Вешаете свой слушатель.

По хорошему, конечно найти доступы, которых у вас почему-то нет и все переписать.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
AngReload
@AngReload
Кратко о себе
То есть, ты можешь вставить любой код между head и body? Тогда в чём вопрос?
Если чужой скрипт грузится в head, тогда прямо так и вставляй свой код, если в body то по событию
document.addEventListener('DOMContentLoaded', () => {
  form.prototype.submitForm = function { console.log('test') }
  form.prototype.submitForm()
});
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы