Среди классических моделей «Gang of Four» довольно много специфических для языка. Другие, такие как Visitor, действительно полезны только в объектно-ориентированной настройке. Функциональный язык вместо [Visitor] имеет fold
(катаморфизм), и любой, кто пытается использовать Visitor на функциональном языке, будет рассматриваться как опасный сумасшедший. Наконец, существуют шаблоны, которые могут быть применены на любом языке, например Factory.
. Одна из причин, по которым я не являюсь большим поклонником движения шаблонов, как практикуется Гамма и др., Состоит в том, что представление о шаблоне не хватает интеллектуальной согласованности. «Любое полезное» является хорошим заявлением, но, как вы заметили, не дает большого указания относительно того, какие шаблоны могли бы по-прежнему быть полезными при изменении языка или парадигмы.
Для иллюстрации рисков, присущих классифицированию паттернов, проверьте одну из моих любимых коллекций: «Эффективные образцы практики» [k0] Smalltalk Kent Beck . Несмотря на работу «Smalltalk» в названии, многие программисты нашли эти шаблоны применимыми к таким языкам, как Java и Python.
Проблема в том, что вы слушаете отправку формы - поэтому $(this)
в вашем коде делает form
элементом <form>
. Вместо этого вы можете прослушать нажатие кнопки «Отправить»:
$("[type='submit']").on("click", function() {
var url = $(this).attr("formaction");
console.log(url);
});
Как уже указывалось, $(this).attr('action')
всегда относится к атрибуту action
самой формы, поскольку это элемент, для которого определено ваше событие.
Что вы можете сделать сами, так это проверить formaction
из document.activeElement
, что дает вам элемент, который в данный момент сфокусирован. Если он не определен, вы возвращаетесь к самому действию формы.
Демо:
$('#myForm').on('submit', function (e) {
e.preventDefault();
var url = $(document.activeElement).attr('formaction') || $(this).attr('action');
console.log(url);
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<form action="Action1" method="POST" id="myForm">
<input type="text" name="field1">
<input type="text" name="field2">
<button type="submit">Search</button>
<button type="submit" formaction="Action2">Save search defaults</button>
</form>