【问题标题】:HTML <label> command doesn't work in Iphone browserHTML <label> 命令在 Iphone 浏览器中不起作用
【发布时间】:2011-07-22 06:07:49
【问题描述】:

在我正在制作的 html 页面中,我尝试使用 html 和 css 使 div 可点击。这在我测试过的一些主要浏览器(Chrome、Firefox、Opera、Safari)以及 HTC 手机中运行良好,但是当我尝试在 Iphone 上测试它时,我发现它根本不起作用。复选框本身甚至无法选择。

这是我的(除了在 Iphone 上工作)代码:

HTML:

<div class="" style="height: 30px;">
        <div style="display: table; width: 100%;">
        <div style="display: table-row; width: 100%;">
        <div style="display: table-cell;">
        <label for="3171">Text....</label>
        </div>

        <div style="display: table-cell; text-align: right;">
        <input type="checkbox" id="3171" name="3171">
        </div>
        </div>
        </div>
        <label for="3171">
        <span class="blocklink">Invisible text</span>
        </label>
        </div>

CSS:

.blocklink {
    display: block;
    height: 100%;
    left: 0;
    overflow: hidden;
    position: absolute;
    text-indent: -999em;
    top: 0;
    width: 100%;
}

如您所见,我使用的技术基本上只是将&lt;label&gt; 散布在整个父级div 上,因此无论您点击什么,它都会勾选/取消勾选链接的复选框。

很遗憾,这在 iPhone 上不起作用。是否有可能以某种方式继续使用这种技术但也提供 iPhone 支持? (最好不使用 javascript,因为我真的很想只使用 HTML 和 CSS)

提前致谢,

阿恩

【问题讨论】:

  • 我没有 iphone,但我很好奇标签是否有效(即没有您应用的所有 css)或者标签是否由于某种原因不受支持。
  • 好吧,经过一番简单的谷歌搜索后,我偶然发现了这篇文章:electrictoolbox.com/html-label-toggle-select-fields,其中指出“传统使用适用于所有传统浏览器,但不适用于 iPad 或 iPhone 版本 3 或 4(也许它会在以后的版本)。”所以我自己没有测试过,但我从那个来源假设它们根本不起作用(没有任何 css)

标签: iphone html css


【解决方案1】:

我将问题缩小到使用 Fastclick 库;当我从我的代码库中删除它时,我的问题就消失了,这向我表明,这里没有其他答案所建议的原生 iOS/FF 问题。

在不知道其他人正在使用的库的情况下,但知道 Fastclick 非常普遍,我是否可以建议这个错误的根本原因实际上是一个库问题 - 而不是在 Apple 发布多年后一直存在的问题!似乎更有可能。也许这里的其他人可以了解他们是否在使用 Fastclick?

更多信息

作为安全措施,某些浏览器会阻止客户端代码触发文件输入。尝试使用document.querySelector('input[type=file]').click() 从控制台触发单击事件,它会起作用,在您的代码中执行相同操作,它会神秘地失败。

我想这个错误存在的原因是因为 ontouchstart 处理程序正在通过 Fastclick 应用于 &lt;label /&gt;。当它在触摸设备上被触发时,库会将该事件代理到 onclick 处理程序,或者在本例中是本机 &lt;label /&gt; 功能。不幸的是,这意味着客户端代码正在触发文件输入打开,并且被浏览器阻止。

