Tom*_*tom 5 javascript html5 internet-explorer
我已经构建了这个使用HTML5拖放和javascript的棋盘格应用程序.它适用于chrome和firefox,但不适用于IE9或IE8.我的猜测是问题在于我如何附加事件.
这是所有浏览器附加事件的地方但是IE:
function eventer(){
for (var i = 0, len = allPieces.length; i < len; i++){
allPieces[i].addEventListener('dragstart', handlePieceDragStart, false);
}
for (var i = 0, len = allSquares.length; i < len; i++){
allSquares[i].addEventListener('dragstart', handleDragStart, false);
allSquares[i].addEventListener('dragenter', handleDragEnter, false);
allSquares[i].addEventListener('dragover', allowDrop, false);
allSquares[i].addEventListener('dragleave', handleDragLeave, false);
allSquares[i].addEventListener('drop', handleDrop, false);
}
}
Run Code Online (Sandbox Code Playgroud)
......这是IE的附件:
function eventerIE(){
for (var i = 0, len = allPieces.length; i < len; i++){
allPieces[i].attachEvent('dragstart', handlePieceDragStart, false);
}
for (var i = 0, len = allSquares.length; i < len; i++){
allSquares[i].attachEvent('dragstart', handleDragStart);
allSquares[i].attachEvent('dragenter', handleDragEnter);
allSquares[i].attachEvent('dragover', allowDrop);
allSquares[i].attachEvent('dragleave', handleDragLeave);
allSquares[i].attachEvent('drop', handleDrop);
}
}
Run Code Online (Sandbox Code Playgroud)
这些是在事件上调用的函数:
function handleDragStart(e){
dragSrcEl = this;
e.dataTransfer.effectAllowed = 'copy';
e.dataTransfer.setData('text/html', this.innerHTML);
}
function handlePieceDragStart(e){
dragPiece = this;
e.dataTransfer.setData('id', dragPiece.id);
dragPieceId = dragPiece.id;
}
function handleDragEnter(e){
this.classList.add('over');
}
function allowDrop(e){
e.preventDefault();
};
function handleDragLeave(e){
this.classList.remove('over');
}
function handleDrop(e) {
if (e.stopPropagation) {
e.stopPropagation();
e.preventDefault();
}
if (dragSrcEl != this) {
dragSrcEl.innerHTML = this.innerHTML;
this.innerHTML = e.dataTransfer.getData('text/html');
pId = e.dataTransfer.getData('id');
this.taken = dragPiece.id;
sId = this.id;
}
var sqrs = document.getElementsByTagName("td");
[].forEach.call(sqrs, function (col){
col.classList.remove('over');
});
for(var i=0, len = piecesPosition.length; i < len; i++){
if (piecesPosition[i][0]==dragPiece.id){
delete piecesPosition[i];
piecesPosition.push([dragPiece.id,sId]);
piecesPosition = piecesPosition.filter(function(){return true});
}
}
dragPiece = document.getElementById(dragPieceId);
dragPiece.pstn = sId;
this.classList.remove('over');
}
Run Code Online (Sandbox Code Playgroud)
我希望代码可以很好地了解那里发生的事情,如果您对此有任何疑问,我很乐意发表评论和解释.
谢谢你
编辑:在Iv'e改变了@Chase建议的事件后,函数被调用事件,现在我在函数内部得到一个Invalid argument错误.e.dataTransfer.setData('text/html', this.innerHTML);handleDragStart
同样,这只是在IE9和IE8模式下.
Chr*_*ing 23
使用"text"代替"text/html"
e.dataTransfer.setData("text", this.innerHTML);
Run Code Online (Sandbox Code Playgroud)
请参阅此文章以获取解释
尽管Internet Explorer最初只引入了"text"和"URL"作为有效数据类型,但HTML5将其扩展为允许指定任何MIME类型.HTML5将支持值"text"和"URL"以实现向后兼容,但它们将映射到"text/plain"和"text/uri-list".
| 归档时间: |
|
| 查看次数: |
15445 次 |
| 最近记录: |