Javascript 除了一个特定的元素之外,阻止一切

Javascript 除了一个特定的元素之外,阻止一切,javascript,jquery,jquery-ui-sortable,droppable,Javascript,Jquery,Jquery Ui Sortable,Droppable,我有一个页面,它有一个可拖放的元素a1,还有一个可排序的特定元素a2。放入a1的文件将被读取并存放到a2中的可排序列表中。我下面的代码中不包括上载脚本和可排序脚本,因为它们与问题无关 问题是,如果将任何文件放到a1以外的任何位置,浏览器将尝试打开该文件以在浏览器中显示。这在图像文件中非常明显 我试图用下面的代码禁用所有功能,但a1,但这似乎仍然不起作用,我仍然收到不需要的重定向 我用谷歌搜索了一下我的屁股,但似乎有很多关于添加拖放的内容,但是很少有关于防止拖放的内容 有人能告诉我我用下面的代码做

我有一个页面,它有一个可拖放的元素
a1
,还有一个可排序的特定元素
a2
。放入
a1
的文件将被读取并存放到
a2
中的可排序列表中。我下面的代码中不包括上载脚本和可排序脚本,因为它们与问题无关

问题是,如果将任何文件放到
a1
以外的任何位置,浏览器将尝试打开该文件以在浏览器中显示。这在图像文件中非常明显

我试图用下面的代码禁用所有功能,但
a1
,但这似乎仍然不起作用,我仍然收到不需要的重定向

我用谷歌搜索了一下我的屁股,但似乎有很多关于添加拖放的内容,但是很少有关于防止拖放的内容

有人能告诉我我用下面的代码做错了什么吗

<div id="a1"></div>
<div id="a2"></div>
<script>
drop = $("not(#a1)");
drop.droppable("option",{disabled:true, tolerance:"pointer"});
drop.droppable("disable");
drop.on("drop",function(e){
    e.preventDefault();
}
</script>

下降=$(“非(#a1)”);
drop.droppable(“选项”,{disabled:true,容差:“指针”});
可拖放(“禁用”);
下降。下降(“下降”,功能(e){
e、 预防默认值();
}

非常感谢!

您使用了错误的jQuery选择器

试试这个

drop = $("div").not("#a1");
我创建了一个简单的方法使其工作。基本上,您可以使用文档本身的处理程序取消事件,而不必担心文件的放置位置:

$("#a1").on('drop', function() {
    // your logic here
    alert('dropped on a1!');
});

$(document).on('drop dragover', function(e) {
    e.preventDefault();
});

如果您使用的是较旧版本的jQuery,那么您可能必须将
on
函数替换为
live

,经过足够的修改,我终于想出了一个更合适的解决方案

鉴于我只关注防止文件被放入可排序区域,我决定专注于确定被删除项目的性质

drop = $(".all-slides");
drop.on('dragover', function(e){
    e.preventDefault();
});
drop.on('dragenter', function(e){
    e.preventDefault();
});
                                            drop.on('drop', function(e){
    e.preventDefault();
    dt = e.originalEvent.dataTransfer;
    if(dt.types != null && (dt.types.indexOf ? dt.types.indexOf('Files') != -1 : dt.types.contains('application/x-moz-file'))) {
        alert('You cannot upload images here. \nIf you wish to upload files, \nclick on the "Upload Images" button.');
    }
});

简单地说,drop事件侦听任何可能的数据传输,如果没有数据传输,我们知道它是一个DOM元素…否则我们知道它是一个文件,我们抛出警报…

not(#a1)
不是有效的选择器,将返回一个空集。您可能想编写
:not(#a1)
(带冒号)。此外,您可能希望只覆盖
文档上的
拖放
,并让冒泡处理它,而不是处理每个元素。是的,我确实希望“
:不是(#a1)
”,但即使应用它,似乎也会冻结填充到
a2
…中的子元素,我需要
a2
中的这些子元素是可拖动的,因此在
a2
中是可排序的…确实如此。这就是为什么我建议只阻塞
文档
,这将捕获之前未捕获的所有拖放(由
#a1
上的处理程序执行)。我刚刚尝试:
$(document.on('drop',function(e){e.preventDefault();))当
a1
仍然工作时,
a2
的子元素仍然被锁定,它们被设置为不可移动…不幸的是,这使得
a2
中所有可拖动和可排序的元素都不可移动…我需要a2中的这些子元素在
a2
中可排序和可移动…此代码不工作对我来说…还是不必要的重定向