Bootstrap未应用于动态创建的元素

时间:2017-12-06 21:05:30

标签: javascript html calculator live

我试图制作一个计算器,如果您愿意,可以增加输入数量 - 计算器本身可以很好地找到必要的值,但我希望也有可能搜索下拉输入,因为它们确实很长,因此我使用bootstrap-select

问题是只有默认输入才会应用引导主题,而点击必要按钮创建的输入不会应用主题。我该如何解决这个问题?

您期望什么?所有输入都是“风格化”'喜欢默认的,搜索菜单等。 你得到了什么?只有默认输入是风格化的,而通过点击按钮创建的输入不是



out

var i = 0;

function createGear() {
    i++;
    
    var container = document.getElementById("newGear");
    
    var gear = document.createElement("select");
    gear.id = "gear" + i;
    gear.setAttribute("class", "selectpicker");
    gear.setAttribute("data-live-search", "true");
    container.appendChild(gear);
    
    
    
    var none = document.createElement("option");
    none.value = "none";
    none.text = "";
    gear.add(none);
    
    
    
    
    var pistols = document.createElement("optgroup");
    pistols.label = "Pistols";
    gear.add(pistols);
    
    
    
    
    var pistol1 = document.createElement("option");
    pistol1.value = "pistol1";
    pistol1.text = "M1911";
    gear.add(pistol1);
    pistols.appendChild(pistol1);
    
    return i;
}




3 个答案:

答案 0 :(得分:1)

这是因为您动态添加到页面的select永远不会初始化为bootstrap-select组件。当页面加载时,您已经在页面上获得的那个会自动初始化,因为它具有selectpicker类。

您只需在将新选择添加到页面后添加此语句:

$(gear).selectpicker();

答案 1 :(得分:1)



var gearPrices= new Array();
gearPrices["none"]=0;
gearPrices["pistol1"]=25000;

var i = 0;

function createGear() {
    i++;
    
    var container = document.getElementById("newGear");
    container.setAttribute("class", "bootstrap-select");
    
    var gear = document.createElement("select");
    gear.id = "gear" + i;
    gear.setAttribute("class", "selectpicker");
    gear.setAttribute("data-live-search", "true");
    container.appendChild(gear);
    
    
    
    var none = document.createElement("option");
    none.value = "none";
    none.text = "";
    gear.add(none);
    
    
    
    
    var pistols = document.createElement("optgroup");
    pistols.label = "Pistols";
    gear.add(pistols);
    
    
    
    
    var pistol1 = document.createElement("option");
    pistol1.value = "pistol1";
    pistol1.text = "M1911";
    gear.add(pistol1);
    pistols.appendChild(pistol1);
    
    var amount = document.createElement("input");
    amount.id = "amount" + i;
    amount.type = "number";
    container.appendChild(amount);
  
  // The newly created element should be updated
  $(gear).selectpicker('refresh');

    return i;
}

function getGearPrice() {
    var price = 0, ix, ixLen, value, type;
    var newGear = document.getElementById('newGear');
    
    price += (gearPrices[document.getElementById('gear0').value || 'none']) *     
             (document.getElementById('amount0').value || 0);
             
    var amountInputs = document.querySelectorAll("#newGear input[type='number']");
    var selectElements = document.querySelectorAll("#newGear select");
    
    for(ix = 0, ixLen = selectElements.length; ix < ixLen; ix++){
        type = selectElements[ix].value || 'none';
        value = amountInputs[ix].value || 0;
        price += gearPrices[type] * +value;
    }
    
    return price;
}

function getTotal() {
    var gearPrice = getGearPrice();
    
    document.getElementById('gearTotal').innerHTML = "Gear: £" + gearPrice;
    
}
&#13;
<body>
    <form id="form">
        <select class="selectpicker" data-live-search="true" id="gear0">
                <option></option>
                <optgroup label="Pistols">
                    <option value="pistol1">M1911</option>
                </optgroup>
                </select>
                <input type="text" id="amount0">
        <div id="newGear">
        
        </div>
        <input type="button" onclick="createGear()" value="Create Gear Input!">
        <input type="button" onClick="getTotal()">
    </form>
    <p id="gearTotal">
    Gear Total Over Here!
    </p>
    
    <link href="//netdna.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css" rel="stylesheet">
    <link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/bootstrap-select/1.6.3/css/bootstrap-select.min.css" />
    <link href="https://fonts.googleapis.com/css?family=Ubuntu" rel="stylesheet">
    <script src="js/script.js" type="text/javascript"></script>
    

  <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>
  <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/js/bootstrap.min.js"></script>
    
  
  
  <script src="//cdnjs.cloudflare.com/ajax/libs/bootstrap-select/1.6.3/js/bootstrap-select.min.js"></script>
</body>
&#13;
&#13;
&#13;

答案 2 :(得分:0)

请检查我的解决方案是否符合您的要求。我为动态生成添加{$('#' + gear.id).selectpicker();原因,您必须手动调用bootstrap-select。我还将其包装在setTimeout中,以允许浏览器正确呈现所有内容:setTimeout(function () {$('#' + gear.id).selectpicker();}, 300)

&#13;
&#13;
var i = 0;

function createGear() {
    i++;
    
    var container = document.getElementById("newGear");
    
    var gear = document.createElement("select");
    gear.id = "gear" + i;
    gear.setAttribute("class", "selectpicker");
    gear.setAttribute("data-live-search", "true");
    container.appendChild(gear);
    setTimeout(function () {$('#' + gear.id).selectpicker();}, 300)
    
    
    
    
    var none = document.createElement("option");
    none.value = "none";
    none.text = "";
    gear.add(none);
    
    
    
    
    var pistols = document.createElement("optgroup");
    pistols.label = "Pistols";
    gear.add(pistols);
    
    
    
    
    var pistol1 = document.createElement("option");
    pistol1.value = "pistol1";
    pistol1.text = "M1911";
    gear.add(pistol1);
    pistols.appendChild(pistol1);
    
    return i;
}
&#13;
<!DOCTYPE html>
<html>
<head>
    <link href="//netdna.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css" rel="stylesheet">
    <link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/bootstrap-select/1.6.3/css/bootstrap-select.min.css" />
    <link href="https://fonts.googleapis.com/css?family=Ubuntu" rel="stylesheet">
    <script src="js/script.js" type="text/javascript"></script>
</head>

<body>
    <form id="form">
        <select class="selectpicker" data-live-search="true" id="gear0">
                <option></option>
                <optgroup label="Pistols">
                    <option value="pistol1">M1911</option>
                </optgroup>
                </select>
        <div id="newGear">
            
        </div>
        <input type="button" onclick="createGear()" value="Create Gear Input!"> 
    </form>

  <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>
  <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/js/bootstrap.min.js"></script>
  <script src="//cdnjs.cloudflare.com/ajax/libs/bootstrap-select/1.6.3/js/bootstrap-select.min.js"></script>


</body>
</html>
&#13;
&#13;
&#13;