【发布时间】:2012-04-08 10:53:54
【问题描述】:
我目前正在编写一个 JQuery 插件,它将颜色从 JSON Web 服务加载到下拉列表中。
下拉列表背景颜色根据所选值而变化。在大多数情况下,它正在工作。在任何常规更改上,它都按预期工作,我遇到的问题是在初始页面加载时我正在使用triggerHandler("change"); 并且它会触发,但我似乎从页面加载的下拉列表中的选定值上得到一个未定义的错误所以它不会触发下拉列表上的颜色变化
我的代码是:
$.fn.bindColorsList = function (options) {
var defColor = options.defaultColor;
var svcUrl = options.svcurl;
//var f_target = options.filterTarget;
var $this = this;
$.ajax({
url: options.svcurl,
dataType: 'json',
/*data: { filter: src_filt },*/
success: function (fonts) { fillcolors(fonts, $this) },
error: function () { appendError(f_target, "colors failed to load from server") }
});
this.on("change", function (event) {
log($(event.target).attr("id") + " change detected");
//change ddl dropdown color to reflect selected item ;
var hcolor = $this.find('option:selected').attr("name");
$this.attr("style", "background-color:" + hcolor);
});
function fillcolors(colors, target) {
$(target).empty();
$.each(colors, function (i, color) {
$(target).append("<option name='"+color.HexValue+"' value='" + color.Name + "' style='background-color:"+color.HexValue+"'>"+color.Name+"</option>");
});
};
//in a seperate file
$(document).ready(function () {
$("#dd-font-color").bindColorsList({ svcurl: "/home/colors"});
$("#dd-back-color").bindColorsList({ svcurl: "/home/colors" });
});
【问题讨论】:
-
你能创建一个你的问题的演示吗?
-
使用
$this而不是this,因为它们都指向同一个东西,无需混淆,可能会在选择过程中造成不一致。 -
chris-mcgrath.org 有我当前的代码
-
这只是一个猜测:由于
option元素不应该具有name属性并且表单元素有时会被特殊对待,您是否尝试将属性重命名为例如data-name? HTML5; 的data-*属性可以安全使用,您还可以使用$ele.data('name')访问这些值。 -
将其更新为使用 data-name 属性并将其更改为使用 $ele.data("name") 仍然给出相同的响应可能是它使用回调太早了吗?我应该使用另一个事件来延迟 triggerHandler() 吗?
标签: javascript jquery jquery-plugins jquery-events