您的代码存在多个问题。
首先,你不应该使用嵌套<script>
标签。即使结束</script>
标记位于 javascript 块中的字符串内,您仍应将其拆分,使其不会按原样显示,因为它可能并且会绊倒最符合标准的浏览器。更别提那些老...
同样,您应该避免在 ID 中使用点,因为在编写 jQuery 选择器时很容易忽略它。#id.something
意思是“选择 idid
也something
应用了类的元素”。如果你不能没有它,你可以在编写你的选择器时转义它#id\\.something
,这将“选择具有 id 的元素id.something
”。
将 javascript 放在模板中也是一个坏主意,您应该重新考虑要实现的目标。几乎总是有办法解决它:
您可以将您的事件与您将仅在将来创建的元素绑定.delegate()
或绑定。.live()
您可以使用不同的选择器,而不是在脚本中对 ID 进行硬编码,例如,您可以应用一个独特的类来与上述绑定一起使用,这样它就不会干扰现有的标记。如果您需要事件处理程序中的 ID,您可以使用this.id
或轻松提取它$(this).attr('id')
。
如果您想'some value'
在您的脚本中进行自定义,您可以为您的元素添加自定义属性,例如<input id="static_something" data-custom="some value" />
并在您的函数中使用$(this).data('custom')
.
考虑到以上所有因素,我会将您的代码重写为类似于以下内容:
<script id="tmplID" type="text/x-jquery-tmpl">
<input id="static_${val}" class="templateinput" type="text" data-custom="value1" />
<input id="static2_${val}" class="templateinput" type="text" data-custom="value2" />
</script>
<script type="text/javascript">
// jQuery ready function
$(function(){
$('.templateinput').live('change', function(){
var element_id = this.id;
var element_data = $(this).data('custom');
alert('The value of input #' + element_id + ' is: ' + element_data);
});
});
</script>
如果您有一个包含所有模板项的已知容器,请.delegate()
改为使用以避免全局绑定。