Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在iOS Safari中禁用链接的默认拖动行为_Javascript_Html_Css_Ios_Safari - Fatal编程技术网

Javascript 在iOS Safari中禁用链接的默认拖动行为

Javascript 在iOS Safari中禁用链接的默认拖动行为,javascript,html,css,ios,safari,Javascript,Html,Css,Ios,Safari,我正在开发一个网络应用程序。我正在尝试禁用链接上的大多数默认iOS Safari行为,因此我将链接上的“-webkit touch callout”CSS属性设置为“无”。但是,我仍然注意到,如果我用手指按住链接一秒钟左右,然后拖动它,然后放开它,链接将在新窗口中打开。我不想要这种行为。我希望它要么在同一个窗口打开,要么什么也不做。有人知道如何做到这一点吗 EDIT:我正在使用jQuery,所以如果可以简化事情的话,可以使用jQuery的事件处理函数 编辑2:对于某些链接,我使用处理程序覆盖它们

我正在开发一个网络应用程序。我正在尝试禁用链接上的大多数默认iOS Safari行为,因此我将链接上的“-webkit touch callout”CSS属性设置为“无”。但是,我仍然注意到,如果我用手指按住链接一秒钟左右,然后拖动它,然后放开它,链接将在新窗口中打开。我不想要这种行为。我希望它要么在同一个窗口打开,要么什么也不做。有人知道如何做到这一点吗

EDIT:我正在使用jQuery,所以如果可以简化事情的话,可以使用jQuery的事件处理函数

编辑2:对于某些链接,我使用处理程序覆盖它们的默认行为。例如:

$(".categoryList a").live("click", function(e) {
    e.preventDefault();
    $.get(
        "someOtherUrl",
        {someVariable: "someValue"},
        function(result) {
            $(".result").html(render(result));
        }
    );
});

我的实际代码比这更复杂,但我的观点是,我正在覆盖某些链接上的默认单击操作,我用于解决此问题的任何解决方案都不应干扰这些处理程序。Sanooj的解决方案不适用于我的目的,因为“window.location”分配始终重定向浏览器,而不管我是否有任何处理程序来阻止这种行为。也许我不应该为了这个目的而使用链接,但在我开始开发这个应用程序之前,它就是这样的,改变它将是一个大项目。我想知道是否有更简单的方法来解决这个问题。

我不知道这是否有效,但在默认的webkit(chrome/safari)上,您可以设置属性
ondragstart=“return false;”“
来禁用默认的拖动行为。

请检查此项

$('a').live('click', function (event) {
    event.preventDefault();
    window.location = $(this).attr("href");
});

我知道你说你已经试过了,但是你可能遇到了一个特殊性问题。你可以试试这样的

* {
    -webkit-touch-callout: none !important;
}
希望这有帮助


如果这不能解决您的问题,请尝试在加载ajax内容和检测手指移动之前设置超时:

 function setupAnchorClicks() {
  var timer = null;
  $(".categoryList a").live("click", function(e) {
    e.preventDefault();

    timer = setTimeout(function() {
       // ...
    }, 1000);

  }).live("touchmove", function() {
    clearTimeout(timer);
  });
}

setupAnchorClicks();

这可能不是开箱即用的,因为我是一个糟糕的javascript程序员,但是你得到了这样的想法:)

要用Sanooj的解决方案解决你的问题,你是否尝试过在他建议的代码中调用你自己的函数?例如:

$('a').live('click', function(event)
{
    if($(this).hasClass('categoryList'))
        categoryListSpecificFunction();
    event.preventDefault();
    window.location = $(this).attr("href");
});

目前我无法用Web应用程序测试这一点,但它在正常浏览器中对我有效,即它可以防止正常行为,但也允许我根据类调用特定函数。

你的想法不起作用。我也试过ondragend,但也没用。我希望你是在为某家公司开发一款严格的内部应用程序,而不是试图破坏一些随机网络用户的浏览器功能。它是一款内部应用程序。现在,如果有两个窗口打开,它将无法正常工作,如果在我们的应用程序中打开一个窗口,而在Safari中打开另一个窗口,这将令人困惑。我们也许有一天会解决这个问题,但这不是当务之急。我不知道有人故意在我们的应用程序上做这个拖动动作。你的解决方案修复了问题,但导致了一个新问题。对于某些链接,我有一个单击处理程序来替换默认的点击行为,在尝试解决方案后,这些链接上的单击处理程序停止工作。将$('a')替换为$('.classname a'),其中“classname”将是该类。我认为这解决了您的问题,或者请返回。您指的是什么容器?链接在应用程序中的不同位置。@mikez302 Sanooj,只需将类放在您想要这种行为的标记上;然后在Jquery中使用它作为选择器。我尝试了你的答案,但它没有做任何事情。我尝试了你链接到的解决方案,它与Sanooj解决该问题的方案存在相同的问题。我会在有机会时尝试,但我想知道超时是否会使应用程序感觉缓慢。另外,如果用户按住手指超过一秒钟会怎么样?更改超时时间怎么样?