【讨论】:

    【解决方案2】:

    我遇到了一个有点特殊的情况。我们已经在labels 中的所有spans 上使用了pointer-events: none。但是,我们随后需要在其中一个标签中添加 &lt;a&gt; 作为可点击标签。

    <label>
        <span>Label text here. With a <a href="http://www.google.com">link text</a> here.</span>
    </label>
    

    所以,我们在那些&lt;a&gt; 上明确设置pointer-events: all

    label > span { pointer-events: none; }
    label > span > a { pointer-events: all; }
    

    这适用于最新的 Chrome、Firefox、IE 11 和 iOS 9 Safari。

    【讨论】:

      【解决方案3】:

      如果标签中包含任何 html 元素,问题似乎在 iOS9 中仍然存在。至少发生在其中的 span 元素上。 'pointer-events: none' 修复它。

      <label for="target">
        <span>Some text</span>
      </label>
      

      当用户点击“Some Text”时,上面的代码不会触发目标输入的更改,除非您添加以下css:

      label span {
        pointer-events: none;
      }
      

      【讨论】:

      • 现在是 2016 年 3 月,我在 IOS 的标签中遇到了这个错误。这个技巧成功了!谢谢大佬!!
      • 现在是 2016 年 4 月,我在 IOS 的标签中遇到了这个错误。这个技巧成功了!谢谢大佬!!
      • 现在是 2016 年 5 月,我在 IOS 和 FIREFOX MOBILE 的标签中遇到了这个错误。这个技巧成功了!谢谢大佬!!
      • 现在是 2016 年 9 月,我在 IOS 的标签中遇到了这个错误。这个技巧成功了!谢谢大佬!!
      • 现在是 2016 年 11 月,iOS 10 仍然存在这种情况。这个技巧成功了!
      【解决方案4】:

      另一种解决方案——虽然更老套,但防弹——将复选框绝对定位在标签上,z-index 它,增加宽度/高度以包含底层标签,然后将不透明度设为 0。如果页面上有多个标签,这当然会很乏味......您自然也只会实现该媒体尺寸的绝对定位;无需破解整个应用环境。

      【讨论】:

        【解决方案5】:

        如果您在事件处理程序(例如 onMouseEnter)上更改 DOM,这将导致跳过所有下一个处理程序,包括 onClick。

        SetTimeout 不能解决这个问题。

        示例: 1. 在 onMouseEnter 中使用 setTimeout 和在 DOM 中注入新 div 的函数 2. 不调用任何 onClick 处理程序。

        解决方案:避免在事件处理程序中更改 DOM。

        备注:发现标签标签有问题,但标签内的跨度仍然存在。任何类型标签都可能存在此问题。

        这种行为仅适​​用于移动 iOS。在桌面 Safari 和 Mac OS Safari 中 - 一切正常。

        【讨论】:

          【解决方案6】:

          出于某种晦涩的原因,如果您申请,请使用 CSS:

          label { cursor: pointer; }
          

          可以在 iPhoneiPad 上使用。

          【讨论】:

          • 这解决了我在 iPod Touch 的最新 iOS(截至 2011 年 9 月 16 日)上的问题。
          • 显然该修复不适用于 iOS 4(刚刚测试过)。改用 Dan Manion 的技巧(在标签中添加一个空的 onclick="" 事件),这对我有用。
          • 适用于 iOS 6.2。有人认为我们应该支持旧版本的 iOS 吗?
          【解决方案7】:

          我通过在父元素上放置一个空的 onclick="" 来解决它:

          <form onclick="">
              <input type="radio" name="option1" value="1">
              <label for="option1">Option 1</label>
          
              <input type="radio" name="option2" value="2">
              <label for="option2">Option 2</label>
          
              <input type="radio" name="option3" value="3" checked="checked">
              <label for="option3">Option 3</label>
          </form>
          

          【讨论】:

          • 不错,使用单个 onclick 属性而不是每个标签元素上的一个属性似乎是一种更好的解决方法。
          • 它甚至可以使用 onCLick="" 属性在表单外添加任何容器,例如 div。奇怪,但很有用!
          • 确实,它也适用于像 div 这样的父容器,但如果将 onclick 处理程序添加到正文中,它就不起作用。
          【解决方案8】:

          在标签中添加一个空的onclick="" 会使该元素在IOS4 上再次可点击。似乎默认情况下,该操作被按住复制和粘贴文本机制阻止或取代。

          <label for="elementid" onclick="">Label</label>
          

          【讨论】:

          • +1 这才救了我一天。没想到iOS浏览器也这么牛逼。
          • 我看到这个答案适用于 iOS4,但我在 iOS7 上看到了相同的行为,这个修复不起作用。还有其他解决方法吗?
          • 截至 2015 年 3 月,这仍然是必需的(并且仍然有效)(iPad 2 上的 iOS 7)
          猜你喜欢
          • 2019-08-31
          • 1970-01-01
          • 1970-01-01
          • 2017-10-13
          • 1970-01-01
          • 2016-09-21
          • 2018-03-07
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多