14

それで、

最近、生徒が詳細、スコア、さまざまな情報を表示するためのオンライン テーブルを作成するために、いくつかの html/javascript/css に取り組んでいますが、レンガの壁にぶつかり、自分が試みていることを行う方法がわかりません。する。

これらすべてを 1 つのスレッドに投稿する理由は、これらのいくつかが競合し、以前の編集が機能しなくなる可能性があると思われるためです...

ここには多くの質問があり、誰かがすべてをコーディングすることを期待していないことを認識しています。私はいくつかのヘルプ/スニペット/アイデアを探しています。学習と改善を続けます:)


更新 13/11/2013 @ 02:43 GMT

最新: http://jsfiddle.net/pwv7u/

  • Next Class | Previous Classドロップダウンが機能するのと同じように、クラスに出入りするためのサイクルボタンになろうとしています。
  • ページの一番下にあったスクロールバーが横幅が変わって消えてしまった…
  • 下部のフッターがモバイル デバイスで正しく表示されず、[左にスクロール] ボタンと [スクロール] ボタンがモバイル デバイスでまったく表示されません。
  • 左スクロールボタンがクリックできない
  • ページを更新すると、水平スクロール位置が左端にリセットされます(これはスクロールバーに関連していると確信しています)

  • ロード/リフレッシュに関しては、現在のオプションがほぼそこにあるため、別の投稿を作成する必要があると思いますが、完全ではないため、理想的に機能させたい方法を以下に例を示します。

    • main.htmlクラスの詳細は含まれません: http://pastebin.com/raw.php?i=HwXM67up
    • 「オプション」(ドロップダウン)は、何らかの方法でjsonファイルをポーリングして、利用可能なクラスのリストを収集します
    • 「オプション」(ドロップダウン)には、個々の学校のクラスごとのオプションと、「すべて更新」および「すべて非更新」のオプションがあります。
    • 個々の学校のクラスを選択すると、その特定の学校のクラスのみがページにインポートされます。
    • 別の学校のクラスを選択すると、古い学校のクラスが破棄され、新しく選択された学校のクラスがインポートされます。
    • 個々の学校のクラスは定期的に json ファイルをポーリングして、その学校のクラス データの更新/変更を確認し、変更/更新時に再描画/再インポートします。
    • 「すべての更新」を選択すると、すべての学校のクラスがインポートされ、json ファイルが定期的にポーリングされて、学校のクラスの更新/変更が確認されます (可能であれば、変更/更新された学校のクラスのみを更新します)。ただし、すべてのクラスがページに表示されます。
    • 「All Non-Updating」を選択すると、上記と同じことが行われますが、json ファイルをポーリングして更新する必要はありません。
  • データを次のようなブロックに分割できます: http://pastebin.com/raw.php?i=MRpjvJp0 (最初のブロックの例) かなり簡単に、正しいタイトル ([オプション] ドロップダウンで使用されるタイトル) を付けることができます。ただし、それらをjson形式にするには
4

4 に答える 4

6

序文

すべての質問をカバーするために、すべての回答にデモを含めようとしました。残念ながら、私は 1 人であり、すべての回答のデモを作成することはできませんでした。誰かが何か貢献できると感じた場合は、お気軽にコメントまたは編集してください。

アップデート

@DennisSylvian の更新された質問への回答として、ここに私の更新があります。

