2016-10-26 5 views
0

私のコードの中に混乱したバグがあり、それを修正する方法がわかりません。私は現在のウィンドウのサイズに応じてスクリプトを呼び出す、主な機能を得ました。slideToggle()スケールダウン後に関数が機能しない

モバイルデバイスの場合、モバイルデバイスで表示すると機能するslideToggle()という機能があります。しかし、600pxより上に開くと、機能が縮小されますが、slideToggle();は機能しなくなります。

display: block;に設定してすぐにdisplay: none;に再度設定します。私slideToggle();は、次のように埋め込まれている:

$('.box-header').on('click', function() { 
    $(this).parent().toggleClass('folded').toggleClass('unfolded'); 
    $(this).next('div').stop().slideToggle(); 
    console.log('clicked'); 
}); 

JSFIDDLE DEMO

は、ウィンドウサイズが600PXの上にある間、ページをロードするための重要なデモを見て、問題を再現するためにスケールダウンよりも、ときに。時にはうまくいきます。

私には何が欠けていますか?また、リサイズイベント後にビューアビューポートに応じてスクリプトを強制終了して呼び出す方が良いでしょうか?

+2

があり、窓があなたのブレークポイントにリサイズされたときに 'click'イベントに複数回結合していること。 on( 'click') 'を試してみて、新しいclickイベントを追加する前にすべての' click'イベントをアンバインドしてください。 – Chris

+0

あなたの質問は不明で、あなたのコードはうまくいくようです。 – Ionut

+0

あなたの提案に感謝@chris、これはうまく動作します。私は他の人のためにそれを解決するためにマークするように答えとしてそれを挿入してください。 –

答えて

1

クリックイベントであれば入れてください:

$('.box-header').on('click', function() { 
    if ($(window).width() < 600) { 
     $(this).parent().toggleClass('folded unfolded'); 
     $(this).next('div').stop().slideToggle(); 
    } else { 
     //for other code here for medium+large screens 
    } 
    }); 

https://jsfiddle.net/5puqn9ts/1/

も、各

$(document).ready(function() { 

    $('body').on('click', '.mobile', function() { 
     $(this).parent().toggleClass('folded').toggleClass('unfolded'); 
     $(this).next('div').stop().slideToggle(); 
     console.log('clicked'); 
    }); 


    // init scripts for smartphone or desktops 
    var initScripts = function() { 
    if ($(window).width() < 600) { 
     $('.box-header').addClass('mobile'); 
    } 
    if ($(window).width() >= 600) { 
     $('.box-header').removeClass('mobile'); 
     /add class for medium screen then bind event to ti 
    } 
    } 
    initScripts(); 

    var id; 
    $(window).resize(function() { 
    initScripts() 
    }); 
}); 

にクリックイベントをバインドし、モバイルと大画面を切り替えるには、クラスを使用しますhttps://jsfiddle.net/75186j96/5/

-1

質問にお答えするには、 slideToggle()ターゲットを.box-contentに変更する必要があります。divではなく、.box-headerに切り替えが適用されます。また、あなたのクラストグルリングをバンドルすることもできます。

結果のコードは以下のようになります:

$('.box-header').on('click', function() { 
    $(this).parent().toggleClass('folded unfolded'); 
    $(this).next('.box-content').stop().slideToggle(); 
    console.log('clicked'); 
}); 

言われていること、これを行うのより良い方法があります。 あなたはこのように、.box-contentの外観に、あなたのクラスを結ぶことができます:

.box-content { 
    transition: height 300ms; 
    overflow: hidden; 
} 

.box.folded .box-content { 
    max-height: 0; 
} 

.box.unfolded .box-content { 
    max-height: 300px; 
} 
+0

提案に@johnnyに感謝します。あなたのコードにいくつかの承認がありますが(2つの 'toggleClass'ステートメントを組み合わせて)、悲しいことに問題は解決しません。ここで確認できます:https:// jsfiddle。net/75186j96/6/ @Chrisは、正しい解決策、 '.click'イベントの複数の呼び出しを発見しました。 –

+0

あなたが最初に尋ねた質問によれば、そのフィドルはあなたが期待していた通りに正確に働きます。しかし、ダウンボントは不要です。 Hey @johnny。 –

+0

申し訳ありませんが、jsfiddleで問題を再現できなかったと思います。私はあなたの答えでjsfiddleを開いて、問題の視覚的な説明を表示しようとしました:https://vid.me/LDH5 あなたの答えが問題を解決せず、私がダウンしたコードを変更するという事実のためそれを投票した(他人に誤解されないように)。あなたの答えを編集して下の票を修正できるようにしてください。あなたの努力と提案をお寄せいただきありがとうございます! –

0

あなたの関数は、呼び出しごとにイベントを設定します。この正しい選択肢を試してみてください:あなたが不足しているもの

var smartphoneFunctions = $('.box-header').on('click', function() { 
    $(this).parent().toggleClass('folded').toggleClass('unfolded'); 
    $(this).next('div').stop().slideToggle(); 
    console.log('clicked'); 
}); 

https://jsfiddle.net/75186j96/8/

関連する問題