Javascript回调函数抛出错误“;回调不是一个函数";在firefox中 函数级联下拉列表(父类、子类、操作、回调){ var DropDownId=$(parentClass+“选项:选中”).val(); $.ajax({ url:“/site/”+操作, 数据:{DropDownId:DropDownId}, 数据类型:“json”, 类型:“POST”, 错误:函数(){ 警报(“发生错误”); }, 成功:功能(数据){ var项目=”; $。每个(数据、功能(i、项){ 项目+=“”+项目。文本+“”; }); $(childClass).html(项目); $(子类)[0]。已选择索引=0; 回调(); } }); } $(文档).ready(函数(){ //填充加载时的所有子下拉列表 var callback=函数(){ 级联下拉列表(“.ConfigGroupDDL”、“ConfigNameDDL”、“GetParameters”); }; 级联下拉列表(“.DeviceTypeDDL”、“.ConfigGroupDDL”、“GetGroups”、回调); //填充所有子下拉列表父项更改 $(“.DeviceTypeDDL”).change(函数(){ var callback=函数(){ 级联下拉列表(“.ConfigGroupDDL”、“ConfigNameDDL”、“GetParameters”); }; 级联下拉列表(“.DeviceTypeDDL”、“.ConfigGroupDDL”、“GetGroups”、回调); }); $(“.ConfigGroupDDL”).change(函数(){ 级联下拉列表(“.ConfigGroupDDL”、“ConfigNameDDL”、“GetParameters”); }); });

Javascript回调函数抛出错误“;回调不是一个函数";在firefox中 函数级联下拉列表(父类、子类、操作、回调){ var DropDownId=$(parentClass+“选项:选中”).val(); $.ajax({ url:“/site/”+操作, 数据:{DropDownId:DropDownId}, 数据类型:“json”, 类型:“POST”, 错误:函数(){ 警报(“发生错误”); }, 成功:功能(数据){ var项目=”; $。每个(数据、功能(i、项){ 项目+=“”+项目。文本+“”; }); $(childClass).html(项目); $(子类)[0]。已选择索引=0; 回调(); } }); } $(文档).ready(函数(){ //填充加载时的所有子下拉列表 var callback=函数(){ 级联下拉列表(“.ConfigGroupDDL”、“ConfigNameDDL”、“GetParameters”); }; 级联下拉列表(“.DeviceTypeDDL”、“.ConfigGroupDDL”、“GetGroups”、回调); //填充所有子下拉列表父项更改 $(“.DeviceTypeDDL”).change(函数(){ var callback=函数(){ 级联下拉列表(“.ConfigGroupDDL”、“ConfigNameDDL”、“GetParameters”); }; 级联下拉列表(“.DeviceTypeDDL”、“.ConfigGroupDDL”、“GetGroups”、回调); }); $(“.ConfigGroupDDL”).change(函数(){ 级联下拉列表(“.ConfigGroupDDL”、“ConfigNameDDL”、“GetParameters”); }); });,javascript,Javascript,这运行正常,并以正确的顺序级联下拉列表,但firefox调试器显示错误,ie抛出警报并询问Id是否需要调试 任何建议都很好,因为您并不总是将回调传递给该方法 function CascadeDropDowns(parentClass, childClass, action, callback) { var DropDownId = $(parentClass + " option:selected").val(); $.ajax({ url: "/site/" + action

这运行正常,并以正确的顺序级联下拉列表,但firefox调试器显示错误,ie抛出警报并询问Id是否需要调试


任何建议都很好,因为您并不总是将回调传递给该方法

function CascadeDropDowns(parentClass, childClass, action, callback) {
  var DropDownId = $(parentClass + " option:selected").val();

  $.ajax({
    url: "/site/" + action,
    data: { DropDownId: DropDownId },
    dataType: "json",
    type: "POST",
    error: function () {
      alert("An error occurred.");
    },
    success: function (data) {
      var items = "";
      $.each(data, function (i, item) {
        items += "<option value=\"" + item.Value + "\">" + item.Text + "</option>";
      });
      $(childClass).html(items);
      $(childClass)[0].selectedIndex = 0;
      callback();
    }
  });
}

$(document).ready(function () {
  // Populates all child drop downs on load
  var callback = function () {
    CascadeDropDowns(".ConfigGroupDDL", ".ConfigNameDDL", "GetParameters");
  };

  CascadeDropDowns(".DeviceTypeDDL", ".ConfigGroupDDL", "GetGroups", callback);

  // Populates all child drop downs parent change
  $(".DeviceTypeDDL").change(function () {
    var callback = function () {
      CascadeDropDowns(".ConfigGroupDDL", ".ConfigNameDDL", "GetParameters");
    };
    CascadeDropDowns(".DeviceTypeDDL", ".ConfigGroupDDL", "GetGroups", callback);
  });
  $(".ConfigGroupDDL").change(function () {
    CascadeDropDowns(".ConfigGroupDDL", ".ConfigNameDDL", "GetParameters");
  });
});
成功:函数(数据){
var项目=”;
$。每个(数据、功能(i、项){
项目+=“”+项目。文本+“”;
});
$(childClass).html(项目);
$(子类)[0]。已选择索引=0;
if(callback)callback();//调用前请检查。
}

这是因为您并不总是向
级联下拉列表
函数提供
回调

例如

cascade下拉列表(“.ConfigGroupDDL”,“.confignamedl”,“GetParameters”)

您应该修改函数,将
回调
参数视为可选参数:

success: function (data) {
  var items = "";
  $.each(data, function (i, item) {
    items += "<option value=\"" + item.Value + "\">" + item.Text + "</option>";
  });
  $(childClass).html(items);
  $(childClass)[0].selectedIndex = 0;
  if(callback) callback();  //check before calling it. 
}
这方面的一个常用缩写是:

if (callback) {
    callback();
}

回调未在该范围内定义
。将
var callback
更改为
window.callback
并查看它是否有效。@Jashwant与scope无关。谢谢,我应该意识到这一点!我觉得“函数参数缺失”会更好,但我知道我很挑剔:)谢谢你的速记!!
callback && callback();