Используйте jQuery для генерации простых лиц нажата кнопка, но событие щелчка вызывается снова и снова

#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)... inside jQuery("#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 with jQuery("#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 по умолчанию PrimeFaces onclick на кнопке.

Ответ №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();
});