【发布时间】:2013-12-31 20:53:38
【问题描述】:
<script>
(function( $ ) {
$.widget( "my.dropbox", {
errorText: function(text) {
$(this.element).next().html(text);
},
_create: function() {
var id = $(this.element).attr("id");
var customDropbox = $(
"<div class='form-group'>"+
"<label for='"+id+"'>"+getLabelFor(id)+"</label>"+
"<select id='"+id+"'></select>"+
"<div class='errors'></div>"+
"</div>"
);
customDropbox.attr("id", id);
$(this.element).replaceWith(customDropbox); // This removes original element from DOM
populateOptions(id);
},
});
}( jQuery ));
$(document).ready(function(){
$("#field1").dropbox(); //blank input field turns into a select with a label, populated options e.t.c..
$("#button1").on("click", function(){
$("#field1").dropbox("errorText", "This is a validation error message"); //throws an error saying dropbox is not initialized
});
});
</script>
<html>
<body>
<input id="field1" />
<button id="button1">Press me</button>
</body>
</html>
所以我想要一个带有公共方法的小部件,它将用与之关联的所有小部件数据替换原始元素。上面代码的问题是<select..>元素只是一个DOM元素,如果你在它上面调用.dropbox(..),它会说这个小部件没有初始化。有没有办法使用 .errorText() 方法使选择元素成为小部件对象?所有在线小部件示例都在原始元素周围添加了东西,但从不替换它。至于更大的图景,我正在尝试制作一个通用工具来动态配置表单。这将是 html 中的所有<input id="...">,但随后 javascript 将查询数据库,获取该字段的配置并将其转换为 dropbox、checkbox,或者,比如说,带有所有 labels 的 date picker, validation 和其他花里胡哨的东西。
【问题讨论】:
-
你说你的小部件有公共方法
.show()和.hide()。这些方法在什么对象上?我认为我们需要查看您的 jQuery 小部件代码,以更好地了解您的情况以及您的要求。 -
这个小部件很大,我想我不能在这里发布,但你说得对,这些方法是在什么对象上的?问题是,我可能无法 100% 理解小部件。现在发生的是小部件工厂将 .input() 方法添加到 $,当我在 DOM 元素上调用它时 ._create() 被调用,它会创建新的 DOM 元素并用它们替换 this.element 。但是退出后还剩下什么? DOM 被修改,最初调用 .input() 的元素被移除并替换为新的 DOM 元素。那么如何将它们变成“小部件”呢?
-
查阅您的小部件库的文档并查看编码示例可能是正确的。如果没有看到小部件库的文档/代码,我无能为力。
-
用小部件的基本代码重写了问题,请再给它一次机会:)
标签: javascript jquery html jquery-ui widget