我遇到的问题是我在下拉列表中有两组值。如果选择了类型“A”,我想要一个文本框,用数据库中的值填充并且只读。如果选择“B”类型,则该框为空且可编辑。
我的原始代码是用jsp / struts编写的,我通过使用
实现了这一点 onchange="javascript:submit()"
重新加载页面,但这有明显的缺点,即保存您所做的任何更改,这意味着您无法真正取消。
由于此方法,我在服务器端验证方面也存在其他问题。
有没有办法让jsp页面在更改时重新加载,这样我就可以编写javascript来根据会话中保存的值更改页面的外观。这样,只有在正确填写页面并且服务器端验证将按设计工作时才会调用保存/提交功能。
我知道这是AJAX擅长做的事情,但我尽量避免使用它。
答案 0 :(得分:3)
AJAX是我朋友唯一的另一个选项,除非在原始页面加载你加载文本框的所有其他可能的值,所以你不需要回到数据库。好吧,您可以尝试将文本框放在IFRAME中,但是您可能会遇到更多问题,而不仅仅是使用AJAX。
答案 1 :(得分:1)
如果没有AJAX,你所要求的将是困难的。另一个选项(丑陋)是将第二个列表框的所有可能值写入数据结构,如数组或字典。
然后编写一些javascript,以便在用户从第一个列表框中选择时从数据结构中获取值。为了完成这项工作并以跨浏览器的方式正确地执行此操作所需的javascript数量将比仅使用AJAX要困难得多。
答案 2 :(得分:1)
不确定为什么你会在今天的世界中试图避免使用AJAX,今天的JS库让它变得如此简单,以至于不尝试它就疯了。
我只需要替换Vincent所指出的页面。考虑到4年前数据的相对大小,我认为当时对应用程序有意义。既然应用程序已经缩放,那么该页面需要花费30秒才能反复解析数据结构(可能写得不好JS?)。
我用一个非常简单的AJAX调用将所有逻辑替换为一个servlet,它只根据传递给它的内容返回第二个下拉值的JSON响应,响应基本上是即时的。
祝你好运。
答案 3 :(得分:1)
一种方法是更改表单的操作,以便将表单提交到与“保存”网址不同的网址。这使您可以重新加载表单的某些方面并返回到表单本身,而不是提交数据。
<script>
function reload() {
document.forms[0].action="reloadFormData.jsp";
document.forms[0].submit();
}
</script>
<form action="saveData.jsp" method="post">
<select id="A" name="B" onchange="reload()"><!-- blah --></select>
<select id="B" name="B"><!-- blah B --></select>
<input type="submit">
</form>
答案 4 :(得分:1)
我知道一个适合您问题的taglib: AjaxTags。 我在我的J2EE项目中使用这个taglib,将它集成到Web应用程序中非常简单。
此taglib为您提供了几个用于在jsp文件中执行AJAX请求的标记。
以下是每个代码的说明:http://ajaxtags.sourceforge.net/usage.html
可以帮助您的标签是ajax:select标签。它允许您填充依赖于其他字段的select标记,而无需重新加载整个jsp页面。
如果你有更多关于它的信息,请问我,我会尽快回答。
答案 5 :(得分:1)
如果我理解正确,您需要下拉列表(<select>
)或文本字段(<input type="text">
),具体取决于表单中某处的选项(通常是复选框或单选按钮)? / p>
在这种情况下,您可能需要在服务器上以不同方式处理两种类型的输入,所以为什么不在表单区域中的selectbox和textfield具有不同的名称和id,并且其中一个隐藏({{ 1}})。然后在选择更改时切换可见性。在服务器上,您选择选择框或textarea输入(除非您同时禁用它们(display = none
),我认为它们都是不存在的,这取决于选择输入。
当然,如果您希望用户通常只需要文本输入,只需要几次,需要大量列表;最好使用ajax来检索列表。但是如果它是相反的(你只需要文本字段),正如我上面假设的那样,两者都以初始形式存在会更快。
如果下拉列表中只包含易于生成的数据,例如从现在到数年前的数据,它甚至可以更快(在服务器上需要更少的带宽)来使用Javascript中的for循环生成数据客户端。 / p>
答案 6 :(得分:1)
与Strindhaug所说的一致,但如果你需要动态数据:
您是否可以让后端将JS写入页面,然后JS会根据需要更改表单?后端可以传播一些变量用于描述等,然后JS可以相应地更改/更新表单。如果您对此不熟悉,那么像jQuery这样的lib会使这样的事情比滚动自己更容易,更跨浏览器(至少根据我的经验)。
除了: 如果你没有使用AJAX,因为它很难编码(因为我没有一段时间因为我的第一次体验是从头开始并且不是很漂亮),正如其他人所说的那样,像MooTools这样的库等等让它变得非常简单。此外,正确使用AJAX并不可耻。它有一个糟糕的说唱,因为人们用它做蠢事,但如果你不能简单地将预制值写入表格,或者你必须做现场观察,这是AJAX的正确使用之一。