#jquery #jsf #primefaces
#jquery #jsf #первичные лица
Вопрос:
Вот чего я пытаюсь достичь. У меня есть скрытая форма с двумя входными текстами JSF и кнопкой. Где бы я ни щелкал внутри div
контейнера, я буду пытаться вычислить x
и y
координату относительно моего контейнера. Затем используйте jQuery, чтобы присвоить значению x
и y
значение двух входных данных JSF и отправить форму. Управляемый компонент за страницей JSF попытается перехватить значение отправки x и y.
Ниже приведены мои коды. Пожалуйста, дайте мне знать, что я сделал не так, потому что метод createNewInput
внутри управляемого компонента myBean
был вызван некорректно.
EDIT2
<h:outputScript library="primefaces" name="jquery/jquery.js" target="head"/>
<div id="result">Click an Element</div>
<div id="pdfCol">
<h:form>
<h:outputText value="#{note.test}"/>
<p:commandButton actionListener="#{myBean.createNewInput}" value="Submit"/>
<!-- This button is to see when I click, whether the method inside managed bean get invoked. And it did. By looking at the log files.-->
</h:form>
</div>
<div id="noteCol">
<h:form style="display:none;" prependId="false">
<h:inputText id="coordX" value="#{myBean.newInputXCoordinate}"/>
<h:inputText id="coordY" value="#{myBean.newInputYCoordinate}"/>
<p:commandButton id="button" actionListener="#{myBean.createNewInput}" value="Submit"/>
</h:form>
</div>
<script>
jQuery("#noteCol").click(function(e){
var offset = jQuery(this).offset();
e.stopPropagation();
jQuery("#result").text(this.id "Offset: (" offset.left ", " offset.top "), "
"Relative Coordinate: (" (e.pageX - offset.left) ", " (e.pageY - offset.top) ")");
jQuery("#coordX").val(e.pageX - offset.left);
jQuery("#coordY").val(e.pageY - offset.top);
jQuery("#button").click();
});
</script>
На стороне сервера я распечатываю пару координат при вызове метода createNewInput()
в управляемом компоненте myBean
. И, к счастью, я вижу правильный результат двух координат. Тем не менее, он продолжает печатать эту пару координат снова и снова, но значения пары координат являются NaN
после корректной печати в первый раз.Однако я могу это исправить?
Комментарии:
1. У вас есть
jQuery("#button").click(function(e)...
insidejQuery("#noteCol").click(function(e)...
, я не думаю, что это то, что вы хотели сделать. Написанный вами код означает: при нажатии #noteCol измените обработчик события onclick #button на новую функцию. Новая функция не будет вызвана прямо сейчас, только когда вы нажмете на кнопку #.2. @adam: как мне исправить, чтобы при нажатии на
#noteCol
,#button
также нажималось.3. Как сказал БалусК,
jQuery("#button").click();
должно сработать. Не забудьте также удалитьjQuery("#button").click(function(e)...
. Также не продолжайте менять пример,p:commandButton
иh:commandButton
это не одно и то же. В случае простогоh:commandButton
вы должны использоватьjQuery("#button").closest("form").submit();
, в случаеp:commandButton
использованияjQuery("#button").click();
.4. @adam: Спасибо. Теперь это имеет для меня гораздо больше смысла. У меня все еще есть к вам другой вопрос. Итак, я использую
p:commandButton
withjQuery("#button").click()
и на стороне сервера распечатываю две координаты. Это работает, но после успешной печати первой пары координат он продолжает распечатывать эти координаты снова и снова, но значение этих координат равноNaN
. Есть идеи, почему и как это исправить, Адам?
Ответ №1:
Я не уверен, почему ты получаешь NaN
. Где вы это видите? Кроме того, для меня имеет больше смысла, если вы будете вычислять e.pageX - offset.left
, а не наоборот. Кроме того, установка значения входного элемента в jQuery должна выполняться с помощью jQuery.val()
функции.
Кроме того, JSF добавит к сгенерированному идентификатору элемента ввода HTML идентификатор формы, который приведет к тому, что это jQuery('#coordX')
ничего не вернет. jQuery принимает идентификаторы HTML-элементов, а не идентификаторы компонентов JSF. Вы хотите добавить prependId="false"
к <h:form>
, чтобы отключить это. Но вы должны убедиться, что одни и те же входные компоненты не появляются более одного раза в выходных данных и что у вас нет других родительских UINamingContainer
компонентов во входных компонентах, которые также будут добавлять свой идентификатор, чтобы убедиться в этом, вам нужно проверить, действительно ли сгенерированный HTML <input type="text">
имеет id="coordX"
то, что вы пытаетесь выбрать с помощью jQuery.
Наконец, jQuery.submit()
работает только с элементами HTML <form>
, а не с кнопками. Для этого вы скорее захотите использовать jQuery.click()
вместо этого.
Итак, вкратце, теоретически это должно сработать для вас:
<div id="noteCol">
<h:form prependId="false" style="display:none;">
<h:inputText id="coordX" value="#{myBean.newInputXCoordinate}"/>
<h:inputText id="coordY" value="#{myBean.newInputYCoordinate}"/>
<h:commandButton id="button" actionListener="#{myBean.createNewInput}"/>
</h:form>
</div>
<script>
jQuery("#noteCol").click(function(e){
var offset = jQuery(this).offset();
e.stopPropagation();
jQuery("#result").text(this.id "Offset: (" offset.left ", " offset.top "), "
"Relative Coordinate: (" e.pageX ", " e.pageY ")");
jQuery("#coordX").val(e.pageX - offset.left);
jQuery("#coordY").val(e.pageY - offset.top);
jQuery("#button").click();
// Or:
// jQuery("#button").closest("form").submit();
});
</script>
Комментарии:
1. Причина, по которой у меня получилось
NaN
, в том, что я пытаюсь сделать что-то подобноеJquery("#result").text("..." e.pageX - offset.left "...")
, я забыл()
обойтиe.pageX - offset.left
. Однако я все еще не могу заставить метод в моем управляемом компоненте быть вызванным. Я добавляю это,jQuery("#button").submit(function(e){ alert("Button submit"); });
чтобы посмотреть, будет лиbutton
получена отправка, и я вижу, что окно предупреждения не появляется. Есть идеи почему, Балуск?2. кстати. Я проверил сгенерированный HTML-код, и там есть компоненты с идентификаторами
coordX
,coordY
иbutton
. Я немного изменил свои коды. Я повторно обновил свой первоначальный пост, чтобы отразить это.3.
submit()
Работает только на<form>
. На<input type="submit">
вы скорее хотите использоватьclick()
.4. На самом деле я тоже это пробовал. И я добавляю функцию обратного вызова, которая будет вызывать окно предупреждения при нажатии кнопки (см. Мой отредактированный код в моем исходном сообщении). Окно предупреждения так и не появилось. Я вынимаю
style="display:none"
из формы и вижу, чтоinputText
значения установлены правильно. Если я вручную нажму на кнопку, появится окно предупреждения. Так странно.5. О, это сейчас,
p:commandButton
вместоh:commandButton
? Что у тебя есть на самом деле?form.submit()
Не будет работать, если кнопка включена с поддержкой ajax. Используйтеbutton.click()
без какой-либо функции оповещения. Просто такjQuery("#button").click();
. В противном случае вы в основном переопределяете функцию ajax по умолчанию PrimeFacesonclick
на кнопке.
Ответ №2:
Вот решение моей проблемы. Проблема в том, что событие щелчка всплывает. Итак, чтобы остановить это
jQuery("#noteCol").click(function(e){
var offset = jQuery(this).offset();
e.stopPropagation();
jQuery("#result").text(this.id "Offset: (" offset.left ", " offset.top "), "
"Relative Coordinate: (" (e.pageX - offset.left) ", " (e.pageY - offset.top) ")");
jQuery("#coordX").val(e.pageX - offset.left);
jQuery("#coordY").val(e.pageY - offset.top);
jQuery("#button").click();
});
jQuery("#button").click(function(e){
e.stopPropagation();
});