7

我已经搜索了几天了,到目前为止,我能想到的最好的方法就是检查下面的列表。我真的不喜欢检查基于 User-Agent 的支持,特别是因为它可以被欺骗。我还听说过至少一种情况,下面的列表不正确(如下所述)。

  • 是 Internet Explorer 吗?
  • 是 WebKit 吗?(但我读过移动 Safari 不支持它)
  • 是歌剧吗?
  • Gecko 和版本是否 >= 1.9?(意味着 Firefox 3 或更高版本)

是否有基于直接通过 JavaScript 测试支持的更好方法,或者这几乎是测试支持的唯一方法?

4

4 回答 4

9
var canEditContent= 'contentEditable' in document.body;
于 2009-12-10T16:31:49.313 回答
7

检查某个功能的最佳方法是在您知道应该支持它的元素上实际测试该功能,如下所示:

if(element.contentEditable != null)
    // then it's supported

或者

if(typeof(element.contentEditable) != 'undefined')
   // same thing.. but with typeof you can be more specific about the type of property you need to find
于 2009-12-10T16:32:04.150 回答
2

我想出的针对我的场景(类似于您的场景)的最佳解决方案如下。它可能不是防弹的,但涵盖了大多数情况:

var ua = navigator.userAgent;
var android_version = ua.match(/Android ([0-9\.]+)/);
var div = document.createElement("DIV");

if( typeof(div.contentEditable) == 'undefined' ||
  (/(iPhone|iPod|iPad)/i.test(ua) && /OS [1-4]_\d like Mac OS X/i.test(ua)) ||
  (android_version!=null && parseFloat(android_version[1])<3 ) ||
  (/(Opera Mobi)/i.test(ua))
) {
  // doesn't support contenteditable
} else {
  // supports contenteditable
}

您可以在这个 jsFiddle中对其进行测试。

注意:根据您的需要和目的,您可能还需要检测 IE 版本,因为它对 contenteditable 的支持是......“不理想” :-) 大部分麻烦都由超级库 Rangy.js 处理。

于 2012-09-29T14:16:00.353 回答
1

bobince 的答案在大多数情况下都有效,但正如前面所说,您将需要用户代理嗅探以排除不显示软件键盘的 iOS 和 Android 版本。我目前正在使用这样的东西:

function isContentEditable() {
    var canEditContent = 'contentEditable' in document.body;
    if (canEditContent) {
        var webkit = navigator.userAgent.match(/(?:iPad|iPhone|Android).* AppleWebKit\/([^ ]+)/);
        if (webkit && parseInt(webkit[1]) < 534) {
            return false;
        }
    }
    return canEditContent;
}

这应该会阻止较旧的 iOS 和 Android 设备返回 true。但它仍然存在一个问题:物理键盘。例如,如果设备运行 Android 2.3 但有物理键盘,则用户将能够使用 contentEditable 但此函数将返回 false。物理键盘虽然很少见。

更常见的是,在某些设备上,用户可以通过按住菜单按钮来调出屏幕键盘。显然,这并不是您真正应该期望您的用户知道的事情。

您可以通过某种方式让用户手动覆盖检测脚本的嗅探部分,从而稍微缓解这些问题。您可以通过向“if (canEditContent)”添加覆盖检查来在 isContentEditable 函数中实现这一点。但是,为此实现 UI 可能会带来更多挑战;)。

于 2013-05-31T16:58:02.000 回答