【问题标题】:Disabling default drag behavior on links in iOS Safari禁用 iOS Safari 中链接的默认拖动行为
【发布时间】:2011-11-23 06:40:58
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 我希望您正在为某些公司开发一个严格的内部应用程序,而不是试图破坏一些随机网络用户的浏览器功能。
  • 这是一个内部应用程序。现在,它不能在打开 2 个窗口的情况下正常工作,并且在我们的应用程序中打开一个窗口并在 Safari 中打开另一个窗口会令人困惑。我们可能有一天会解决这个问题,但这不是首要任务。我不知道有人故意在我们的应用上做这种拖动手势。

标签: javascript html css ios safari


【解决方案1】:

请检查一下

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

【讨论】:

  • 您的解决方案解决了问题,但导致了新问题。有些链接我有一个点击处理程序来替换默认的点击行为,在尝试您的解决方案后,这些链接上的点击处理程序停止工作。
  • 将 $('a') 替换为 $('.classname a'),其中 'classname' 将是该容器类。我认为这可以解决您的问题或请恢复。
  • 你指的是什么容器?链接位于应用内的不同位置。
  • @mikez302 Sanooj,只需将类放在您想要此行为的 标记上;然后将其用作 Jquery 中的选择器。
【解决方案2】:

我知道您说过您已经尝试过,但您可能遇到了特异性问题。你可以试试这样的。

* {
    -webkit-touch-callout: none !important;
}

希望这会有所帮助。

如果这不能解决您的问题,请尝试here

【讨论】:

  • 我试过你的答案,但它没有做任何事情。我尝试了您链接到的解决方案,它与 Sanooj 解决此问题的解决方案存在相同的问题。
【解决方案3】:

在加载 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 编码器,但你明白了 :)

【讨论】:

  • 有机会我会尝试,但我想知道超时是否会使应用程序感觉很慢。另外,如果用户握住手指超过一秒怎么办?
  • 更改超时时间怎么样?
【解决方案4】:

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

【讨论】:

  • 你的想法没有奏效。我也尝试过 ondragend,但也没有用。
【解决方案5】:

为了解决您对 Sanooj 解决方案的问题,您是否尝试过从他建议的代码中调用您自己的函数?例如:

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

目前我无法使用 Web 应用程序对此进行测试,但它适用于普通浏览器,即它可以防止正常行为,但也允许我基于类调用特定函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-19
    • 2012-04-05
    • 1970-01-01
    • 2015-11-19
    • 1970-01-01
    相关资源
    最近更新 更多