回答

    1. オーバーフローをスクロールするには、次を使用することをお勧めします。

      $('.table-wrapper')[0].scrollLeft += 50;
      

      DEMO here

    2. css を使用して要素を簡単な方法で配置したい場合は、親を次のように定義し、position: relative;各要素に aposition: absolute;を指定して、それらを各コーナーに「投げる」ことができます。

      .controller-wrapper { 位置: 相対; } .top-left, .top-right, .bottom-left, .bottom-right { 位置: 絶対; } .top-left { 上: 0; 左: 0; } .top-right { トップ: 0; 右: 0; } // ...

    更新DEMO here

    1. スクロール機能に任意のオフセットを追加できます。

      var offset = 80; // Or any other calculation
      $('html,body').animate({
          scrollTop: aTag.offset().top + offset
      }, 1);
      
    2. css のクラスまたは学校のクラスのクラスを意味するかどうかは完全にはわかりませんが、後者の場合は、スクロールしたい.classそれぞれに id を配置できます。td

      <td id="class1" class="scrollto">Title</td>
      <!-- ... -->
      <td id="class2" class="scrollto">Title</td>
      

      次に、次を使用してこれらの ID からリストを作成できます。

      var anchorList = [];
      
      $('.scrollto').each(function(){
      
        anchorList.push( '<option value="'+ this.id +'">'+ this.id +'</option>' );
      
      });
      
      // This is an empty select menu
      $('#anchor-list')
        .append( anchorList.join('') )
        .change(function(){
      
          scrollToAnchor( $(this).val() );
      
        });
      

      scrollToAnchorこれには、関数を少し変更する必要があります。

      // Put this line
      var aTag = $('#' + aid);
      
      // Instead of this one:
      var aTag = $("a[id='" + aid + "']");
      

      DEMO here

  1. ブラウザーのレンダリング エンジンは、最大のセルの内容に基づいて列の値を計算しないため、これは少し注意が必要です。

    プラグインを使用する必要があります (これを作成するためのコードは、この回答でカバーできる範囲をはるかに超えているため)、または列データのロジックに基づいて幅を手動で設定する必要があります。つまり、名前が含まれる列がある場合は、最初のtd幅をリスト内の最も長い名前に手動で設定できます。

    更新: @sijav が提案する別のオプションは、次を使用することです。

    table td { white-space: nowrap; }
    
  2. 更新

    ドロップダウンと を使用して、単一のページをプルできます$.get()

    <select id="class-list">
      <option value="1">Class 1</option>
    </select>
    

     

    $('#class-list').change(function(){
      $.get('/server/data/class', { class: $(this).val() }, function(data){
        $('#container').html( data );
      });
    });
    

    上記の例では、サーバー側のコードは をレンダリングhtmlし、dom に挿入する準備が整ったテーブルを送信します。すべてのテーブルがオンザフライで作成されるため、イベント バブリング (ajax 呼び出しからレンダリングされない要素にイベントをバインドする) を使用する必要があります。

    たとえば、ハイライト行ボタンは次のように記述する必要があります。

     $('#container').on('click', 'tr', function(){
       var $this = $(this);
    
       $this
         .addClass('highlight')
         .siblings('tr')
         .removeClass('highlight');
     });
    

    データは必ずしもJSONフォーマットである必要はありません (ただし、将来、データで何か他のことを行う必要がある場合は、より機敏になります)。

    HTMLサーバー コードから JSON の代わりにデータを出力できます。

    データが更新されているかどうかを確認するには、サーバー コードが出力する必要があるフラグをポーリングできます。

    // Poll every minute
    setTimeout(function(){
    
      // Check for changed content
      $.get('/server/data/changed', function( data ){
    
        // Server indicates content has changed get the content and update
        if ( data.flag ){
    
          $.get('/server/data/get', function( data ){
            updateHtml( data );
          });
    
        }
    
      });
    }, 1000 * 60);
    

    上記のコードは、コンテンツを更新するためのポーリング手法の例です。

  3. クリックされた行を「記憶」するには、 を使用できますlocalStorage

    これを行うにはいくつかの方法があります。これはその 1 つです。

     // On page ready
     jQuery(function( $ ){
    
       var rowIndex = localStorage.getItem('rowIndex');
    
       if ( rowIndex ) {
    
         $( 'table tr' ).eq( rowIndex ).addClass('highlight');
    
       }
    
       // Save the row to localstorage based on it's index in the table
       var saveRow = function ( index ) {
    
         localStorage.setItem( 'rowIndex', index );
    
       };
    
       // Highlight the row and save it
       $( 'table tr' ).click(function(){
    
         var $this = $(this);
    
         $this
           .addClass('highlight')
           .siblings('tr')
           .removeClass('highlight');
    
         saveRow( $this.index() );
    
       });
    
       // On page exit/reload/change check for highlighted row and "save" it to localstorage
       $(window).on('beforeunload', function(){
    
         saveRow( $('.highlight').index() );
    
       });
    
     });
    

    DEMO here

于 2013-11-10T13:17:38.293 に答える
6

