3

jQueryとCSS3でコンテンツスライダーを作成しようとしています。

これは私のコードです。ページはChromeで正常に動作し、Firefoxでもほぼ正常に動作し、IEでも機能します(ただし、ほとんど効果はありません)。

しかし、iPadSafariでは機能しません...

ページのiPadSafariへの読み込みが完了すると、ページの点滅が始まり(継続的に、終了することはありません)、ブラウザがクラッシュします。

しかし、スライダーのどの部分に問題があるのか​​わかりません。また、問題が正確に何であるかわかりません...

コードが乱雑な場合は申し訳ありませんが、問題が何であるかがわからなかったため、簡単な例を作成することはできません...


アップデート

私のコードにはwindow.resizejQueryイベントがあり、CorrectPages()Insideを呼び出しています。

私はそのイベントの最初の行にこのコードを置きました:alert("windowResize" + window.innerWidth + " , " + window.innerHeight);

PCでは、ウィンドウのサイズを変更するまでアラートは表示されません。しかしiPadでは、ページが読み込まれた後にアラートが開始されました。iPadのメッセージは次のとおりです。

windowResize1767 , 1074
windowResise1767 , 2078
windowResize2099 , 4136
windowResize2099 , 8355
windowResize2099 , 17004
windowResize2099 , 34735
...

アップデート2

ahmadaliが言ったように、今は以前の問題を修正しました。これは私の固定コードです。しかし、今、別の問題があります。ページが読み込まれると、Safariは間違ったwindow.innerWidthとを通知しwindow.innerHeightます。

ページが読み込まれると、しばらくは正しいように見えますが、その後変更されます。これはしばらくした後の結果です: ここに画像の説明を入力してください

あなたの考えは何ですか?

4

2 に答える 2

3

マハディ、

明らかなことは何もわかりませんが、効率が問題になる可能性があります。大量の改善が可能です。

ここにいくつかの一般的な指針があります:

  • グローバルbeginXなどをクロージャbeginY内に配置します。$(document).ready(function(){...})
  • DOMノードを見つける必要性を最小限に抑えます-jQueryオブジェクトをキャッシュし、可能な場合はメソッドチェーンを使用します。
  • .removeclass()は、スペースで区切られた複数のクラスを削除します。個別のステートメントは必要ありません
  • $("#d_page" + i + " #overlay")心配しています。IDは一意である必要があるので、なぜそうではないのです$("#overlay")$(".... .overlay")
  • jQueryメソッド.eq()を使用.not()して、いくつかの難しい作業を行います。
  • ページにclass="page"を付けます。としましょう$pages = $(".page")、それからに$("#d_page" + i.toString())単純化する必要があり$pages.eq(i)ます。このタイプの多くの式は単純化されます。

進歩的な改善により、私は機能correctPages()を約170行以上からわずか26行に減らすことができました。

これは私が最終的に得たものです:

function correctPages() {
    var $pages = $(".page"),//relies on pages having class="page"
        prefix = (isLandscape(window.innerWidth, window.innerHeight)) ? 'd_landscape_activepage_' : 'd_portrait_activepage_',
        classes = ["whitebackground", prefix+"1", prefix+"2", prefix+"3", prefix+"4"].join(' '),
        $np = [$pages.eq(currentPage), $pages.eq(nextPage(currentPage)), $pages.eq(nextPage(nextPage(currentPage))), $pages.eq(nextPage(nextPage(nextPage(currentPage))))];
    $pages.removeClass(classes);
    $pages.find(".overlay").css({top:0, opacity: 0.6});//relies on overlays having class="overlay"
    $pages.not($np[0]).not($np[1]).not($np[2]).addClass(prefix+"1");
    $pages.not($np[2]).removeClass(prefix+"5").addClass("transition");
    $pages.eq(prevPage(currentPage)).addClass(prefix+"2");
    $np[0].addClass(prefix+"3").find(".overlay").css("opacity", "0.1");
    $np[1].addClass(prefix+"4");
    $np[2].addClass(prefix+"5");
    $np[isNext ? 2 : 3].removeClass("transition");
    setTimeout(function() {
        $np[2].addClass("transition");
    }, 100);
    $(".articlecontent").css("background", "rgba(250,250,250,0)");
    $(".d_landscape_activepage_3 .articlecontent").css("background", "rgba(250,250,250,1)");
    $(".d_portrait_activepage_3 .articlecontent").css("background", "rgba(250,250,250,1)");
    correctDivs();
    $("#d_pagefix").css("opacity", "0");
    setTimeout(function() {
        $np[0].find(".overlay").css("top", "10000px");
    }, 400);
}

このコードはテストされていないため、100%正確ではない可能性がありますが、どのように改善できるかについての手がかりが得られるはずです。

編集

サイズ変更イベントの永続的な再トリガーの回避策として、サイズ変更ハンドラーを動的にデタッチおよび再アタッチしてみてください。

交換 :

$(window).resize(function() {
    correctPages();
});

と ;

function attachResizeHandler() {
    $(window).on('resize', resizeHandler);
}
function resizeHandler() {
    $(window).off('resize');
    correctPages();
    setTimeout(attachResizeHandler, 600);
}

正しいページまたはチェックハッシュコードの最長タイムアウトよりもわずかに長いため、600ミリ秒を選択しました。不要なサイズ変更イベントをトリガーするものによっては、より少ないコストで解決できる場合があります。

コードの他の場所で、:のすべてのインスタンスを置き換えます。

`correctPages();` 

と :

`resizeHandler();`

ページの読み込み時にが呼び出されると、の最初のアタッチメントがresizeHandler発生します。checkhash();

于 2012-08-17T01:52:40.443 に答える
2

さて、私とマフディは iPad でコードを何度もテストし、最終的に問題がJqueryMobile. 私はこのコードを持っていました

$(window).resize(function() {
  $('#log').append('<div>Handler for .resize() called.</div>'+$(window).height()+","+$(window).width());
});​

iPadで参照を追加せずに実行するとJqueryMobile、ページは変更されず、ページ(コード)には何も追加されません。

しかしJqueryMobile、iPad に参照を追加して実行すると、常に新しいページ サイズ(コード)が追加されました。

JqueryMobileこれは、マルチ プラットフォームの Web プログラマーにとって非常に重要なバグだと思います。ここに報告しました。

于 2012-08-17T04:48:38.733 に答える