【问题标题】:jQuery change event returns null when manually fired on $(document).ready();jQuery 更改事件在 $(document).ready() 上手动触发时返回 null;
【发布时间】: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


【解决方案1】:

您正在执行 AJAX 请求来填充您的下拉列表,顺便说一下,这是一个异步请求。这种情况下需要在AJAX请求的success回调中触发事件。

var $this = this;

// Bind the onchange event
$this.on("change", function (event) {
  ..
});

// Populate using AJAX
$.ajax({
  ...
  success: function (fonts) {
    // Populate the values
    fillcolors(fonts, $this);
    // Trigger the event
    $this.trigger("change");
  },
  ...
});

就是这样。

【讨论】:

  • 认为我之前尝试过,但我会再试一次,让你知道结果如何
  • 猴子叔叔真不相信这么简单=)
  • 那么我在成功回调中定义的每个命令是否同步运行?我是 jquery 的新手,所以我仍然不习惯回调的想法以及何时使用它们
  • 没有。这取决于您实际调用的函数。 AJAX 是异步的,除非您将其设置为同步,否则您不应该这样做。 setInterval 和 setTimeout 等其他函数也具有异步行为。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-27
  • 1970-01-01
  • 2015-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-21
相关资源
最近更新 更多