Невозможно использовать JavaScript для отправки () формы шва - PullRequest
1 голос
/ 15 декабря 2010

Привет, у меня есть форма шва, которую мы используем, чтобы загрузить вложение в наш код Java.Все работало нормально, пока нам не потребовалось отобразить диалоговое окно jquery, чтобы дать пользователю некоторую визуальную информацию о том, что происходит загрузка.

Чтобы сделать это, мы перехватываем событие onsubmit через javascript, поднимаем диалоговое окно jquery, затемчерез секунду отправьте форму через document.forms[...].submit().

Все выглядит так, как будто оно работает, появляется сообщение, через секунду мы видим, что браузер передает данные на сервер, но seam не вызывает действиеформа.Страница просто обновляется, и ничего не происходит.

Если я удаляю javascript submit () и позволяю форме отправляться в обычном режиме, нажмите кнопку seam, чтобы нормально обработать действие на сервере.

Myформа шва:

<h:form onsubmit="return ClickSuperUtil.submitForm();" enctype="multipart/form-data">
    <s:validateAll>
        <h:panelGrid columns="2">
            <h:outputText rendered="false" value="#{messages['document_type']}:" />
            <h:selectOneMenu rendered="false" value="#{document.documentType}" required="true">
                <f:selectItem itemLabel="#{messages['dt_rollover']}" itemValue="ROLLOVER" />
                <f:selectItem itemLabel="#{messages['dt_sg_contribution']}" itemValue="SG_CONTRIBUTION" />
            </h:selectOneMenu>
            <h:outputText value="#{messages['document_format']}:" />

            <h:selectOneMenu value="#{document.documentFormat}" required="true">
                <s:selectItems value="#{uploadHistoryManager.contributionFormatList}" var="contributionFormat" label="#{contributionFormat}" noSelectionLabel="Please Select..."/>
            </h:selectOneMenu>
            <h:outputText value="#{messages['upload_document']}:" />
            <s:fileUpload data="#{document.uploadedDocument}"
                            fileName="#{document.documentName}" fileSize="#{document.documentSize}"
                             />
        </h:panelGrid>
    </s:validateAll>
    <h:commandButton  styleClass="menubutton" value="#{messages['upload']}" action="#{uploader.upload}">
        <f:param name="fileUploaded" value="fileUploaded" />
        <s:conversationId/>
    </h:commandButton>
</h:form>    

Моя функция javascript, которая обрабатывает событие отправки формы:

ClickSuperUtil.submitForm=function()
{
    if(this.messageDisplayed == null)
    {
        this.showPleaseWaitDialog();
        this.messageDisplayed = true
        setTimeout("document.getElementById('uploadPanel').getElementsByTagName('form')[0].submit()",1000)
        return false
    }
    this.messageDisplayed = null
    return true
}

Дальнейшие исследования показывают, что в "обычном" сообщении в заголовках имеется разговор, добавленный к рефереру.но сообщение, инициированное JavaScript, не имеет значения.

Обычные заголовки сообщения:

POST /connectweb/upload.seam HTTP/1.1
Host: localhost:8080
User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; en-US; rv:1.9.2.6)  
Gecko/20100625 Firefox/3.6.6 GTB7.1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Referer: http://localhost:8080/connectweb/upload.seam?conversationId=73
Cookie: JSESSIONID=309AA62DD4929392DD9561389F5A36BA

...

Заголовки сообщения, инициированные JavaScript *

POST /connectweb/upload.seam HTTP/1.1
Host: localhost:8080
User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; en-US; rv:1.9.2.6)  
Gecko/20100625 Firefox/3.6.6 GTB7.1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Referer: http://localhost:8080/connectweb/upload.seam
Cookie: JSESSIONID=309AA62DD4929392DD9561389F5A36BA

...

HTML-код для формы, сгенерированный с помощью шва:

<form onsubmit="return ClickSuperUtil.submitForm();" enctype="multipart/form-data" action="/connectweb/upload.seam" method="post" name="j_id14" id="j_id14">
<input type="hidden" value="j_id14" name="j_id14">
<table>
<tbody>
<tr>
<td>Document Format:</td>
<td><select size="1" name="j_id14:j_id22">  
<option value="org.jboss.seam.ui.NoSelectionConverter.noSelectionValue">Please Select...</option>
<option value="CUSCAL">CUSCAL</option>
<option value="ORACLE">ORACLE</option>
<option selected="selected" value="ROCKFAST">ROCKFAST</option>
</select></td>
</tr>
<tr>
<td>Upload Document:</td>
<td><input type="file" name="j_id14:j_id25" id="j_id14:j_id25"></td>
</tr>
</tbody>
</table>
<input type="submit" class="menubutton" value="Upload" name="j_id14:j_id26"><input type="hidden" autocomplete="off" value="H4sIAAAAAA ... /B7CYBAA==" id="javax.faces.ViewState" name="javax.faces.ViewState">
</form>

Ответы [ 2 ]

1 голос
/ 02 мая 2012

Когда я раньше сталкивался с проблемами с формами Seam, это происходит потому, что сама кнопка обрабатывается Seam.Когда вы нажимаете на кнопку (или нажимаете ввод в форме, которая действует как нажатие на кнопку), вы должны увидеть дополнительный параметр в опубликованных данных формы для кнопки. * В вашем случае это будет выглядеть так:

j_id14:j_id26:Upload

Если вы отправляете форму с использованием JavaScript, этот параметр не включается в публикацию формы.Без этого Seam не знает, какая кнопка была нажата и, следовательно, какое действие вызывать.

* Эти данные отображаются в инструментах Firebug / Developer под заголовками, которые вы опубликовали.

0 голосов
/ 16 декабря 2010

Попробуйте это:

$(document).ready(function(){
  $('#uploadForm').submit(function() {
     //Show some throbber and ensure ClickSuperUtil.submitForm() returns true
     return ClickSuperUtil.submitForm();
  });
});

<h:form id="uploadForm" preprendId="false" enctype="multipart/form-data">
...