2016-01-06 79 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); }); 
相关问题