14

所以,

我最近一直在研究一些 html/javascript/css,以便为我的学生创建一个在线表格,以查看详细信息、分数和各种信息,但我遇到了障碍,不确定如何做我正在尝试的事情去做。

我将所有这些都发布在一个线程中的原因是因为我认为其中一些可能会发生冲突并导致以前的编辑无法运行......

我意识到这里有很多问题,不要指望有人编码整个事情,我只是在寻找一些帮助/片段/想法,并且非常感谢那些有评论/描述的人,这样我就可以继续学习和改进:)


更新 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

8

更新 2013 年 11 月 13 日 @ 格林威治标准时间 12:09
仅仅因为你对你的帖子做了一个完整的编辑,我也做了同样的事情!不需要那些数据!
但是,我已经回答了您已经提出的很多问题!
最新:http: //jsfiddle.net/sijav/pwv7u/1/

  • 我已经简单地完成了,只需使用打击代码:(它被缩小了!)

    $("#PreviousClass").click(function(){if(currentClass>1){currentClass--;$('.class-selector').val("CLASS"+currentClass);scrollToAnchor("CLASS"+currentClass);}});
    $("#NextClass").click(function(){if(currentClass<6){currentClass++;$('.class-selector').val("CLASS"+currentClass);scrollToAnchor("CLASS"+currentClass);}});
    

您还需要将 Next Class 和 Previous class ID 设置为正确的 ID 并删除 href!

  • 您需要overflow: auto;从容器类中删除!然后将 $("#container") 替换为$("body")向左/向右滚动按钮!所以:

    #container {
    margin: 0 auto;
    /*overflow: auto;*/
    padding: 80px 0;
    width: 100%;
    }
    

    和:

    $("a.def").click(function () {
            $('body').animate({
                "scrollLeft": "-=204"
            }, 200);
    });
    
    $("a.abc").click(function () {
        $("body").animate({
                "scrollLeft": "+=204"
            }, 200);
    });
    
  • 这是因为你只是把它放在footer1 下!你把它转发它会正确显示,为什么不放一个半透明的黑色背景?background: rgba(0, 0, 0, 0.58);

  • 在上述更改之后,我没有看到任何问题!

  • 好主意......让我们看看......:

  • 再次,我已经给了你如何两次 ajax 的代码!再一次,你不需要把它们放在 json 格式中!html 格式将非常适合您想做的事情!只需将它们保存为 class1.html、class2.html、class3.html 等,然后获取正确的 html 并将表格插入容器中而不是当前表格!代码是:

    $.ajax({
    url: "class1.html", //this can be anything! better to use a variable like "class"+currentClass
    dataType: "HTML",
    error: function(){alert("Error on communicate to server"}, //what to do on error
    success: function(html){$("#container").html(html)}, //replace the container on success
    });
    

简单吧?你可以http://fiddle.jshell.net/pwv7u/show/输入 url 来测试,看看会发生什么?!

  • 为什么不把这些选项放在一个 html 文件中并像我上面提到的那样得到它?!
  • 好吧,我已经在上面告诉你了,
  • $("#container").html(SomeHtmlString)用当前容器更改整个容器
  • 你可以拥有……(等等)…… setInterval(functionThatIncludeAjaxName,milisecond)(我之前告诉过你)
  • 您可以从他们那里获取所有数据并使用“+”附加您想要的内容,然后$("container").html(TheAppendedHTMLString)
  • 你可以有这样的东西=> http://jsfiddle.net/sijav/WJ8Js/
  • 一件事,对于移动视图,您可以使用一些根据 body 宽度缩放整个网页的 api!它在平板电脑和移动设备上非常有用。

祝你好运,如果你不能正确理解我的答案或者只是有新问题,请随时询问。

于 2013-11-10T12:18:17.217 回答
6

前言

为了涵盖您的所有问题,我尝试在所有答案中包含演示。不幸的是,我只是一个人,我无法为所有答案创建演示。如果有人觉得他有什么要贡献的,请随时发表评论或编辑。

更新

为了回应@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中的课程或学校课程中的课程,但是如果是后者,那么您可以在每个td要滚动到的位置上放置一个id:

      <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.

    有几种方法可以做到这一点,这是其中之一:

     // 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:nowrapth/td元素

    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样式并且样式将持续存在。或者,如果它具有类,则在覆盖行 chack 之前,如果有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 和代码根据对下拉列表的选择来显示/隐藏 CLASSes

#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(..) and 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 语句来检查你是否试图增加 margin-left 太多。

 $("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 回答