【问题标题】:First jQuery plugin issues第一个 jQuery 插件问题
【发布时间】:2010-10-12 01:44:29
【问题描述】:

大家好,首先让我说我是 jQuery 菜鸟!我想制作一个自动填充 html 选择元素的简单插件,它在第一个元素上运行良好,但是当我再次调用它来填充第二个元素时,它什么也不附加。这是我在 ajax 选项卡中的调用,其中 #product 和 #new-category 是选择元素:

$(function(){

    $("#product").popSelect("products");

    $("#new-category").popSelect("categories");

});

HTML:

><select id="product" name="product">
>     < option value="">Select Product</option>                 
></select >     
><select id="new-category" name="new-category">
>      < option value="">Select Category< /option>                  
></select >

这是插件:

(function(jQuery){
jQuery.fn.popSelect = function(table) {

    return jQuery(this).each(function(){            

        var obj = jQuery(this); 

        if(this.nodeName.toLowerCase() == 'select'){
            jQuery.getJSON("../app/modules/ajax/json.php", { table:table },
                function(data){                 
                    var options = '';           
                    jQuery.each(data, function(i,item){                                        
                        options += '<option value="' + item.id + '">' + item.title + '</option>';                   
                    });                 
                    obj.append(options);                
                });     
        };
    });
};
})(jQuery);

奇怪的是,如果我更改第二个函数调用 $("#new-category").popSelect("categories");$("[id^='new-category']").popSelect("categories"); 然后它工作正常,我的选择器有问题吗?

感谢您的帮助!

【问题讨论】:

  • 我推荐使用 (function($){ //code })(jQuery); - 这样你每次都可以使用 $ 速记而不是 jQuery :)
  • 谢谢!正如我所说,我对此很陌生,所以非常感谢任何提示!会尽快修改!
  • 你有这个在互联网上的某个地方,所以我可以看看它吗?

标签: jquery select plugins populate


【解决方案1】:

我没有直接的答案,但看起来您基本上同时有 2 个未完成的活动 ajax 调用,这可能会导致一些奇怪?

【讨论】:

  • 嗯,这两个调用是 $().popSelect();?我将如何纠正这一点?这也可以解释为什么将选择器更改为 $("[id^='new-category']").popSelect("categories");解决问题?感谢您的意见!
  • 可能是因为解析 [id^='new-category'] 选择器与 fast-to-fetch # 形式相比需要更多周期?...您在 Firefox 和 Internet 上看到相同的行为吗?探险家?
  • 验证这个理论应该不难:创建一个队列并将 json 调用放入该队列。这应该让他们一次运行一个......
【解决方案2】:

好的,像这样吗?

(function($){
jQuery.fn.popSelect = function(table) {

    return $(this).each(function(){         

        var obj = $(this);  

        if(this.nodeName.toLowerCase() == 'select'){
            obj.queue("fx", function(){$.getJSON("../app/modules/ajax/json.php", { table:table },
                function(data){                 
                    var options = '';           
                    $.each(data, function(i,item){                                         
                        options += '<option value="' + item.id + '">' + item.title + '</option>';                   
                    });             
                    obj.append(options);                
                }); }); 
        };
    });};})(jQuery);

我没有收到任何错误,但它仍然只填充第一个选择,在 IE 中的响应相同。令人费解的是,甚至在调用之间添加了一个“等待”功能,但它什么也没做。有id标签==名称标签好吗?我刚刚注意到,将“id='new-category'”替换为“id='newwcategory'”可以让它工作!? ids中的“-”有什么问题吗?

再次感谢迄今为止的所有帮助!

【讨论】:

  • 在 id 中使用连字符应该没有问题。见stackoverflow.com/questions/70579/…
  • 但是,选项值中的连字符可能存在问题,因为它们是 CData 类型。见htmlhelp.com/reference/html40/values.html
  • 嗯,我的选项值是:item.id = integer 和 item.value = string (a-z) 所以我在那里看不到问题,甚至更改了变量名也无济于事。对不起,如果我误解了什么。
  • 发现了一个新问题,在一个选项卡中更改“new-category”的 id(它存在于三个不同的 jQuery UI 选项卡中)使其适用于该选项卡。该函数是否以某种方式附加到不在当前选项卡中的字段?
【解决方案3】:

我已经确定这是 jQuery UI 选项卡的问题,因为该插件在没有它们的情况下也能完美运行!如果先前选择的选项卡具有相同的元素,则不会填充当前选定选项卡中的元素 ID。示例:

第一个标签:

<select id="new_category" name="new_category">

     <option value="">Select Category</option>
</select>

第二个标签:

<select id="product" name="product">
      <option value="">Select Product</option>
</select>

<select id="new_category" name="new_category">
      <option value="">Select Category</option>
</select>

第三个标签:

<select id="product" name="product">
      <option value="">Select Product</option>
</select>

从 Tab 1 转到 Tab 2 - 将填充产品但不填充 新类别 并从选项卡 2 转到选项卡 3 - 将不会填充产品...

即如果在 当前选项卡,它不会被填充和(可能?)前一个选项卡 元素将是虽然我看不到这个,因为它没有加载。我有 尝试摆弄缓存但没有帮助,指定表单ID 作为它的父母应该解决这个问题,但为什么有必要, 标签不应该是独立的吗?

【讨论】:

    【解决方案4】:

    我刚刚回答了一个类似的问题,基本上是you can't have two elements with the same ID on the same page,它导致了这个确切的问题。您必须使用一个类或更改其中一个 ID。

    【讨论】:

    • 有没有办法将 3 个 ajax 选项卡分开?否则我将不得不废弃 jQuery UI 选项卡,只通过看起来不太好的链接加载...谢谢,我现在将使用类!
    • 我不这么认为,如果不更改 ID 以使其独一无二,或者使用类。您基本上是在尝试违反 HTML 规范,在这种情况下,这至少似乎是所有浏览器都认真对待的东西
    猜你喜欢
    • 2011-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多