見てみましょう(更新のために下にスクロールします

( http://jsfiddle.net/u7UkS/2/のデモ)

  1. 左右のテーブル スクローラー (オーバースクロールを修正しますか?)の代わりに
    をアニメーション化する必要があります。許容範囲を超えてスクロールできないため、余分な値は自動的に処理されます。 scrollLeftmargin

    $("a.abc").click(function () {
        $('#container').animate({
            "scrollLeft": "-=204"
        }, 200);
    });
    
    $("a.def").click(function () {
        $("#container").animate({
            "scrollLeft": "+=204"
        }, 200);
    });
    
  2. アンカーサイクラー/各クラスにジャンプするドロップダウンリスト?
    要素をループし、a要素を取得しidを追加できselectます。次に、イベントを処理クラスchangeで選択した位置にアニメーション化しますscrollToAnchor

    <select class="class-selector">
        <option value="">-select class-</option>
    </select>
    

    // gather CLASS info
    var selector = $('.class-selector').on('change', function(){
        var id = this.value;
        if (id!==''){
            scrollToAnchor(id);
        }
    });
    $('a[id^="CLASS"]').each(function(){
        var id = this.id,
            option = $('<option>',{
                value: this.id,
                text:this.id
            });
        selector.append(option);
    });
    
  3. 列の自動サイズ調整? /要素
    設定white-space:nowrapするthtd

    td, th {
        white-space:nowrap;
    }
    
  4. JSON からのクラス セクションの読み込み/更新。
    このためのコードが提供されていません。だから私はそれを行う方法を説明します..
    繰り返しのAJAXリクエストにはタイムアウトを使用し、その結果を処理したら新しいものを起動します

    function handleData(data){
       //loop over data and edit the DOM
       $.each(data, function(index, item){
         // variable item refers to the current CLASS of the iteration
         // assuming that the JSON is an array of CLASS groups describing the rows..
    
         //find the DOM section with the current class info and update data..
       });
       setTimeout(checkData, 30000);
    }
    function checkData(){
        $.getJSON('the-url-to-your-json', handleData);
    }
    // initiate the first timeout
    setTimout(checkData, 30000); // 30000 ms is 30sec.
    
  5. クッキー?選択した行を記憶して復元
    するには Cookie を使用する必要はありません。手順 4 で、行全体を削除して再挿入するのではなく、td要素の内容を編集します。このようにして、trはその状態を維持しclass、スタイリングは持続します。または、クラスがある場合は行を上書きする前に、そのselected場合は挿入しようとしている行に追加します。

http://jsfiddle.net/u7UkS/2/のデモ


scrollToAnchorまた、見出しを説明するために、scrollTop から 80 を編集して削除しました

function scrollToAnchor(aid) {
    var aTag = $("a[id='" + aid + "']");
    $('html,body').animate({
        scrollTop: aTag.offset().top - 80
    }, 1);
}


アップデート

質問への更新から、すべてのクラスを常に表示したり、すべてを更新したりする必要はないと仮定します

このcssとコードを使用して、ドロップダウンへの選択に応じてクラスを表示/非表示にすることができます

#container tbody, #container thead {
    display:none;
}
#container tbody.current {
    display:table-row-group;
}
#container thead.current {
    display:table-header-group;
}

    var classSelector = $('.class-selector');

    // gather CLASS info
    classSelector.on('change', function () {

        var id = this.value;
        $('#container').find('thead, tbody').removeClass('current');
        if (id !== '') {
            //scrollToAnchor(id);
            var group = $('#' + id).closest('thead');
            group.add(group.next('tbody'))
                .addClass('current');
        }

        // since we changed the current CLASS, initiate a checkdata() so that we can update as soon as possible.. 
        checkData();
    }).trigger('change');

これで、AJAX リクエストを実行するときに、サーバーにデータを送信して、返される情報を制限できます。だからcheckData私たちは

function checkData() {
        var currentId = classSelector.val();

        if (currentId !== ''){
            // Start AJAX request
            alert('starting ajax request for ' + currentId);
            // change /echo/json/ with the url to your json
            // delay should be removed, it just for jsfiddle..
            jsonRequest = $.getJSON('/echo/json/', {'delay':2,'class' : currentId}, handleData);        
        }
    }

handleData

function handleData(data) {
    alert('handling data');
    //loop over data and edit the DOM        
    var classBody = $('#container').find('tbody.current');
    $.each(data, function (index, item) {
        // variable item refers to the current CLASS of the iteration
        // assuming that the JSON is an array of CLASS groups describing the rows..

        // populate classBody with the JSON data

    });
    jsonTimeout = setTimeout(checkData, 10000); // change the 10000 to whatever you want.. i set it to 10 seconds to see the repeating..
}

jsonTimeout = setTimeout(..) とに気付くでしょうjsonRequest = $.getJSON(..)。それらを変数に保存して、現在の CLASS を変更したときにそれらを中止して過剰な処理を回避できるようにします。

これは、追加することによって行われます

    if (jsonTimeout) clearTimeout(jsonTimeout);
    if (jsonRequest) jsonRequest.abort();

ドロップダウンのchangeハンドラーに。

http://jsfiddle.net/u7UkS/4/で更新されたデモ

于 2013-11-10T14:40:30.477 に答える
3

1) マウスでスクロールするときのようにページをスクロールしていないことに注意する必要があります。実際には margin-left を操作していますが、この動作により、非常に大きな値が与えられます。それから、あなたが言ったようです。テーブルと画面の端の間に大きなスペースがあります。これを解決するには、余白を増やしすぎていないかどうかを確認する if ステートメントを追加する必要があります。

 $("a.def").click(function() {
    $("#gradient-style").each(function(){
        var margin =$(this).css("margin-left");

        if(margin > -204)
             $(this).animate({"margin-left":"+=204px"},200);
        else
             $(this).animate({"margin-left":"+=" +(-margin)},200);
    });
});

5)組み込みの JavaScript 機能であるlocalStorage変数を使用できます。任意の変数を簡単に定義して、セッションで使用できます。例を次に示します。

 localStorage.numberOfRow =1;
 console.log(localStorage.numberOfRow);     //1
于 2013-11-08T18:43:44.633 に答える