【发布时间】:2013-11-25 09:40:20
【问题描述】:
我的页面上有一个包含选择元素的区域。
我正在通过 JavaScript 在该元素上添加一个 onChange 侦听器(感谢 http://jsfiddle.net/AnbmU/6/)
void afterRender() {
javaScriptSupport.addScript(
"$('groupSelecter').observe('change', function() {" +
" var width = $(this).getWidth();" +
" var selectBox = $('groupSelecter');" +
" var chosen = selectBox.selectedIndex >= 0 ? selectBox.options[selectBox.selectedIndex].innerHTML : undefined;" +
" $(this).next('.ninja-input')" +
" .toggleClassName('hidden', chosen != 'Create New Group...')" +
" .select();" +
"});",
""
);
}
当我触发区域刷新时出现问题,我的选择将 id 更改为如下内容:groupSelecter_846e54edd0b5。
有没有办法让选择的元素 id 保持不变或能够在每次区域更新时更改 javascript 和选择的 id?
编辑: 另一个我以前不知道的问题。
隐藏的输入字段会在所选元素的第二次更改中切换一次,无论其内容如何。例如,如果我最初选择了GROUP_1、GROUP_2、GROUP_3 和Create New Group... 和GROUP_1,然后更改为GROUP_2,则会出现输入框。当我将其更改为Create New Group... 时,输入再次被隐藏。同样,当我更改为GROUP_3 时,会出现输入字段。请注意,在 JSfiddle 中,这很好用。但由于某种原因,它在我的 Tapestry 项目中不起作用。
编辑2: 好的,我尝试了更多的摆弄:
Tapestry 使用id=groupSelecter_d769af562f89 生成选择元素。
它还生成了插入这个 JavaScript(在 HTML 的底部):
$$('.groupSelecter').invoke('observe', 'change', function() {
var width = $(this).getWidth();
var chosen = $(this).selectedIndex >= 0 ? $(this).options[$(this).selectedIndex].innerHTML : undefined;
$(this).next('.ninja-input')
.toggleClassName('ninja-hidden', chosen != 'Create New Group...');
});
我在 Firefox 中检查了元素,导航到标签,找到生成的代码并将其删除。之后,我打开了 firefox JS 控制台并粘贴了我刚刚剪切的完全相同的代码。而且,瞧,它工作,出于某种原因。 (即类选择)。
【问题讨论】:
-
显然,PrototypeJS 1.6.1.0 没有方法
Element.toggleClassName(element, className[, bool]),而只有Element.toggleClassName(element, className),这导致了我在EDIT2 中的错误。
标签: java javascript prototypejs tapestry zone