【问题标题】:jsp tag library changes checkbox name?jsp标签库更改复选框名称?
【发布时间】:2009-12-23 09:37:11
【问题描述】:

我正在尝试使用全选复选框来选择一列复选框。

所以我给所有我想一次性检查的相同名称 ABoxesElement 以便我可以轻松地在 javascript 中检查它们。

但是,当我在 firefox 中使用 firebug 时,我可以看到复选框没有保留我给它们的名称,而是预先添加了组件名称,并在我的复选框中附加了一个自动递增的数字。

由于我不能在 getElementByName 中使用正则表达式,我该如何在多个复选框中设置相同的值。 (ID 用于其他用途).. 这是我的代码:

全选复选框

<dmf:checkbox
name="ABoxes"
onclick = 'selectAllACheckBoxes'
id="allABoxes"  
runatclient="true"/>

我要选中的复选框之一的示例

<dmf:checkbox  
name="ABoxesElement" 
id="<%=...%>" 
runatclient="true"/>

****Javascript 示例 ****

function selectAllCheckBoxes(source) {
var checked = source.checked 
var cbName = source.name + 'Element';  
var col = document.getElementsByName(cbName);

for (var i=0; i<col.length;i++) 
{
col[i].checked = checked;
col[i].disabled = !checked;                         
} 
}       

当页面呈现时,我注意到各个复选框的名称不是 ABoxesElement 而是类似 component_nameAboxesElement_2 因此脚本将无法工作,除非 getElementsByName 可以接受正则表达式.

关于如何解决这个问题的任何想法?

checkbox 的 tld 有另一个属性

  <attribute>
     <name>datafield</name>
     <required>false</required>
     <rtexprvalue>true</rtexprvalue>   </attribute>

可以用它来存储“名称”,然后通过它访问元素吗?

编辑单个复选框的 HTML 输出

<input type="hidden" value="true" id="a1ON_hidden" name="mform_content_AboxesElement_hidden_2"/>
    <input type="checkbox" onclick="setKeys(event);safeCall(selectAllCheckBoxes,this);" value="" title="Click here" id="a1ON" name="form_content_AboxesElement_2"/>

为全选复选框编辑 2 HTML 输出

<input type="hidden" name="mform_content_ABoxes_hidden_1" id="allABoxes_hidden" value="true"/>
<input type="checkbox" name="mform_content_ABoxes_1" id="marketsAll" title="Click to select" value="" onclick="setKeys(event);safeCall(selectAllCheckBoxes,this);"/>

【问题讨论】:

  • 在编写JS时,请考虑生成的HTML输出。 JS 看到的只是 HTML DOM 树。你可以巧妙地利用它。您可以使用生成的 HTML 的最小可能提取来更新您的问题(至少是“全选”复选框和带有复选框的表格)。

标签: java javascript jsp jsp-tags wdk


【解决方案1】:

这是一个开场白:

function selectAllCheckboxes(checkboxElement) {
    var allFormElements = checkboxElement.form.elements;
    for (var i = 0; i < allFormElements.length; i++) {
        var formElement = allFormElements[i];
        if (formElement.name.indexOf('mform_content_ABoxes_') == 0) { // Check if its name starts with particular string.
            formElement.checked = checkboxElement.checked;
        }
    }
}

您最终可以将'mform_content_ABoxes_' 作为另一个函数参数传入,或者如果您知道生成name 属性所使用的模式,甚至可以从checkboxElement.name 中提取它。

【讨论】:

  • 最终使用了类似的东西,但是循环遍历我的每个类别的所有复选框感觉效率低下,但我想我不能做太多,因为名称是自动命名和自动递增的..它仍然足够快,所以没关系
  • 只有超过 10,000 个字段左右(这可能会持续一秒钟)才会变得低效。
【解决方案2】:

datafield 属性用于将对象属性(例如r_object_idr_version_label 等)作为数据提供给控件,在这种情况下不会有太大帮助。

一个不太完美的解决方案可能是在您的 dmf 标签中设置runatclient="false" 并在相应组件中以不同名称引用复选框;然后,您可以在组件类中使用 java 方法而不是 javascript 来获取复选框的句柄并修改它们的值。 WDK 为复选框生成的名称属性取决于组件名称以及它们在 JSP 中的顺序,因此我不确定假设 WDK 将始终为复选框生成相同的名称是否是个好主意。然而,组件类中的处理总是比 javascript 函数慢。

【讨论】:

  • 如果我没有真正在其他地方使用它们,我可以只使用常规的 html 输入复选框而不是 dmf 吗?这样就不会改名了
  • AFAIK 你应该能够在你的 jsp 中使用纯 HTML 控件,但是如果你需要组件类中的复选框值,我不太确定如何处理它们的值.
猜你喜欢
  • 1970-01-01
  • 2013-06-07
  • 2020-05-05
  • 2012-06-05
  • 2018-06-10
  • 2013-01-28
  • 2019-05-02
  • 1970-01-01
  • 2020-08-29
相关资源
最近更新 更多