2013-08-19 82 views
0

我需要創建一個Web應用程序,用戶在其中拖放任務名稱,然後相應的任務名稱必須出現在表格中。Javascript innerHTML在IE中不起作用

發生這種情況時,必須在發生丟棄時添加新行。

我已經使用JavaScript拖放和添加新行。

我的代碼在Chrome和Firefox中工作,但不在IE中。爲什麼?

這裏是我的代碼示例。

<script type = "text/javascript"> 

var trNumber = 1; 

function addTimeSheetRow(){ 
    var timeSheetBody = document.getElementById("timeSheetBody"); 
    var trow = document.createElement("tr"); 

    trow.innerHTML = "<th ondragstart='return false;' ondrop='return false;'></th>" + 
    "<th ondrop='drop(event)' ondragover='allowDrop(event)' value='' class='dropTexts'></th>" + 
    "<td><input name=" + getTrDayNames("Mon") + " type='text' value='' size='2'/></td>" + 
    "<td><input name=" + getTrDayNames("Tue") + " type='text' value='' size='2'/></td>" + 
    "<td><input name=" + getTrDayNames("Wed") + " type='text' value='' size='2'/></td>" + 
    "<td><input name=" + getTrDayNames("Thu") + " type='text' value='' size='2'/></td>" + 
    "<td><input name=" + getTrDayNames("Fri") + " type='text' value='' size='2'/></td>" + 
    "<td><input name=" + getTrDayNames("Sat") + " type='text' value='' size='2'/></td>" + 
    "<td><input name=" + getTrDayNames("Sun") + " type='text' value='' size='2'/></td>" + 
    "<td class='total'><input type='text' value='0' size='2' readonly='readonly'/></td>"; 

    timeSheetBody.appendChild(trow); 

    $("tbody#timeSheetBody td input:not(.intial)").each(function() { 
     $(this).keyup(function(){ 
      newSum.call(this); 
      colSum.call(this); 

     }); 
    }); 

    document.getElementsByName("trNumber")[0].value = trNumber; 
} 

function allowDrop(ev) 
{ 
    //ev.preventDefault(); 
    ev.preventDefault ? ev.preventDefault() : ev.returnValue = false; 
} 
function drag(ev) 
{ 
    ev.dataTransfer.setData("Text",ev.target.id); 
    //var projectElement = ev.target.parentNode; 
    //ev.dataTransfer.setData("Text", projectElement.getAttribute("id")); 
    //alert(projectElement.getAttribute("id")); 
} 

function drop(ev) 
{ 
    //ev.preventDefault(); 
    ev.preventDefault ? ev.preventDefault() : ev.returnValue = false; 
    var data = ev.dataTransfer.getData("Text"); 
    var taskName =document.getElementById(data).innerHTML; 
    //alert(taskName); 
    var trTaskName = "tr" + trNumber + "TaskName"; 
    ev.target.innerHTML = taskName + "<input name=" + trTaskName + " type='hidden' value='" + taskName + "' size='2' class='intial'/>"; 


    var projectName = document.getElementById(data).parentNode.getAttribute("id"); 
    //alert(projectName); 
    var projectTextBox = ev.target.parentNode.children[0]; 
    var trProjectName = "tr" + trNumber + "ProjectName"; 
    projectTextBox.innerHTML = projectName + "<input name=" + trProjectName + " type='hidden' value='" + projectName + "' size='2' class='intial'/>"; 


    trNumber = trNumber + 1; 

    addTimeSheetRow(); 
} 
+2

不工作怎麼樣? –

+1

什麼版本的IE?本地拖放僅適用於IE 9+ – kayen

+0

JS控制檯中的任何錯誤? – nnnnnn

回答

1

您可以通過定製.innerHTML(是的,它有很多工作)或以其他方式修改.innerHTML屬性/函數來解決此問題。我做了這段代碼,以確保在清除.innerHTML(IE的.innerHTML的另一個問題)時仍保留仍然引用的子元素數據,但它可以適用於解決IE表問題。

if (/(msie|trident)/i.test(navigator.userAgent)) { 
var innerhtml_get = Object.getOwnPropertyDescriptor(HTMLElement.prototype, "innerHTML").get 
var innerhtml_set = Object.getOwnPropertyDescriptor(HTMLElement.prototype, "innerHTML").set 
Object.defineProperty(HTMLElement.prototype, "innerHTML", { 
    get: function() {return innerhtml_get.call (this)}, 
    set: function(new_html) { 
    var childNodes = this.childNodes 
    for (var curlen = childNodes.length, i = curlen; i > 0; i--) { 
    this.removeChild (childNodes[0]) 
    } 
    innerhtml_set.call (this, new_html) 
    } 
}) 
} 

var mydiv = document.createElement ('div') 
mydiv.innerHTML = "test" 
document.body.appendChild (mydiv) 

document.body.innerHTML = "" 
console.log (mydiv.innerHTML) 

http://jsfiddle.net/DLLbc/9/
http://jsfiddle.net/DLLbc/12/

+0

我做了一個修改:如果你沒有在代碼運行之前加載了變異觀察器,請嘗試http://jsfiddle.net/DLLbc/12進行特定的錯誤檢測。您也可以嘗試http://stackoverflow.com/questions/20661996/fixing-ie-bugs-always-a-good-idea – Agamemnus

1

這是一個已知的bug:只有當您在IE中創建表時,纔可以設置表的innerHTML。但document.createElement和其他的dom操作應該可以正常工作。或者,您可以使用js lib來兼容。

+0

拖放工程,但IE9中沒有添加新行 – Anisha

+0

IE8 +中沒有修復這個bug嗎?可能是一個怪癖模式問題? –

+0

你能解釋一下wat是一個怪癖模式的問題嗎? – Anisha

0

正常的JS:

已知且沒有那麼難做到的解決方法是創建所有的元素,而不是創建所有內容的字符串,並將其添加。

創建的TR,創建TDS用同樣的方法,等等。

在你的情況可能沒那麼好,因爲大的結構做的,但...

生活更好的辦法:

使用jQuery/prototype/mootools或其他任何你喜歡的庫。

+0

它會變成一個單調乏味的工作..除了使用innerHTML之外,還有其他的選擇嗎? – Anisha

+0

原生...沒有。正如弗洛斯特所說,或者正如我在回答中所說...使用一個庫。我建議jQuery。讓你的生活更輕鬆。或者,如果你想要的話,你可以創建自己的函數來做到這一點,並將一串字符串(或者一個字符串,如果你想把它分解成幾部分)作爲參數。或者,也許如果你有選擇只是忽略IE 7(如果我沒記錯,這是固定在IE 8(我肯定約9,不知道約8))。 – zozo