前端常见兼容问题系列4:sort方法在浏览器中执行效果的差异

前面写了好几个安卓系统下一些手机中的兼容性问题。这次我们来一个iOS系统下的。

有这么一个HTML片段:

<body>
<p id="container"></p>
<div>
    <script>
        var str = ''
        var arr = [
              {name: "3", value: "50"},
              {name: "2", value: "60"},
              {name: "1", value: "70"},
              { name: "4",value: "40"},
              {name: "5", value: "30"}
        ];

        arr.sort(function (a, b) {
            return +b.value > +a.value;
        });

        arr.forEach(function (item) {
            str += item.name + ':  ' + item.value + '<br/>';
        })

        document.querySelector('#container').innerHTML = str;
    </script>
</div>
</body>

我们期望通过它来将数组以每一项value值做倒序排列。在Chrome浏览器中,如你所愿,输出了如图1所示的结果:


(图1)

但是,在Safari这个还算比较让人放心的浏览器中,展示的结果则如图2所示——顺序完全出乎意料:


(图2)

看起来它好像什么事情也没做,只是把数组原样输出了。这是为什么呢?

Google一下,原来是因为sort后面跟着的排序函数,需要返回正数、负数或者0才是标准的影响排序的函数。而如上例所示的采用返回布尔值的函数作为排序函数是一种误用。

所以,正确的方法应该是:

arr.sort(function (a, b) {
      return +b.value > +a.value ? 1: +b.value < +a.value ? -1 : 0;
});

经过修正,我们上面的例子无论在Chrome还是Safari中都可以获得正确的排序结果了(如图3)。

顺便提一下,在这个比较中,如果忘记对于比较的内容做类型转换,也是很容易出现问题的。


(图3)

从这个问题得出的教训是:

1、Safari浏览器中的兼容性其实也不可以掉以轻心

2、一个基本知识点的理解错误,可能会造成非常严重的bug(比如这里的排序,往往是非常关键的功能),所以基础非常重要。

3、多测试总能发现意想不到的问题。某种程度上讲,所谓bug,就是一个个意料之外。

时间: 2024-09-17 04:14:55

前端常见兼容问题系列4:sort方法在浏览器中执行效果的差异的相关文章

前端常见兼容问题系列3:永远置于顶层的video

上一篇我们把消失的video找了出来.这一篇我们接着在video上面遮盖一个层,以方便放置一些内容.于是,我们这么做: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="format-detection" content="telephone=no, address=no, email

前端常见兼容问题系列6: 一些安卓APP的WebView中&lt;input type=&quot;file&quot;&gt;不工作

有一次想做一个HTML5的图片上传功能,主要是依赖<input type="file">来选择本地的图片.开始一切都很顺利,在浏览器中,在淘宝等容器中,都能如预期进行文件选择和上传.在iOS系统下的APP中也都工作正常,但是在一个安卓APP中,无论怎么尝试选择文件,都始终出不来. 我给input的onchange事件打了个alert(),点击时也没有任何反应.看来是<input type="file">在这个容器中根本就不工作. 经过一番检索

前端常见兼容问题系列8: 安卓机器中通过JS设置焦点无法拉起软键盘

有时候,为了优化用户体验,做交互设计的同学可能会希望让输入框自动获得焦点并弹出软键盘,这样用户不用点击输入框就可以直接输入.的确,这对用户来说很方便.但真正用HTML5页面去实现的时候,却遇到了问题. 首先我做了这样一个demo. <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="apple-mobile

前端常见兼容问题系列5:¥符号在部分Android APP的WebView中不见了

问题再现 ¥符号在涉及到售卖的页面再常见不过了.但是,测试中居然发现,华为荣耀6 plus(系统4.4.2)上,某APP中该符号不见了,所有用到该符号的地方均成了空白(如图1所示). (图1) 而实际上,我所期望的效果如图2所示: (图2) 分析过程 莫非是编码不对?首先,来看一下我是怎么实现¥这个符号的--用的是CSS,形如 .price:before{ content:'\A5'; display:block; font-size:12px; } 的伪元素. 发现这个问题之后,我尝试把它直接

前端常见兼容问题系列2:视频哪里去了?

<video>是HTML5中新增的重要标签,用它来引入视频这一生动活波的媒体形式,简单好用,因而这个标签在各种网页中非常常用.但它却并不那么完美. 问题来啦 我们来看一个再简单不过的页面(代码清单如下),主题内容只添加了一个video标签和一个用于做参照物的p标签: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta

前端常见兼容性问题系列1:丢失的CSS补间动画

[前言] 有人说,前端开发的过程常常就是一个不断"入坑"和"出坑"的.这句话道出了前端开发中的磕磕绊绊以及相伴而来的成长.遗憾的是,这些成长大都只存储在工程师的脑海里,日复一日的,相信总有不少人花掉昂贵的时间在重复解决着同样的"坑". Stack Overflow是我们查找一些常见bug解决办法的好帮手,但我们每天也遇到各式各样的新问题以及有一定独特性的问题.若能花一点精力将自己遇到的问题.思考过程.解决方案.延伸感悟等记录下来,让经验更具延续性

前端常见兼容性问题系列7: 部分浏览器不支持音频自动播放

1.问题又来了 曾做一个活动页,需要打开页面时自动播放一小段背景音乐.因为音乐持续时间非常短,所以设计这个页面时,没想要设置一个播放控制按钮.一开始我也以为确实没有必要.开发中,用我的老古董机器小米2S测了也没发现啥问题. 但是,用iOS机器测试时,问题就来了,有的平台中可以听到背景音乐(如iOS中的支付宝),有的则始终出不来(如iOS 中的Safari浏览器).用JavaScript来load音频,再自动触发音频的play()方法,也没有效果. 2.定位问题.查找原因 Google一番发现原来

JavaScript的常见兼容问题及相关解决方法(chrome/IE/firefox)_javascript技巧

首先这里声明一下,关于我测试浏览器的版本是chrome15.0.874.121 Firefox 8.01 IE9 IETester 下面的代码关于声明 1:获得滚动条的情况 复制代码 代码如下: function getScroll(){        var t, l, w, h;         if (document.documentElement && document.documentElement.scrollTop) {            t = document.do

setTimeout函数兼容各主流浏览器运行执行效果实例_javascript技巧

目前这个setTimeout可以很好地兼容IE6,7,8,9以及谷歌浏览器Chrome,火狐浏览器FireFox,苹果浏览器Safari,Opera. setTimeout是一个很不错的函数,网站页面前端工程师经常将其用于几秒后执行的动作.setTimeout这个JS内置函数其用法也很简单,下面是setTimeout()的函数说明以及用法详解和实例.示例代码: setTimeout()的作用是指定在多少毫秒后执行一个JS函数或者表达式代码 setTimeout的用法.语法.参数:setTimeo