0

我编写了这个简单的 JS 模块,它用data下拉元素替换了所有具有特定属性的元素。例如:如果我有这个:

<span class="testclass1 testclass2" data-what="itemBox"></span>

它将被一个下拉列表取代。一切正常,即从span元素的转换正在完成,以防只有一个,<span class="testclass1 testclass2" data-what="itemBox"></span>但如果我添加多个span元素,其中data-what="itemBox"只有一个elements被替换而其他元素不被替换。这是我编写的 JS 模块:

(function(){

var mould = {

    partyBox        :   $.parseHTML('<select name="mouldedParty"><option value="-1" selected disabled>Select Party</option></select>'),
    iBox            :   $.parseHTML('<select name="mouldedItem"><option value="-1" selected disabled>Select Item</option></select>'),

    itemCSS     :    {
                        'padding'    : '10px',
                        'border'     : '1px solid #ccc',
                        'background' : 'whitesmoke',
                        'color'      : '#2d2d2d',
                        'cursor'     : 'pointer'
                      },        

    partyCSS    :     {
                        'padding'    : '10px',
                        'border'     : '1px solid #ccc',
                        'background' : '#368EE0',
                        'color'      : 'white',
                        'cursor'     : 'pointer'
                      },

    init            :   function (){ },

    process         :   function (container) {
                            mould.mouldParty(container);
                            mould.mouldItems(container);                            
                        },

    mouldParty      :  function(container){
                            var pBox     = $(mould.partyBox);
                            var pBoxes   = $(container).find('[data-what=partyBox]');

                            pBox.css(mould.partyCSS);
                            mould.replaceAllWith(pBoxes, pBox);
                        },

    mouldItems      :  function(container){
                            var iBox     = $(mould.iBox);
                            var iBoxes   = $(container).find('[data-what=itemBox]');

                            iBox.css(mould.itemCSS);
                            mould.replaceAllWith(iBoxes, iBox);
                        },                          

    replaceAllWith  :   function(prevEls, newEl){
                            $(prevEls).each(function(index, elem){
                                $(elem).replaceWith(newEl);
                            });         
                        }
};

mould.process('body');

})();

谁能告诉我代码有什么问题?为什么在我编写了替换所有元素的代码时只替换了一个元素?

JSFiddle 这里:http: //jsfiddle.net/DK2pe/1/

更新:向小提琴http://jsfiddle.net/DK2pe/2/添加了评论

4

2 回答 2

2

您需要newEl为每个替换进行克隆。根据API 文档replaceWith

所选元素通过从其旧位置移动而不是通过克隆来替换目标。

因此,大致如下更改您的代码:

replaceAllWith  :   function(prevEls, newEl){
                        $(prevEls).each(function(index, elem){
                            $(elem).replaceWith(newEl.clone());
                        });         
                    }
于 2013-11-09T07:06:49.160 回答
0

尝试

$(prevEls).replaceWith(function(idx, el){
    return $(el).clone()
})
于 2013-11-09T07:09:03.017 回答