2016-01-06 80 views
0

我有一個DragAndDrop類型事件發生兩個函數。當jqGrid的被初始化:爲什麼這個字符串被轉換爲JQuery?

function gridInitialized() { 
    var grid = $(this); 
    var gridId = grid[0].id; 
    var droppableArea = []; 
    //Code to populate droppableArea successfully 

    for(var i = 0, len = $(droppableArea).length; i < len; i++) { 
     //THIS IS THE LINE IN QUESTION 
     $(droppableArea)[i].attr("ondrop", "return handleDropHtml5(event, " + gridId + ")"); 
     //END OF LINE IN QUESTION 
    } 
} 

,然後函數來處理降:

function handleDropHtml5(event, gridId) { 
    //Code to handle the drop 
} 

我注意到,我沒有把引號gridId當我宣佈屬性"ondrop"但思想它可能工作,因爲整個部分是一個字符串,gridId也是一個字符串。但是,當它到達handleDropHtml5時,gridId將作爲與gridId同名的JQuery表來發布。我不需要正確傳遞gridId的解決方案,我已經有了。我很好奇爲什麼這種轉換正在發生。什麼導致JQuery表出現?

+4

你爲什麼要使用ATTR分配事件處理程序?這是不好的做法。使用'.on()' – epascarello

+0

@epascarello'attr'被別人的代碼遺留下來,我只需要添加網格就可以改變我們現在做事情的方式,而且不想改變太多。 –

+2

[Most?]瀏覽器將爲每個元素的ID自動創建一個全局變量!這就是這裏發生的事情。 –

回答

3

你的代碼被渲染爲

<foo ondrop="return handleDropHtml5(event, theId)"> 

所以theId被用來作爲一個全局變量,而不是一個字符串。某些瀏覽器會看到該id匹配並返回與該id匹配的DOM元素。

您需要引用該字符串,以便將其視爲字符串而不是id。

$(droppableArea)[i].attr("ondrop", "return handleDropHtml5(event, '" + gridId + "')"); 

但是你不應該使用attr來設置事件處理程序。你應該用正確的方式來附加事件如jQuery的on()

$(droppableArea).on("drop", function (event) { return handleDropHtml5(event, gridId); }); 
相關問題