【问题标题】:How to make :checked work on Android Browser?如何使 :checked 在 Android 浏览器上工作?
【发布时间】:2014-02-16 22:06:17
【问题描述】:

我正在尝试制作一个包含默认选项列表的表单,并且还可以扩展以显示几个附加选项。我使用以下 CSS 代码执行此操作:

.myForm .moreOpts {display:none;}
.myForm #more:checked +*+ .moreOpts {display:block;}

使用以下 HTML:

<form action="#" class="myForm">
  <ul>
    <li>
      <input type="checkbox" id="pref-1" name="pref-1" value="1">
      <label for="pref-1">Foo</label>
    </li>
    <li>
      <input type="checkbox" id="pref-2" name="pref-2" value="2">
      <label for="pref-2">Bar</label>
    </li>
    <li>
      <input type="checkbox" id="more" name="more" value="true">
      <label for="more">More options</label>
      <ul class="moreOpts">
        <li>
          <input type="checkbox" id="pref-3" name="pref-3" value="3">
          <label for="pref-3">Baz</label>
        </li>
        <li>
          <input type="checkbox" id="pref-4" name="pref-4" value="3">
          <label for="pref-4">Qux</label>
        </li>
      </ul>
    </li>
  </ul>
</form>

Demo

此代码在除 Android 浏览器 和 Dolphin 之外的所有浏览器中都能完美运行。我发现 an article 建议在 Dolphin 中添加 this“错误修复”,但只有 fixes my problem。

有没有办法让默认的 Android 浏览器也能正常工作?

【问题讨论】:

  • 真的吗?这适用于每个浏览器?甚至IE?我建议使用一些 JavaScript/jQuery 脚本/插件之王
  • @AdrianFlorescu 不是 IE8 及更低版本,但这是意料之中的。我的问题是Android浏览器应该支持这个,但它在那里不起作用。 this example 在 Android 浏览器中运行良好,所以我不明白为什么我的问题中的代码不会。对于 IE8- 我将自动显示所有选项,作为后备。
  • Android Gingerbread 不工作。还好我有果冻豆。 +1
  • 尝试将 '+*+' 替换为 '~'
  • 另外,您是否尝试过其他答案,例如将'+*+' 替换为+*:nth-child(n)+'

标签: css checkbox android-browser dolphin-browser


【解决方案1】:

您可以在details 元素的帮助下实现这一点。 Android supports it 从版本 4 开始。不过,你将不得不处理 IE 和 Firefox,还好这些浏览器支持 CSS3 伪状态,包括 :checked。

两个合并这两个,只需在不支持details的浏览器中使用复选框破解。下面是代码中解释的过程:http://jsfiddle.net/hF6JP/1/

编辑:这是最终解决方案,将标签放在摘要中解决了强制复选框切换选项的问题:http://jsfiddle.net/mYdsT/

【讨论】:

  • 您的第二个链接似乎不适用于 Android。 label 上的点击事件似乎没有被summary 继承。我将只实现浏览器检测(因为功能检测不适用于此错误,因为 the selector does seem to work when it's used on initial pagerender。然后我将更改默认 android 浏览器和 Dolphin 的 DOM(它们似乎都使用相同的用户代理字符串)。如果没有更好的答案,我会将其标记为已接受(我真的不期待,但我确实想先等待它)。非常感谢!
【解决方案2】:

我不会相信:checked 适用于所有浏览器。我会捕获#more 的click 事件,然后向父级添加一个类。使用jQuery 很容易。此选项适用于 Android 和 IE8。

$("#more").on("click", toggleCheckboxes);
var toggleCheckboxes = function(evt){
  var $this = $(this);
  $this.parents("li").toggleClass("show-more-options");
  evt.preventDefault()
}



.myForm .moreOpts {
  display:none;
}
.myForm .show-more-options .moreOpts {
  display:block;
}

:checked 在 IE8 中不受支持,遗憾的是这仍然很重要

https://developer.mozilla.org/en-US/docs/Web/CSS/:checked

【讨论】:

  • 感谢您的建议,但我正在寻找一种无需 JavaScript 即可完成这项工作的方法。
【解决方案3】:

http://quirksmode.org/css/selectors/mobile.html#t60

:checked 显然不适用于任何版本的 Android。我不确定为什么这么多网页报告它应该可以工作(显然是从 2.1 开始),但这是错误的。

QuirksMode 的好处在于,每项功能在发布到网络之前都会在真实浏览器中进行实际测试。

JavaScript 似乎是您最好的解决方案。我什至会推荐 javascript,因为如果用户选中“更多”框,然后选择一些额外的选项,然后取消选中“更多”框......额外的选择仍然会被“选中”并且如果用户点击“提交”按钮。每次取消选中“更多”框时,您都必须取消选中这些框。唯一的方法是使用 javascript。

更新: QuirksMode 为 :checked 选择器编写了一个有缺陷的测试:

:checked {
    display: inline-block;
    width: 3em;
}

您会注意到,在 Android 上,宽度永远不会改变...但这是因为 Android 不会将宽度应用于复选框和单选框(而桌面浏览器会这样做)。

以下确实工作,即使在我的 Android 2.3 中:

:checked {
    display: inline-block;
    margin: 3em;
}

因此,正如其他 cmets 所述,问题在于选中的选择器和相邻的兄弟选择器的组合:

:checked + .test { /* does not work on android :( */ }
:checked ~ .test { /* does not work on android :( */ }

【讨论】:

  • 那么 quirksmode 部分错误。我自己测试了:checked,当它不用于像这个问题这样的复杂情况时,它工作得很好。 This JSBin 呈现为 this,甚至会呈现为 change dynamically,因为这个 bin 使用了如此简单的选择器。 This JSBin 但是使用 :checked 和 ~,所以 Android 浏览器 just doesn't handle it anymore。所以,:checked 确实有效,只是不完全。
  • 回复您后来的编辑,即当用户隐藏“更多选项”框时,复选框仍将被选中,这真的很容易在服务器上检查,只需将其放入 if 块中,检查表单的 more 参数是否设置为 "true"(这就是为什么该输入还设置了 name 和 value 的原因)。这根本不是问题。
  • 酷,我只是让你知道隐藏!==取消检查;)。 QuirksMode 为每个选择器编写测试,但他们对该功能的测试存在缺陷。我已经更新了我的答案。
猜你喜欢
  • 2014-01-27
  • 1970-01-01
  • 2018-08-01
  • 1970-01-01
  • 2013-01-14
  • 1970-01-01
  • 1970-01-01
  • 2010-11-06
相关资源
最近更新 更多