简体   繁体   English

阻止HTML5投递重定向Firefox

[英]Stop HTML5 drop from redirecting Firefox

I have an HTML table with draggable rows. 我有一个带有可拖动行的HTML表。 Per this answer I am 'cancelling' the dragover event. 根据这个答案,我正在“取消” dragover事件。

dest.addEventListener( 'dragover', function(evt){
  evt.dataTransfer.dropEffect = 'copy';
  if (evt.preventDefault) evt.preventDefault();
  return false;
}, false );

Per MDN I am calling preventDefault() in (I think) all the right places. 对于每个MDN,我在所有正确的位置调用preventDefault()

dest.addEventListener( 'drop', function(evt) {
  this.classList.remove('over');
  ...
  if (evt.stopPropagation) evt.stopPropagation();
  return false;
}, false );

The drag/drop works perfectly in Chrome and Safari. 拖放功能可在Chrome和Safari中完美运行。 In Firefox, the drag/drop works, and then Firefox redirects to a new URL. 在Firefox中,拖放操作有效,然后Firefox重定向到新URL。

 var src = document.querySelector('#src tbody'), dest = document.querySelector('#dest tbody'); var people = [ {name:'Gavin', age:42}, {name:'Bjørn', age:17}, {name:'Leyla', age:24} ]; people.forEach(function(person,i){ var tr = rowFor(person); src.appendChild(tr); tr.draggable = true; tr.addEventListener( 'dragstart', function(evt){ this.classList.add('drag','selected'); evt.dataTransfer.dropEffect = 'copy'; evt.dataTransfer.setData( 'text', i ); return false; }, false ); tr.addEventListener( 'dragend', function(evt){ if (evt.preventDefault) evt.preventDefault(); this.classList.remove('drag'); return false; }, false ); }); dest.addEventListener( 'dragenter', function(evt){ this.classList.add('over'); return false; }, false ); dest.addEventListener( 'dragover', function(evt){ evt.dataTransfer.dropEffect = 'copy'; this.classList.add('over'); if (evt.preventDefault) evt.preventDefault(); return false; }, false ); dest.addEventListener( 'dragleave', function(evt){ this.classList.remove('over'); return false; }, false ); dest.addEventListener( 'drop', function(evt) { this.classList.remove('over'); var index = evt.dataTransfer.getData('Text'); var dup = rowFor( people[index] ); dest.appendChild( dup ); if (evt.stopPropagation) evt.stopPropagation(); return false; }, false ); function rowFor(obj){ var tr = document.createElement('tr'); tr.innerHTML = "<td>"+obj.name+"</td><td>"+obj.age+"</td>"; return tr; } 
 body { background:#eee } #wrap { display:flex; flex-direction:row; justify-content:space-between; align-items:flex-start; flex-grow:1; height:400px; padding:1em } table { width:200px; border-collapse:collapse; border:1px solid #ccc } tbody { background:#fff } th,td { padding:0 5px } th { text-align:left; background:#ddd } caption { background:#ccc } table.over { border:2px solid yellow } tr.selected td { background:lightblue } table { display:flex; flex-flow:column; height:100%; margin-right:4px; overflow:hidden } table caption { flex:0 0 auto; width:100%; display:block } table thead { flex:0 0 auto; width:calc(100% + 1px) } table tbody { flex:1 1 auto; display:block; overflow-y:auto } table tbody tr { width:100% } table thead, table tbody tr { display:table; table-layout:fixed } tbody tr { cursor:default } thead th:last-child, tbody td:last-child { width:33%; } 
 <div id="wrap"> <table id="src"> <caption>drag from here</caption> <thead><tr><th>name</th><th>age</th></tr></thead> <tbody></tbody> </table> <table id="dest"> <caption>drag to here</caption> <thead><tr><th>name</th><th>age</th></tr></thead> <tbody></tbody> </table> </div> 

Snippet also available at jsfiddle.net/8d96vpws/3/ 摘录也可在jsfiddle.net/8d96vpws/3/

How do I stop Firefox from changing location? 如何阻止Firefox更改位置?

I think first you need when drop, stop action without checking condition. 我认为首先您需要在掉落时停止动作而不检查状况。 this happen condition not true at this point. 这种情况在这一点上还不成立。 after you can find some issues in this code. 在此代码中找到一些问题之后。

dest.addEventListener( 'drop', function(evt) {
  evt.preventDefault();
  evt.stopPropagation();
  this.classList.remove('over');
  ...
}, false );

see below 见下文

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM