Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Переопределение методов jQuery (https://javascript.ru/forum/jquery/78855-pereopredelenie-metodov-jquery.html)

Vanguger 14.11.2019 01:52

Переопределение методов jQuery
 
Прошу помощи в реализации следующего:

Есть большой не локализованный скрипт, который переловачивать не вижу смысла, в том числе ввиду будущих обновлений. В коде существует много конструкций jQuery, типа:
$('selector').text('Website');

Есть желание переопределить метод text из jQuery, примерно по следующей логике:
function lang(txt){
  if(txt=='Website')txt='Вебсайт';
  return txt;
}

Т.е. когда в коде встречается что-то вроде $('.txt1').text('Website');
то вместо <div class="txt1">Website</div>, вставлялось переведённое <div class="txt1">Вебсайт</div>

Подскажите пожалуйста есть ли возможность такое реализовать и если да, то как, пример было бы здорово.

laimas 14.11.2019 05:36

Скрипт, это текст, а в тексте найти и заменить можно в любом редакторе, только менять нужно не грабли "Website" на грабли "Вебсайт", а на имя переменной, которая может содержать как "Website", так и "Вебсайт", так и любое иное.

Vanguger 14.11.2019 12:10

Это вроде проще, но было бы гораздо элегантнее иметь описанное
переопределение, так как при обновлении скрипта, все правки полетят. Заданный вопрос остаётся открытым.

Malleys 14.11.2019 12:21

Vanguger, так?

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<!-- скрипт, который вставляется сразу после jQuery -->
<script>
	/* словарик */
	var i18n = {
		"Website": "Уебсайт"
	};

	/* «манкипатчинг» позволяет добавить немного волшебства в jQuery */
	jQuery.prototype.text = (function (jQueryText) {
		return function text(string) {
			return jQueryText.call(this, string in i18n ? i18n[string] : string);
		}
	})(jQuery.prototype.text);
</script>

<!-- Пример -->
<script>
$(() => {
	$(".txt1").text("Website");
});
</script>
<div class="txt1"></div>

laimas 14.11.2019 13:09

Цитата:

Сообщение от Vanguger
было бы гораздо элегантнее

Охрень, то есть под каждую такую замену переопределять методы?
Даже с учетом того, что в JQ и не потребуется ничего переопределять, и есть готовое $.valHooks, для такого занятия даже слов не найти, чтобы охарактеризовать. )

Malleys 14.11.2019 14:21

Цитата:

Сообщение от laimas
Скрипт, это текст, а в тексте найти и заменить можно в любом редакторе, только менять нужно не грабли "Website" на грабли "Вебсайт"

Цитата:

Сообщение от laimas
Охрень, то есть под каждую такую замену переопределять методы?
Даже с учетом того, что в JQ и не потребуется ничего переопределять, и есть готовое $.valHooks, для такого занятия даже слов не найти, чтобы охарактеризовать. )

Так покажи как надо!

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<!-- скрипт, который вставляется сразу после jQuery -->
<script>
	/* словарик */
	var i18n = {
		"Website": "Уебсайт"
	};

	/* здесь ожидается решение от laimas */
</script>

<!-- Пример -->
<script>
$(() => {
	$(".txt1").text("Website");
});
</script>
<div class="txt1"></div>

laimas 14.11.2019 14:43

Цитата:

Сообщение от Malleys
Так покажи как надо

var myname = 'Траля-ля-ля'; -> Редактор -> найти/заменить "ХХХХ" -> myname. Если подмена определяется сервером, то и брать ее из переменных сервера.

Malleys 14.11.2019 20:16

Цитата:

Сообщение от laimas
ля-ля'

А два языка как?

laimas 15.11.2019 01:01

Цитата:

Сообщение от Malleys
А два языка как?

Чего чего, хотите сказать, что локализация осуществляется переопределением методов?

Malleys 15.11.2019 13:32

Цитата:

Сообщение от laimas
Чего чего, хотите сказать, что локализация осуществляется переопределением методов?

Локализация определённо так не осуществлятся, но вам стоит ещё раз прочитать сообщение №1. Потому что в jQuery многие мерзости принимаются адептами jQuery на «ура». Вы что не поняли? (Смотри строку №9 в коде в сообщении №4)

laimas 15.11.2019 13:37

Цитата:

Сообщение от Malleys
но вам стоит ещё раз прочитать сообщение №1

Читайте сами, а то, что подлежит изменениям, а тем более и в будущем возможно, нужно изменять не таким варварским способом.

А всякие тезисы о JQ, лозунги его и прочую хрень, которую вы несете, засуньте .... вас же никто не заставляет быть затычкой в каждой заднице, то бишь заниматься еще и мерзостью которая вам ненавистна.

Malleys 15.11.2019 13:54

Цитата:

