3

次のコードは、iPhone の Safari を除いて、Mac の Safari を含むすべてのブラウザで正しく機能します。

次のように定義されている、潜在的に実行されている可能性のあるタイマー オブジェクトがあります。

//delay background change until animation is finished
lastTimer = setTimeout(function () {
  $('#' + targetDiv).removeClass('open');
}, 150);

後で、タイマーが動作しているかどうかを確認し、動作している場合はキャンセルする必要があります。私が使用しているコードは次のとおりです。

if (lastTimer != null) { clearTimeout(lastTimer); }

これは、IOS Safari が JavaScript エラーを生成する場所です。

"ReferenceError: 変数が見つかりません: lastTimer".

他のブラウザーのように、null のチェックがエラーを防止しない理由について何か考えはありますか?

以下の返信に対する2つの関連する関数の完全なコードは次のとおりです:(解決策で編集)

// Class for handling the animations for the drop down menus
var dropDownMenu = {
lastTimer: null,
openMenu: function (targetDiv) {
    if (targetDiv != null) {
        var targetHeight = $('#' + targetDiv).height();
        $('#' + targetDiv).stop(true); //stop an previous animations and clear queue
        if (this.lastTimer != null) { clearTimeout(this.lastTimer); } //stop possible pending timer to prevent background change
        console.log("testing b");
        $('#mainNavigation #dropDownMenu ul').removeClass('open'); // make sure all closed menus show corrent bgd
        $('#' + targetDiv).animate({
            bottom: -(targetHeight + 30)
        }, 200, 'swing');
        $('#' + targetDiv).addClass('open');
    }

},
closeMenu: function (targetDiv) {
    if (targetDiv != null) {
        $('#' + targetDiv).stop(true); //stop an previous animations and clear queue
        $('#' + targetDiv).animate({
            bottom: 0
        }, 200, 'swing');
        //delay background change until animation is finished
        this.lastTimer = setTimeout(function () {
            $('#' + targetDiv).removeClass('open');
        }, 150);
    }
}
}

iOSでエラーが発生すると、実行が停止し、console.log直後のテストが実行されません。

4

5 に答える 5

10

これを説明するためにチャイムを鳴らしたいと思います。モバイル Safari は、単純なチェックを使用して undefined をチェックする場合、それほど寛容ではありません。

if variable

このような状況に遭遇した場合は、

if typeof variable === "undefined"

ここで変数を「this」にアタッチすることは 1 つの解決策ですが、definedVariable.undefinedProperty が未定義を返すという事実を利用しているだけですが、未定義の変数を直接参照すると、一部のランタイム環境で参照エラーが発生します。

必要がない場合は、「これ」に付ける習慣を身につけないことをお勧めします。

于 2012-06-13T21:04:55.653 に答える
1

あなたの問題は、IOS では がopenMenu最初に呼び出されているようです。

これは、宣言されていない変数の値を取得しようとしているため、ReferenceError.

奇妙なことに、宣言されていない変数に割り当てることができます。これにより、暗黙的にグローバルになります。したがって、closeMenuが最初に呼び出されると、代入が最初に行われ、変数が暗黙的に宣言されます。

適切な解決策は、変数を使用する前に常に変数を宣言することです。

var lastTimer;

しかし、結局のところ、変数ではなく、現在のオブジェクトのプロパティを使用することをお勧めしました。そのため、解決策はメソッドでプロパティにアクセスすることでした...

this.lastTimer

ReferenceErrorプロパティが宣言されていなくても、これは をスローしません。

于 2012-06-13T19:41:03.233 に答える
0

コードにグローバル変数があります。var を宣言しないとグローバルになります。

変更してみてください:

if (lastTimer != null)

if (typeof lastTimer !=="undefined" && lastTimer)

グローバルであることに固執している場合。

于 2012-06-13T19:29:46.453 に答える