翾
  • 发布:2015-04-10 17:54
  • 更新:2015-04-14 16:13
  • 阅读:5515

【报Bug】mui.fire()方法错误

分类:MUI
mui

经测试发现:
mui.fire()传递自定义数据的时候如果是 字符串中带 单引号,就会报错:

Uncaught SyntaxError: Unexpected identifier

如:
mui.fire(webview,"select",{"id":20,"title":"abc'cba"});

如果title内是 “0‘0”这类数字的,提示:
Uncaught SyntaxError: Unexpected number

如果title内是 “0\'0”这类数字的,提示:
Uncaught SyntaxError: Unexpected token ILLEGAL

我看了看mui.fire里面的实现,发现这样的字符串拼接有问题。
能不能用webview来实现传递参数,不用js这种方式?

2015-04-10 17:54 负责人:无 分享
已邀请:
DCloud_UNI_FXY

DCloud_UNI_FXY

fire内部使用了JSON.stringify和JSON.parse来编码和解码。

你需要确保你的js对象能够被正常的stringify和parse

  • (作者)

    你试试就知道了。比如:

    var a={ "id": 20, "title": "abc'cba" };

    alert(JSON.stringify(a));//没有问题的!

    alert(JSON.parse(JSON.stringify(a)));//没问题的!

    mui.fire(webview,"select",a);//报错!

    上面的我提及的那几个SyntaxError都是可以复现的。

    2015-04-10 18:36

  • DCloud_UNI_FXY

    这是因为拼接字符串的时候有问题。因为我们拼接参数是用单引号的。而你的字符串也有单引号,导致js参数错误。

    如果遇到参数双引号,单引号混用的情况。

    你可以手动使用evalJS来拼写成正确的js函数调用。

    或者修改源码的fire方法。JSON.stringify(obj).replace(/\'/, "\'")。替换一下单引号。

    全面评估后,如果没问题,下个版本会修复一下。

    2015-04-10 19:13

  • DCloud_UNI_FXY

    正则少了点。/\'/g全局匹配替换。

    2015-04-10 19:19

翾

(作者) - 没有什么想要介绍的

var a={ "id": 20, "title": "abc'cba" };
alert(JSON.stringify(a));//没有问题的!
alert(JSON.parse(JSON.stringify(a)));//没问题的!
mui.fire(webview,"select",a);//报错!
上面的我提及的那几个SyntaxError都是可以复现的。

我看了看 是 mui.fire内部使用了字符串拼接,如果字符串中包含 ’那就相当于:

webview.evalJS("typeof mui!=='undefined'&&mui.receive('select','abc'cba')"); //报错

翾

(作者) - 没有什么想要介绍的

@DCloud_MUI_FXY @DCloud_heavensoft 这个应该算一个BUG吧?
我改了一下,使用Unicode编码。

$.fire = function (webview, eventType, data) {  
        if (webview) {  
            webview.evalJS("typeof mui!=='undefined'&&mui.receive('" + eventType + "','" + JSON.stringify(data || {}).replace("'", "\\u0027").replace("\\", "\\u005c") + "')");  
        }  
    };

希望下个版本及时更新这个错误。

  • DCloud_UNI_FXY

    嗯。自己修改的时候建议使用正则匹配所有。

    2015-04-10 20:07

DCloud_UNI_CHB

DCloud_UNI_CHB

感谢反馈,mui v1.5.0版本已解决该问题,赠送50积分。

该问题目前已经被锁定, 无法添加新回复