Да, это аргумент в пользу гибкости языка, потому что можно добавлять не существующий официально функционал, имитируя любое поведение, какое тебе нужно. А в новой редакции таки ввели классы самделишные и приватные свойства честные. Но он пока еще не стандартизирован для браузеров, емнип.
В новой редакции и хешмапы ввели. В новой редакции осталась одна проблема - конкатенатор. Усё. И js станет отличным языком. А пока он для меня хоть и сильный, но ещё убогий.
Ты про что? В ES6 есть Object.assign() для объединения объектов также есть наследование классов, в ES5 есть Array.prototype.concat() для объединения массивов. Ты что конкретно имел в виду по словом "конкатенатор"?
https://jsfiddle.net/6y5cee0a/ Надо правильно готовить уметь, чтобы не было отравления. А "+" в качестве конкатенатора юзается везде. Ну..кроме php. И снова это никак не опровергает тезис, что "JS более гибкий язык, чем PHP". Никак. А ты почуть включаешь демагогию, пытаясь увести суть в сторону. Не нужно. Детальное сравнение языков - это отдельная тема. А детальное сравнение языков, которые существуют в разных экосистемах и под разными парадигмами - вообще глупость как по мне. Хоть JS и пытается лезть на сервер, но это, как по мне, жесть не нужная. Просто прими факт, что когда я говорил, что JS- более гибкий язык, я не пустословил. Свои слова я подкрепил и не раз. А остальные моменты - это уже совсем другая история. Ты привык всегда быть правым, но сейчас ты не прав. И тут нет ничего плохого.
при прочих равных лучше, когда есть конкатенатор. я говорю, что мне не нравится. Из того, что мне не нравится сегодня, завтра останется только одно - конкатенатор. Так что ура, победа, чо.
А для каких задач такой фарш хорош? Код читают гораздо чаще чем пишут, логично что предпочитают деревянный jquery и стараются не залезать глубоко в "гибкость" - как потом тестировать-то? А поддерживать?
Как так и даже не интересно что это за такая волшебная функция $? Добавлено спустя 3 минуты 50 секунд: Я изобрёл конкатератор! Код (PHP): function concat(one, two) { return new String(one) + new String(two); } concat(1, 1); // -> '11' concat(1.34, ' Здесь был Вася') // -> '1.34 Здесь был Вася' Добавлено спустя 45 секунд: Ладно я пошутил, но в каждой шутке есть доля правды.
Фарш - понятие относительное. Для человека, далекого от кодов как таковых - html является фаршем. Для дизайнера-верстальщика php является фаршем. Для phpшника код на С++ является фаршем. И тд. Для меня код, написанный на JS по законам JS фаршем не является, потому что воспринимается логично и последовательно. Просто JS это JS. Там именно что другой образ мышления. Которая, к слову, уже нафиг не нужна. И это все работает уже сейчас и активно используется уже сегодня. И работает гораздо быстрее, чем $, перебирающая все дерево рекурсивно. Хотя хз, мб в последних версиях jQuery содержимое $ упразднили и она не более чем обертка над нативной querySelectorAll.
Ну если тянуть jQuery ради одной функции то да. Она ведь возвращает объект jQuery, что позволяет строить красивые цепочки. Хотя и jQuery уже нафик не нужна, как месяц уже пишу на нативном js и не жалусь, а если что то не хватает всегда можно подтянуть маленькую библиотеку для этого хотя это уже другая история...
Есть четкий тренд делать толстый фронт-энд. Уже никто не экономит килобайты. Только склеивают файлики чтобы открывались быстрее. Знать js конечно надо, но пытаться не использовать библиотеки по-моему глупо.
artoodetoo, только что твой ник светился красным как у админа, обновил страницу и стал прежним? Косп моросит, я морошу(не спал нормаль), или что-то еще:?
зрение давно проверял? шутка. просто тестировал — новые чакры не открылись. зато тут же все кинулись спрашивать: "ааа чотакоэ?". лучше уж быть как все.
Очень. Добавлено спустя 6 минут 21 секунду: Вот оно что михалыч! Добавлено спустя 9 минут 11 секунд: artoodetoo, получается скоро будут какие то сдвиги?
Эти цепочки реализуются на раз два. Просто возвращай из функции наружу ее this. Я вот давно заметил, что из жиквери юзаю только аякс, по-сути. Тут не вопрос принципиального не использования, а, скорее, вопрос того, что кодинг на jQuery - это лютый лютый "snippet style". Просто по той причине, что jQuery это вещь в себе. А когда нужно что-то написать с какой-то логикой сложнее свистоперделки, jQuery становится уже неудобна. Да, ранее ее можно было юзать просто ради $, но сейчас и оно не надо как-то. Нативный QuerySelectorAll в разы мощнее.
я из жука юзаю по сути только селекторы и их методы, .val(), .text() и ещё что-то, что не вспомнить. Раньше юзал больше. Сейчас стал скатываться к коду "накинь класс, сними класс", который можно и без жука мутить. UI не юзаю давно уже.
да. Вообще даже накидывание класса и снятие класса тоже нативно без дублирования работает через Код (PHP): this.classList.remove('bad'); this.classList.add('good');
В общем, из JQuery только их реализация AJAX и тащит пока что. Но и то, просто потому, что влом свою запиливать, при том, что при желании это делается довольно быстро.
я на основе jQuery запилил вот чо Код (PHP): /** * @param options var defaults = { url: '', data: {}, onSuccess: false, onError: false, onFail: false, popupOnSuccess: false, popupOnError: false, messageOnSuccess: false, messageOnError: false, redirect: false, }; */ function apirequest(options) { var response = {}; var defaults = { url: '', data: {}, onSuccess: false, onError: false, onFail: function (reply) { console.log('Request to ' + settings.url + ' can not be parsed. Reply: '); console.log(reply); if (settings.popupOnError) { noticePopup({text: 'Сервер ответил ошибкой', type: 'error'}); } }, onDone: false, after: false, popupOnSuccess: false, popupOnError: false, messageOnSuccess: false, messageOnError: false, redirect: false, }; function extend(){ for(var i=1; i<arguments.length; i++) for(var key in arguments[i]) if(arguments[i].hasOwnProperty(key)) arguments[0][key] = arguments[i][key]; return arguments[0]; } var settings = extend({}, defaults, options); var request = { onFail: function (reply) { if (typeof(settings.onFail) === "function") { settings.onFail(reply); } }, onDone: function () { if (typeof(settings.onDone) === "function") { settings.onDone(); } }, onError: function () { if (typeof(settings.onError) === "function") { settings.onError(response); } if (settings.popupOnError) { this.popup(); } if (settings.messageOnError) { this.messages(); } }, onSuccess: function () { if (typeof(settings.onSuccess) === "function") { settings.onSuccess(response); } if (settings.redirect && response.checkRedirect()) { response.doRedirect(); } if (settings.reload && response.checkReload()) { response.doReload(); } if (settings.popupOnSuccess) { this.popup(); } if (settings.messageOnSuccess) { this.messages(); } }, after: function () { if (typeof(settings.after) === "function") { settings.after(response); } }, popup: function () { response.popupFirstMessage(); }, messages: function () { response.drawAllMessages(); } }; this.getToken = function () { if (typeof JohnSnow === 'undefined') { return false; } if (typeof JohnSnow.tokens === 'undefined') { return false; } if (typeof JohnSnow.tokens[settings.url] === 'undefined') { return false; } return JohnSnow.tokens[settings.url]; }; var ajaxSettings = {}; ajaxSettings.url = settings.url; ajaxSettings.type = 'POST'; ajaxSettings.data = settings.data; var token = this.getToken(); var pd = Object.prototype.toString.call(settings.data) === "[object FormData]"; if (pd) { /* form data */ ajaxSettings.dataType = 'text'; ajaxSettings.processData = false; ajaxSettings.contentType = false; ajaxSettings.data.append('token', token); } else { /* general */ ajaxSettings.data.token = token; } ajaxSettings.success = function (reply) { if (ajaxResponseParse === undefined) { return false; } response = ajaxResponseParse(reply); if (!response) { request.onFail(reply); return false; } if (response.isStatusError()) { request.onError(); } if (response.isStatusOK()) { request.onSuccess(); } request.after(); } $.ajax(ajaxSettings).done(function () { request.onDone(); }).error(function (reply) { request.onFail(reply); }); } В принципе немного доделать, и будет работать совсем без жука. Оно удобное. Код (Text): url: '', data: {}, onSuccess: false, onError: false, onFail: false, popupOnSuccess: false, popupOnError: false, messageOnSuccess: false, messageOnError: false, redirect: false, Задаёшь урл. Задаёшь данные если надо. В данных можно отсылать и файлы тоже. Дальше оно дёрнет или успех, или ошибку, или облом. Дальше если с того конца попросили показать попапчик - покажет само автоматом, если хочешь. Потом может записать куданить сообщеньку об ошибке или наоборот. Ну и редирект если попросили - сделает. Работает с двумя другими штуками, если кому интересно - выложу. Но меня часто ругают и я стесняшка-первокласница как целка ломаюсь теперь.
Выложденное выше все круто, но не увидел один важный момент - target для приема данных от ajax. Он как задается у тебя? А в остальном да, вполне себе аналог.
В onSuccess и onError передаются данные из ответа. Есть ещё дебаг в консоль, когда ты в пхп пишешь что надо завардампить, а когда приходит ответ - он вываливает в консоль. пример: Код (PHP): try { throwOnTrue(empty($_POST['member']), 'Укажите участника'); $comMember = Community::memberInfo($_POST['member']); throwOnBadArray($comMember, 'В данном сообществе не нашлось такого участника'); $member = Community::getMember($comMember['community']); throwOnFalse($member, 'Вы не являетесь участником данного сообщества'); throwOnFalse($member->right('user control'), 'У вас нет права управлять участниками данного сообщества'); //$community = Community::getInfo($comMember['community']); //throwOnBadArray($community, 'Не могу получить информацию по данному сообществу. Участник разблокирован, но не будет иметь доступ в TeamSpeak'); throwOnTrue(empty($_POST['note']), 'Введите текст заметки'); [...] $note = ' <div class="row" id="note-public"> <div class="col-lg-3"> <img class="avatar-small" src="'.PinPIE::parseString('[[$user/avatar?id=' . (int)User::$id . ']]').'"> [url="/admin/community/users/edit/' . (int)$member->id . '"]' . h(User::$data['nickname']) . '[/url] <br> <span class="text-muted">' . h(date('Y-m-d H:i:s')) . '</span> </div> <div class="col-lg-9"> <div class="form-group"> <textarea class="form-control" id="npt-note">' . h($_POST['note']) . '</textarea> </div> </div> </div>'; ajaxResponse::data('note', $note); ajaxResponse::setStatusOK(); ajaxResponse::addMessage('Заметка сохранена', 'success'); } catch (Exception $ex) { ajaxResponse::debug($ex->getMessage()); ajaxResponse::debug($ex->getTraceAsString()); ajaxResponse::debug(DB::Report(false), 'DB'); ajaxResponse::setStatusError(); ajaxResponse::addMessage($ex->getMessage(), 'error'); } echo ajaxResponse::render(); Соотв, если что-то происходит, то вываливается отчет в консоль. Эссно, если это включено в конфиге, т.е. обычные посетители этого не увидят никогда. а в браузере такой js Код (PHP): function communityNote(member) { apirequest({ url: '/api/admin/community/users/note/', popupOnError: true, popupOnSuccess: true, data: {member: member, note: $('#npt-note').val()}, onSuccess: function (reply) { $('#note-public').replaceWith(reply.getData('note')); } }); }