hifive / hifivemain

main repository
http://www.htmlhifive.com/
Other
40 stars 10 forks source link

iOS7.0.xにてmin版のhifiveを使用するとイベントハンドラが実行されない #402

Closed tabatas closed 10 years ago

tabatas commented 10 years ago

iOS7.0.3、iOS7.0.4でhifive1.1.13.jsのmin版を使用すると、コントローラーからDOM要素にイベントをバインドしても処理が実行されません。 iOS6.1.2、iOS7.1.0、Android4.1.2では正常に実行されていました。また、デバッグ版のh5-1.1.13.dev.jsではどのOSでも正常に実行しました。 なお、controllerのみを含めたカスタムビルドでも同様の症状が起こりました。

h5-1.1.13.js min版使用時に 正しく動作したOS iOS 6.1.2 iOS 7.1.0 Android 4.1.2 動作しなかったOS iOS 7.0.3 iOS 7.0.4

HTML

<!doctype html>
<html>
    <head>
        <meta charset="UTF-8">
        <script type="text/javascript" src="res/lib/jquery/jquery-2.1.1.min.js"></script>
        <script type="text/javascript" src="res/lib/h5/h5-1.1.13.ctrl.js"></script>
        <script type="text/javascript" src="res/js/test.js"></script>
    </head>
    <body class="body">
        <div id="sage" style="width:50px;height:50px;background-color:red;cursor:pointer"></div>
    </body>
</html>

JavaScript test.js

$(function(){
    var controller ={
        __name: 'TestController',
        '#sage click': function() {
            alert('click!!');
        }
    };
    h5.core.controller('.body' , controller);
});
fukudayasuo commented 10 years ago

対応しました。 原因は、minifyされたコードの一部にiOS7.0.4で正しく解釈されない部分があることが原因でした。 iOS7.0.4では、以下のような『if文の条件式内の論理値と論理積を含む条件式との比較』が正しく判定されません。

if (false !== (null && 'hoge')) {
    alert('success');
} else {
    alert('error'); // iOS7.0.4だとelse文が実行される
}

hifiveのminifyしたコードの、イベントハンドラをバインドするかどうかの条件式が上記のようなパターンに当てはまってしまい、iOS7.0.4でイベントハンドラのバインドが正しく行われなくなっていました。

挙動が変わらないように、minifyした時に上記パターンにならないように(3項演算子になるように)ソースコードを修正して、対応しました。