JavaScript動態創建DOM(七)
動態創建DOM

document.write只能在頁面加載過程中才能動態創建。
可以調用document的createElement方法來創建具有指定標簽的DOM對象,然后通過調用某個元素的appendChild();方法將新創建元素添加到相應的元素下。//父元素對象.removeChild(子元素對象);刪除元素。
window.onload = function() {
var div = document.getElementById("d1");
//返回dom對象? 在內存中創建
var btn = document.createElement("input");
btn.type = "button";
btn.id = "btn1";
btn.value = "我是動態創建的";
btn.onclick = function() {
alert("i'm a super button");
var txt = document.getElementById("t");
div.removeChild(txt);
}
div.appendChild(btn);
}
asdfasdf
aasdf
注:通過js動態創建的元素,直接? 右鍵→查看源碼是看不到的,需要通過“開發人員工具”才能看到。動態創建的控件,如果沒有添加到文檔中,則不能使用get...byid獲取
innerText? innerHTML? value
value 獲取表單元素的值
幾乎所有DOM元素都有innerText、innerHTML屬性(注意大小寫),分別是元素標簽內內容的文本表示形式和HTML源代碼,這兩個屬性是可讀可寫的。//FF不支持innerText,在FF下用textContent屬性。也可以用innerHTML設置普通文本。
示例: innerText與innerHTML區別。
function showInfo() {
var aObj = document.getElementById('a1');
alert(aObj.innerHTML);
alert(aObj.innerText);
}
用innerHTML也可以替代createElement,屬于簡單、粗放型、后果自負的創建。示例:
function createlink() {
var divMain = document.getElementById("divMain");
divMain.innerHTML = "如鵬網";
}
案例:點擊按鈕動態增加網站列表,分兩列,第一列為網站的名字,第二列為帶網站超鏈接的網站名。增加三行常見網站。瀏覽器兼容性問題,見備注。動態產生的元素,查看源代碼是看不到的。通過DebugBar→Dom→文檔→HTML可以看到。
window.onload = function() {
var json = [{ "name": "cnblogs", "site": "http://www.cnblogs.com" },
{ "name": "cnbeta", "site": "http://www.cnbeta.com" },
{ "name": "qiushibaike", "site": "http://www.qiushibaike.com" }
];
var div = document.getElementById("d1");
var table = document.createElement("table");
table.border = "1";
table.width = "400px";
div.appendChild(table);
for (var i = 0; i < json.length; i++) {
var site = json[i];
var row = document.createElement("tr"); //創建行
table.appendChild(row);? //添加到table中
var td = document.createElement("td"); //創建td
td.innerHTML = "" + site.name + "";
row.appendChild(td);
td = document.createElement("td");
td.innerText = site.site;
row.appendChild(td);
}
}
練習:動態生成n個文本框
function f1() {
var num = document.getElementById("txt").value;
var div = document.getElementById("d1");
div.innerHTML = "";
for (var i = 1; i <= parseInt(num); i++) {
var t = document.createElement("input");
t.type = "text";
t.value = i;
t.id = "t" + i;
div.appendChild(t);
if (i % 3 == 0) {
var bt = document.createElement("br");
div.appendChild(bt);
}
}
}
練習:無刷新評論。
function f1() {
var name = document.getElementById("txtName").value;
var content = document.getElementById("txtContent").value;
var row = document.createElement("tr");
document.getElementById("tb").appendChild(row);
var td = document.createElement("td");
td.innerText = name;
row.appendChild(td);
td = document.createElement("td");
td.innerText = content;
row.appendChild(td);
}
貓貓: | 沙發耶! |
昵稱:
瀏覽器兼容性問題
和IE8不一樣,用insertRow、insertCell來代替或者為表格添加tbody,然后向tbody中添加tr。FF不支持innerText。
所以動態加載網站列表的程序修改為:
var tr = tableLinks.insertRow(-1);//FF必須加-1這個參數,表追加。如果不是負數,則表示在某個索引之前插入。
var td1 = tr.insertCell(-1);
td1.innerText = key;
var td2 = tr.insertCell(-1);
td2.innerHTML = "" + value + "";
或者:(不建議)
例:動態創建表格
window.onload = function () {
var json = [{ "name": "cnblogs", "site": "http://www.cnblogs.com" },
{ "name": "cnbeta", "site": "http://www.cnbeta.com" },
{ "name": "qiushibaike", "site": "http://www.qiushibaike.com" }];
var tb = document.createElement("table");
document.getElementById("d1").appendChild(tb);
tb.border = "1";
for (var i = 0; i < json.length; i++) {
var site = json[i];
var row = tb.insertRow(-1);
var td = row.insertCell(-1);
td.innerHTML = site.name;
td = row.insertCell(-1);
td.innerHTML = site.site;
}
}
innerHTML還是操作Dom節點
操作頁面的元素的時候是用innerHTML的方式還是createElement()、appendChild()與removeChild()的方式?
1.對于大量進行節點操作時,使用innerHTML的方式性能要好于頻繁的Dom操作。
先將頁面的HTML代碼寫好,然后調用一次innerHTML,而不要反復調用innerHTML.
2.對于使用innerHTML=‘’的方式來刪除節點,在某些情況下會存在內存問題。比如:div下面有很多其他元素,每個元素都綁定有事件處理程序。此時,innerHTML只是把當前元素從節點樹上移除了,但是那些事件處理程序依然占用內存。
代碼是否需要放置到onload中
如果js代碼需要操作頁面上的元素,則將該代碼放到onload里面。因為當頁面加載完畢之后頁面上才會有相關的元素
如果js代碼中沒有操作頁面元素的語句,則可以將該代碼直接寫在