HTML5 拖放由 javascript 创建的元素:
HTML5 drag & drop elements created by javascript:
当我尝试拖放通常由 html 创建的元素时一切正常,但是当我尝试拖放由 javascript [=25= 生成的元素时] 我这个错误:
Uncaught TypeError: Cannot read property 'parentNode' of null
我的代码:
用于拖放的 js:
var id1;
var name;
function drag(ev) {
name = document.getElementById(ev.target.id).parentNode.id;
ev.dataTransfer.setData("text", name);
id1 = document.getElementById(name).parentNode.id;
}
function drop(ev) {
var id2 = ev.target.id;
if(id1 === id2 + '1'){
ev.preventDefault();
var data = ev.dataTransfer.getData("text");
ev.target.appendChild(document.getElementById(data));
//Add info to arrays
holders["\"" + id2 + "\": ["].push("{\"place_holder\":\"" + id2 + "\", \"name\":\"" + name + "\"}", ", ");
}
}
function allowDrop(ev) {
ev.preventDefault();
}
html 示例由 javascript:
生成
<div id="screen">
<div id="menu_items" ondrop="drag(event)" ondragover="allowDrop(event)"></div>
<div id="items1" ondrop="drag(event)" ondragover="allowDrop(event)"></div></div>
<div id="options">
<div class="menu_items1">
<div id="m_div_img10" class="img0" draggable="true" ondragstart="drag(event)"> <img src="./images/example.jpg" alt="example.jpg">
<span class="tooltip"><img src="./images/tip.png"></span></div><div id="m_div_img21" class="img1" draggable="true" ondragstart="drag(event)">
<img src="./images/example.jpg" alt="example.jpg">
<span class="tooltip">
<img src="./images/tip.png">
</span>
</div>
</div>
<div class="items1"></div>
</div>
生成方式示例html:
var items = document.createElement('div');
items.id = "options";
document.getElementsByTagName('body')[0].appendChild(items);
var innerDivElem = document.createElement('div');
.
.
.
innerDivElem.id = obj[i][t].name + t;
innerDivElem.className = "img" + t;
innerDivElem.draggable='true';
innerDivElem.setAttribute('ondragstart', 'drag(event)');
inContainerDiv.appendChild(innerDivElem);
这个:
innerDivElem.setAttribute('ondragstart', 'drag(event)');
给你这个:
<div ondragstart="drag(event)"></div>
这可能会将未定义的 event
变量发送到 drag()
函数。
由于您已经在使用 JavaScript,请以 JavaScript 方式分配事件。
innerDivElement.ondragstart = function(e){
drag(e);
}
甚至更好:
innerDivElement.addEventListener( "dragstart" , function(e){
drag(e);
});
乍一看,这可能是您的问题,希望对您有所帮助:)
我通过在其中添加函数来修复它,而不是通过 ev.target.id 获取 id 我通过 this.id:
获取它
innerDivElement.addEventListener( "dragstart" , function(e){
drag(e);
});
它变成:
innerDivElem.addEventListener( "dragstart" , function drag(ev){
name = document.getElementById(this.id).id;
ev.dataTransfer.setData("text", name);
id1 = document.getElementById(name).parentNode.id;
});
当我尝试拖放通常由 html 创建的元素时一切正常,但是当我尝试拖放由 javascript [=25= 生成的元素时] 我这个错误:
Uncaught TypeError: Cannot read property 'parentNode' of null
我的代码: 用于拖放的 js:
var id1;
var name;
function drag(ev) {
name = document.getElementById(ev.target.id).parentNode.id;
ev.dataTransfer.setData("text", name);
id1 = document.getElementById(name).parentNode.id;
}
function drop(ev) {
var id2 = ev.target.id;
if(id1 === id2 + '1'){
ev.preventDefault();
var data = ev.dataTransfer.getData("text");
ev.target.appendChild(document.getElementById(data));
//Add info to arrays
holders["\"" + id2 + "\": ["].push("{\"place_holder\":\"" + id2 + "\", \"name\":\"" + name + "\"}", ", ");
}
}
function allowDrop(ev) {
ev.preventDefault();
}
html 示例由 javascript:
生成<div id="screen">
<div id="menu_items" ondrop="drag(event)" ondragover="allowDrop(event)"></div>
<div id="items1" ondrop="drag(event)" ondragover="allowDrop(event)"></div></div>
<div id="options">
<div class="menu_items1">
<div id="m_div_img10" class="img0" draggable="true" ondragstart="drag(event)"> <img src="./images/example.jpg" alt="example.jpg">
<span class="tooltip"><img src="./images/tip.png"></span></div><div id="m_div_img21" class="img1" draggable="true" ondragstart="drag(event)">
<img src="./images/example.jpg" alt="example.jpg">
<span class="tooltip">
<img src="./images/tip.png">
</span>
</div>
</div>
<div class="items1"></div>
</div>
生成方式示例html:
var items = document.createElement('div');
items.id = "options";
document.getElementsByTagName('body')[0].appendChild(items);
var innerDivElem = document.createElement('div');
.
.
.
innerDivElem.id = obj[i][t].name + t;
innerDivElem.className = "img" + t;
innerDivElem.draggable='true';
innerDivElem.setAttribute('ondragstart', 'drag(event)');
inContainerDiv.appendChild(innerDivElem);
这个:
innerDivElem.setAttribute('ondragstart', 'drag(event)');
给你这个:
<div ondragstart="drag(event)"></div>
这可能会将未定义的 event
变量发送到 drag()
函数。
由于您已经在使用 JavaScript,请以 JavaScript 方式分配事件。
innerDivElement.ondragstart = function(e){
drag(e);
}
甚至更好:
innerDivElement.addEventListener( "dragstart" , function(e){
drag(e);
});
乍一看,这可能是您的问题,希望对您有所帮助:)
我通过在其中添加函数来修复它,而不是通过 ev.target.id 获取 id 我通过 this.id:
获取它innerDivElement.addEventListener( "dragstart" , function(e){
drag(e);
});
它变成:
innerDivElem.addEventListener( "dragstart" , function drag(ev){
name = document.getElementById(this.id).id;
ev.dataTransfer.setData("text", name);
id1 = document.getElementById(name).parentNode.id;
});