Одна вещь, которую ВСЕГДА следует помнить, это то, что на стороне клиента все html / javascript / css (с помощью jQuery в данном случае).
PrimeFaces 7.0 (и выше) имеет атрибут onRowClick
, но я не уверен, подходит ли это для этого случая. Решение, которое всегда работает (старые и новые версии), состоит из нескольких действительно простых шагов (просто запомните первое утверждение в этом ответе)
Начните с jQuery для получения события Click в строке таблицы . Для этого нам нужно проверить, где должны быть реальные клики. Использование идентификатора таблицы данных для первой части - неплохой выбор. Но что это за идентификатор? Ну, для этого также есть Q / A в Stackoverflow. Как узнать идентификатор компонента JSF, чтобы я мог использовать его в Javascript Для демонстрации PrimeFaces это на самом деле #form\\:radioDT"
Но в рамках всей этой структуры html нам нужно только нажать на определенную строки (например, не в заголовках или лайках). Таким образом, это выглядит примерно так:
$("#form\\:radioDT").on("click", "tbody.ui-datatable-data tr", function() {
console.log(this);
});
Если вы попробуете это в витрине PrimeFaces, вы увидите клики в записываемой строке (в том числе щелчки, возникающие на радио-кнопке)
Следующее шаг будет в Имитировать щелчок на элементе 'a, используя javascript / jquery
Но где щелкнуть? Ну, это можно легко найти с помощью инструментов разработчика браузера. Относительно tr
, по которому щелкнули (this
), это:
$(this).find(".ui-selection-column .ui-radiobutton-icon").click(); //javascript version (selectors can be different, many work). Alternative is using jquery .trigger('click')
Объединение этого приводит к
$("#form\\:radioDT").on("click", "tbody.ui-datatable-data tr", function() {
console.log(this);
$(this).find(".ui-selection-column .ui-radiobutton-icon").click();
});
, что, к сожалению, приводит к ошибке "слишком много рекурсии" , Это вызвано тем фактом, что щелчок на переключателе всплывает до строки, которая вызывает щелчок на переключателе, который ... вы получаете точку.
Итак, первая мысль состоит в том, чтобы предотвратить образование пузырьков кликов. К сожалению, это связано не с нашей функцией, а с щелчком по радиобуту, поэтому нам нужно адаптировать наш источник. Снова существующая Q / A в справке stackoverflow: jQuery триггерный клик дает "слишком много рекурсии"
Что вы делаете, это проверяете, был ли щелчок по строке возник как щелчок по чему-либо, кроме радиопереключатель Только тогда симулируйте щелчок. Для этого нам нужно событие и из события цель и с тем же селектором, что и для клика, мы делаем проверку:
$("#form\\:radioDT").on("click", "tbody.ui-datatable-data tr", function(event) {
if ( !$(event.target).is('.ui-selection-column .ui-radiobutton-icon')) {
console.log("Simulate click on radiobutton: ", event.target);
$(this).find(".ui-selection-column .ui-radiobutton-icon").click();
} else {
console.log("Skip: ", event.target);
}
}
);
Имейте в виду, что $("#form\\:radioDT")
основан на полном идентификаторе клиента компонент данных в витрине PrimeFaces. Замени его своим.
Как и где добавить это на свою страницу и как повторно добавить его в случае ajax обновлений также описано в Q / A в Stackoverflow.