Обнаружил один не хороший и не документированный костыль в crm.js
$(document).on("click", "a", function(event) {
var $link = $(this),
href = $link.attr("href");
// hack for jqeury ui links without href attr
if (!href) {
$link.attr("href", "javascript:void(0);");
href = $link.attr("href");
}
var stop_load = $link.hasClass("js-disable-router"),
is_app_url = ( this.href.substr(0, full_app_url.length) == full_app_url ),
is_normal_url = ( !(href === "#" || href.substr(0, 11) === "javascript:") ),
use_content_router = ( that.is_enabled && !stop_load && is_app_url && is_normal_url );
if (!event.ctrlKey && !event.shiftKey && !event.metaKey && use_content_router) {
event.preventDefault();
var content_uri = this.href;
if (that.need_confirm) {
$.crm.confirm.show({
title: $.crm.locales["unsaved_dialog_title"],
text: $.crm.locales["unsaved_dialog_text"],
button: $.crm.locales["unsaved_dialog_button"],
onConfirm: function() {
$(document).trigger("unsavedChanges", false);
that.load(content_uri);
}
})
} else {
that.load(content_uri);
}
}
});
Получается, что, если не добавить к ссылке класс "js-disable-router" то ни одна ссылка не сможет открыться в новой вкладке.
Это как бы затрудняет написание новых плагинов под crm. Предлагаю либо все подобные костыли задокументировать, либо убрать эти костыли и наоборот добавить класс, который будет задействовать роутер, а все, что без этого класса, пусть работает как ему положено работать.
4 комментария
Покажите на конкретном примере, чем именно затрудняется разработка плагинов.
Тем, что я пишу плагин, делаю в нем кнопочки, которые должны открывать новые вкладки, но они открываются в области контента crm. Пока я разобрался в чем дело, пока нашел этот класс у вас в коде, потратил кучу времени. Это совершенно не очевидно было. Это мне коллеги подсказали что надо эвенты на ссылках посмотреть.
Ну ладно, я тупой, бог с ним, а вот, если я захочу внутри crm применить какой-нибудь ui для интерфейса, то этот эвент на абсолютно все ссылки crm однозначно все сломает.
просто используй относительные ссылки, тогда is_app_url будет false
Все эти рецепты касаются того момента, когда ты уже во всем разобрался. Я просто класс к ссылке добавил. Но изначально вся эта ерунда потрепала нервы. А так, я считаю, быть не должно.