2

我为两个jQuery写了一个插件,首先接收数据并添加

1.

$(function () {

    $.fn.mlData = function(params,callback) {

        $.getJSON(params.url, function(result) {
            callback(result,add);
        });

        function add (dataValue,dataText,dataName) {
            $(mlThis).append('<option dataName="'+dataName+'" value="'+dataValue+'">'+dataText+'</option>');
        }
    }

});

并使用它

$('#select').mlData({
    url:'ajax.php',
},function (result,add) {
    $.each(result.regions,function(k,v) {
        add(v.id,v.region,'region');
        if(v.cities.length > 0) {
            $.each(v.cities, function(i,c) {
                add(c.id,c.name,'city');
            });
        }
    });
}); 

它可以工作,但是 2 个插件可以处理相同的元素,但使用新数据

插件 2

$.fn.mlSelector = function(params) { 
    $('option',this).each(function() {  
        alert($(this).text());  
    }); 
};

而且不行,调用第二个插件,但是他没有看到新的

$('#ss').mlData({
    url:'ajax.php',
},function (result,add) {
    $.each(result.regions,function(k,v) {
        add(v.id,v.region,'region');
        if(v.cities.length > 0) {
            $.each(v.cities, function(i,c) {
                add(c.id,c.name,'city');
            });
        }
    });
}); 

$('#ss').mlSelect(); // NOT WORK :(
4

2 回答 2

0

正如我在评论中提到的,$.getJSON是一个异步函数。数据不会在你调用后立即可用,而是在你处理完服务器在success回调中返回的响应之后。

换句话说:

$('#ss').mlData({
  url:'ajax.php',
}, function(result,add) {
  ...
  /* At his point the data should be available */
  /* You can call it onwards */
  $('#ss').mlSelect();
}); 

这就是为什么您看不到新数据的原因。

于 2012-12-22T10:51:43.947 回答
0

您必须在第一个回调中使用第二个插件。

$('#ss').mlData({
    url:'ajax.php',
},function (result,add) {
    $.each(result.regions,function(k,v) {
        add(v.id,v.region,'region');
        if(v.cities.length > 0) {
            $.each(v.cities, function(i,c) {
                add(c.id,c.name,'city');
            });
        }
    });

    $('#ss').mlSelect();
}); 
于 2012-12-22T10:42:28.580 回答