Сообщение от laimas
бишь заниматься еще и мерзостью которая вам ненавистна.

Почему вы так решили? Покажите хоть один сайт, где многоуважаемые любители jQuery применили бы наследование для своих плагинов. Я не нашёл, (но определённо жду чтобы показали, серьёзно!) однако расширение прототипа jQuery встречается сплошь и рядом!

рони 15.11.2019 13:58

Malleys,
что такое наследование в jQuery, если можно пример?

laimas 15.11.2019 14:02

Цитата:

Сообщение от Malleys
Почему вы так решили?

Потому, что "где многоуважаемые любители jQuery" и бред о тезисах.

Здесь раздел JQ, дремучая хрень по вашей же логике, так кто вас сюда манит чтобы брызгать слюнями в темах? Плох он или хорош, исторические и философские, а можете и политические аспекты, в адрес JQ, обсуждать в разделе "за жизнь". Вот там вы можете хоть демонстрации с протестами устраивать, требовать его низвержения, а "любителей" его называть лохами, борец вы наш за чистоту.

Malleys 15.11.2019 23:19

Цитата:

Сообщение от laimas
Здесь раздел JQ

Сама по себе данная библиотека уже давным давно утратила свою актуальность — для работы с DOM сейчас есть стандартные методы того же функционала, а анимации и прочие вещи — с бо́льшей производительностью и гибкостью реализованы как в CSS так и в DOM API, а также в реактивных фреймворках и библиотеках (например, React, Vue, three.js и пр.), что предлагает гораздо больше возможностей, а также работа с shadow DOM и событиями.

Что касается знания JavaScript, без этого знания ничего не получится. Язык надо понимать и уметь использовать, в любом случае... а до языка необходимо изучить программирование, теоретические основы которого являются фундаментом, и поэтому обязательны к изучению.

И что ещё интересней — адепты jQuery считают, что их библиотека — прямо таки отдельный язык, хотя на самом деле это простой класс, набросок которого можно изобразить так...
class jQuery {
	constructor(selector) {}
	addClass(className) {}
	removeClass(className) {}
	on(types, callback) {}
	css(props) {}
	static extend(o1, o2) {}
	/* и прочие методы */
}

jQuery.fn = jQuery.prototype;

const $ = selector => new jQuery(selector);
Object.assign($, jQuery);


Так называемые плагины, которые адепты активно создают расширяя объект jQuery.fn является ни чем иным как расширением прототипа jQuery. Подмена понятия и только!
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<script>
	alert(jQuery.fn === jQuery.prototype);
</script>


Цитата:

Сообщение от laimas
Здесь раздел JQ, дремучая хрень по вашей же логике, так кто вас сюда манит чтобы брызгать слюнями в темах? Плох он или хорош, исторические и философские, а можете и политические аспекты, в адрес JQ, обсуждать в разделе "за жизнь". Вот там вы можете хоть демонстрации с протестами устраивать, требовать его низвержения, а "любителей" его называть лохами, борец вы наш за чистоту.

Дело не в том, что такая функция существует, а в том, что адепты не хотят рядом с jQuery видеть ничего другого. Попробуйте написать this.href вместо $(this).attr("href") и вас заподозрят в заговоре против jQuery и обольют грязью с ног до головы! Я однажды написал вместо $(".list li").each, потому что этот метод принимает функцию, у которой первый аргумент — индекс элемента, а мне он не нужен был... так вот я написал for(const li of $(".list li")) на что адепт мне выложил много занятного о моей личности! Удивительнейшие люди!

Цитата:

Сообщение от laimas
Потому, что "где многоуважаемые любители jQuery" и бред о тезисах.

Ну вообще-то там touchend был не нужен, поскольку в мобильном браузере меню как откроется так и закроется! Если бы эти адепты не были такими упоротыми и упрямыми, то jQuery могла бы быть замечательным высокопроизводительным фреймворком, упрощающим разработку (учитывая возможности языка и браузерные API), вместо этого мы имеем дело с тем же набором костылей и проблем, что и 10 лет назад!

Цитата:

Сообщение от laimas
Здесь раздел JQ, дремучая хрень по вашей же логике, так кто вас сюда манит чтобы брызгать слюнями в темах?

Те кто начинает изучать JavaScript должны знать правду и не поддаться влиянию адептов! Я ничего не имею против программистов, которые между прочим знают и jQuery тоже — это хорошие люди! Но я против тех, кто ничего кроме jQuery не знает и не хочет знать, и при этом считает себя центром вселенной и выдаёт неимоверное количество костылей! Но ведь они могут отступить от своих злых намерении? Да и jQuery стоит изучать новичкам только в случае необходимости подчищать гoвнo потоки удивительнейшего сознания за адептами этой библиотеки. Я не понимаю, почему в 2019 году мы говором об этом, как будто это какое-то невиданное ноу-хау?

