Как видим, основная проблема - в поиске нужного элемента (select).
var select = BX.findChild(BX.findPreviousSibling(BX.findParent(BX("ACTION_ASSIGNED_BY_WRAPPER"), { "tagName":"td" })), { "tagName":"select" });
vs jQuery:
$('td#ACTION_ASSIGNED_BY_WRAPPER')
У меня слабо укладывается в голове архитектура. Я уже молчу про запоминание конструкции. Я уже молчу, что любой студент знает конструкции jQuery, а приучивание его к синтаксису выше - это серпом по бюджету проекта.
Давайте для начала правила хорошего тона в студию Если привык работать с jquery, насколько обязательно привязываться к JS Битрикс? Этично или неэтично просто использовать jQuery?
Коваленко Алексей, у битриксовской библиотеки есть свои расширения, например оконная библиотека. Если она и так используется, то кажется излишним использовать рядом еще и jQuery, весь основной функционал (селекторы, манипуляции, события, AJAX) дублируется.
Мне кажется, можно было бы битриксовскую библиотеку совсем убить, написав вместо этого расширения к jQuery. Как в Twitter Bootstrap.
Коваленко Алексей написал: Этично или неэтично просто использовать jQuery?
Я сейчас КП плотно копаю. Так вот, основной стиль там - переопределение JS-логики на свою, вклинивание в обработчики JS-ные, где можно. В общем, худо-бедно, довольно сильно переколбашивать CRM получается без влезания в шаблоны даже.
И вот на фоне этого BX+JS выглядит крайне отвратительно, поэтому приходится все больше на BX переползать.
Антон Долганин, мои подозрения оправдались Я для себя так раньше решил: для КП смысл есть. И некоторые вещи очень даже полезные. для сайта (имеется в виду свой сайт)... нет, так как есть более широкий спектр других механизмов BX же мы в основном задействуем в Эрмитаже.
у битриксовской библиотеки есть свои расширения, например оконная библиотека. Если она и так используется, то кажется излишним использовать рядом еще и jQuery, весь основной функционал (селекторы, манипуляции, события, AJAX) дублируется.
Денис Мальцев, мне как то вот хватало той тонны плагинов, что выпущены и до сих пор выпускаются под jQuery Еще в 2010 я с энтузиазмом решил использовать JS от Битрикс но как то вот перегорел
Но хотелось бы мнения от тех, кто приоритет везде отдает BX (разработчики битрикс не в счет ) не только на КП
Не претендую на уникальность мнения или его 100% верность, скажу как есть. Поднимаемая Антоном проблема намного глубже как мне видится. Неудобные селекторы - лишь верхушка.
<субъективно> JS библиотека Битрикса - г..но обречена на загнивание в недрах 1С-Битрикс (возможно за исключением Б24)! </субъективно>
В отрасли уже давно стандартом де-факто стала библиотека jQuery. Ее знают все, в т.ч. верстальщики которые будут производить для Вас верстку. Плюс там очень удобные селекторы. Плюс для нее куча плагинов (недетская такая кучка надо сказать). Плюс ядро (а это уже с поддержкой ajax) весит около 100 кб. Есть конечно перфекционисты (native JS / sizzle), но это одиночки.
В противовес этому мы видим библиотеку BX - о которой верстальщики и слыхом не слыхивали. Для которой нет такого количества плагинов и тд. Весит эта радость в полтора раза больше jQuery без модуля ajax. Может кто-то аругментированно обосновать почему стоит использовать именно ее?
Несмотря на такое разительное отличие - Битрикс всячески продвигает свою библиотеку (на что надеятся непонятно). Верстальщики в свою очередь всегда подключают jQuery. А на готовом сайте получается что подтягиваются обе библиотеки. Кто там что говорил про то что мы хотим быстрые сайты? На мобильниках через 3G этот компот будет выкачиваться и интерпретироваться дольше чем время генеации многих страниц.
Дабы не быть голословным возьмем главную страницу "некоторого сайта" (при сбросе кеша статики):
Лично я когда переодеваю шаблоны когда это позволяет время с ненавистью выпиливаю все следы BX. А вы - как знаете.
Шкарупа Алексей написал: Весит эта радость в полтора раза больше jQuery без модуля ajax
Это просто не минимизировано. Я не понимаю почему это не сделали стандартно.
По вашему комменту в целом - так то я согласен, но мы не сможем уже остановить этот BX. Чат IM полностью на ней хотя бы. Проще подправить этот паровоз, чем пытаться его остановить. Что я и сделал сабжем - попросил исправить реально глупое место. С комунити по нитке - доведем до ума.
На самом деле, исходный битриксов селектор корректен и не "схлопывается". Он ищет элемент с тегом select в предыдущей ячейке по отношению к ячейке, в которой находится элемент с id='ACTION_ASSIGNED_BY_WRAPPER'. Поэтому на jQuery это будет выглядеть не так просто, как указано у Вас, а как-то так:
Что, конечно, приятнее чем на Битриксе, но отличается уже не так разительно. Прикольно, что многие (вначале и я) посмотрели на ваш код jQuery, мысленно перевели его в Битрикс, сравнили и подумали, что исходный не корректен. Это все ваш авторитет, Антон (или простота jQuery)
Если говорить по теме, то думаю, что там, где можно обойтись BX, то использовать его. А где напрягает, как в приведенном примере с $('div#main .sample'), подключать либо сразу весь jQuery или частями. Ну, а если действительно требуется жесткая оптимизация, то писать свои велосипеды:
function(tag,id,classname) {
var m = document.getElementById(id);
if (!m) return [];
if (m.tagName.toLowerCase()!=tag.toLowerCase()) return [];
return m.getElementsByClassName(classname);
}('div','main','sample')
Только, в общем случае, нужно за кроссбраузерностью следить, а это дорогого стоит.
Щукин Олег написал: $('#ACTION_ASSIGNED_BY_WRAPPER').parent('td').prev().children('select');
Олег, ID-к должен быть уникальным. Таким образом даже вот эта ваша конструкция схлопнется к моей (если ID уникален, но в ином случае это некорректный DOM).
Но я приводил цитату из рабочего кода, то есть у меня заработало это и в коде.
Исходный код (тот кусок, который в if($arResult['PERMS']['WRITE']){...}) знает только о div#ACTION_ASSIGNED_BY_WRAPPER (он сам его и вписывает). А функцию-обработчик он добавляет к select'у, у которого id вообще не установлен O_o. Похожий код используется не только в crm.deal.list, но и в crm.contact.list и crm.lead.list.
Вообще это жесть какая-то.
Лучше добавить id в нужный select (например, id='grid_actions_list_CRM_DEAL_LIST_V12'), тогда можно как $('#grid_actions_list_'.$arResult['GRID_ID']), так и просто BX('grid_actions_list_'.$arResult['GRID_ID']). Да и кнопке "Применить" тоже не мешало бы назначить id='grid_apply_...', на будущее. (Почему такие префиксы 'grid_actions_list_', 'grid_apply_'? Так в языковых файлах такие, только еще 'interface_' впереди.)
Группы на сайте создаются не только сотрудниками «1С-Битрикс», но и партнерами компании. Поэтому мнения участников групп могут не совпадать с позицией компании «1С-Битрикс».