Цитата:

Сообщение от рони
что такое наследование в jQuery, если можно пример?

Также как и любое другое наследование в JavaScript
https://javascript.ru/forum/jquery/7...tml#post503699

рони 15.11.2019 23:55

Цитата:

Сообщение от Malleys
Также как и любое другое наследование в JavaScript

пример понятен, но какие преимущества перед обычным плагином jQuery.
и до сих пор не понимаю чем плох jQuery.
причём тут React, Vue, three.js и пр. , что мешает использовать this.href, может вам спорить с теми, кто вам такое запрещает делать?

Vanguger 16.11.2019 01:20

Цитата:

Сообщение от Malleys (Сообщение 515511)
Vanguger, так?

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<!-- скрипт, который вставляется сразу после jQuery -->
<script>
	/* словарик */
	var i18n = {
		"Website": "Уебсайт"
	};

	/* «манкипатчинг» позволяет добавить немного волшебства в jQuery */
	jQuery.prototype.text = (function (jQueryText) {
		return function text(string) {
			return jQueryText.call(this, string in i18n ? i18n[string] : string);
		}
	})(jQuery.prototype.text);
</script>

<!-- Пример -->
<script>
$(() => {
	$(".txt1").text("Website");
});
</script>
<div class="txt1"></div>

Спасибо, это вполне подойдёт.

laimas 16.11.2019 05:09

Malleys, так пишут либо те кто хочет казаться умнее, чем есть на самом деле, либо действительно упоротые адепты.
Кто-то не так давно учил меня как правильно вести себя в темах по отношению к их авторам. Получается, что разводить срач в темах это норма? Хватит писать всякую хрень в темах, есть для этого раздел там можете создать тему, пишите там выкладки за и против, занимайтесь там агитацией.

А тут, в темах, выглядите упоротым адептом именно вы, а не иноверцы использующие JQ. Тоже мне, блин, инквизитор от JS.

Malleys 21.11.2019 23:35

Цитата:

Сообщение от laimas
так пишут либо те кто хочет казаться умнее, чем есть на самом деле, либо действительно упоротые адепты.

Вы много чего написали про мою личность, однако про перевод строк ничего, кроме как руками поменять значения не предложили.

Цитата:

Сообщение от laimas
Чего чего, хотите сказать, что локализация осуществляется переопределением методов?

Вот ещё пример...
<script>
	var localizedStrings = { // конечно же может быть в отдельном файле, и с параметром language
		"Website": "Уебсайт"
	};

	var Preferences = {
		localizeUI: true,
		showMissingLocalizedStrings: true
	};

	function UIString(string) {
		if(Preferences.localizeUI) {
			if(window.localizedStrings && string in window.localizedStrings) {
				string = window.localizedStrings[string];
			} else {
				if(string in UIString._missingLocalizedStrings === false) {
					console.warn("Localized string \"" + string + "\" not found.");
					UIString._missingLocalizedStrings[string] = true;
				}

				if(Preferences.showMissingLocalizedStrings) {
					string += " (not localized)";
				}
			}
		}
		return string;
	}

	UIString._missingLocalizedStrings = {};
</script>

<!-- Пример -->
<script>
// не важно, какая используется библиотека, вместо обычной строки используйте UIString("My string");
// при смене языка потребуется перезагрузка страницы (не самое гибкое решение)
// при перезагрузке страницы формируется localizedStrings на другом языке (на сервере, laimas , на сервере!)
document.addEventListener("DOMContentLoaded", function() {
	document.querySelector(".txt1").textContent = UIString("Website");
});
</script>
<div class="txt1"></div>


Цитата:

Сообщение от laimas
А тут, в темах, выглядите упоротым адептом именно вы, а не иноверцы использующие JQ. Тоже мне, блин, инквизитор от JS.

Может вам стоит разобраться в этой теме? Например, глянуть в исходный код этой библиотеки. Тогда вы узнаете, что jQuery написан на JavaScript. Если бы вы читали внимательно, то не пришли бы к такому выводу!

Цитата:

Сообщение от laimas
Кто-то не так давно учил меня как правильно вести себя в темах по отношению к их авторам. Получается, что разводить срач в темах это норма?

Так уж получается, поскольку вы задаёте вопросы, не относящиеся к теме. Человек спросил, как переопределить метод (понятное дело, что наследование было бы лучше, но те кто пишет на jQuery, обычно это не умеет, что и привело к тому, что вы начали ставить мне диагнозы на расстоянии 10000км), я показал, как сделать (и человек даже написал, что такое вполне подойдёт), а вы начали возмущаться вместо того, чтобы возмутиться и показать как надо, или просто показать как надо!


Часовой пояс GMT +3, время: 08:48.