Jquery Mobile - 使用数据预填充选择列表

Posted

技术标签:

【中文标题】Jquery Mobile - 使用数据预填充选择列表【英文标题】:Jquery Mobile - Pre populating Select List with Data 【发布时间】:2015-06-16 03:24:55 【问题描述】:

我目前正在尝试创建一个基本的热量计时器功能。我每天有六个开关,分别显示小时、分钟和温度。我的知识非常有限,为了帮助我继续前进,我在这个网站上做了很多黑客和捏造的事情。

以我有限的编程知识创建东西的最基本方法是使用 Jquery Mobile Select Widget。

我通过 html 成功创建了这一切,但我的代码非常庞大,一天 24 小时,分钟间隔为 5 分钟,提供 12 分钟选项和 35 个温度范围选项。

一旦我让它工作起来,我就四处寻找减少代码大小并通过 javascript 重复的方法。

我发现这个http://jsfiddle.net/qsafmw5g/1/ 非常好,它帮助我实现了如何多次加载数据。

var data = ["chapterId":1,"chapterName":"First","chapterId":2,"chapterName":"Second"];

$(data).each(function() 
  var option = $('<option />');
     option.attr('value', this.chapterId ).text(this.chapterName );
     $('#comboChapters').append(option);
);

$('#comboChapters').selectmenu('refresh', true);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.10.0/jquery.min.js"></script>
<select name="comboChapters" id="comboChapters" data-native-menu="false">
</select>

从那以后我创建了自己的代码(仍然很粗糙),但现在我的软件只将值加载到最后一个开关(数字 6),而将其他五个开关留空。

我试图减少我的代码,只显示星期一的六个开关组并删除我的其他东西。

JSFiddle 这里https://jsfiddle.net/adonegan/3yx2p7rf/

// Data Setup for Heater Controls

var hour_data = [
  "optionId": 0,
  "optionValue": "00"
, 
  "optionId": 1,
  "optionValue": "01"
, 
  "optionId": 2,
  "optionValue": "02"
, 
  "optionId": 3,
  "optionValue": "03"
, 
  "optionId": 4,
  "optionValue": "04"
, 
  "optionId": 5,
  "optionValue": "05"
, 
  "optionId": 6,
  "optionValue": "06"
, 
  "optionId": 7,
  "optionValue": "07"
, 
  "optionId": 8,
  "optionValue": "08"
, 
  "optionId": 9,
  "optionValue": "09"
, 
  "optionId": 10,
  "optionValue": "10"
, 
  "optionId": 11,
  "optionValue": "11"
, 
  "optionId": 12,
  "optionValue": "12"
, 
  "optionId": 13,
  "optionValue": "13"
, 
  "optionId": 14,
  "optionValue": "14"
, 
  "optionId": 15,
  "optionValue": "15"
, 
  "optionId": 16,
  "optionValue": "16"
, 
  "optionId": 17,
  "optionValue": "17"
, 
  "optionId": 18,
  "optionValue": "18"
, 
  "optionId": 19,
  "optionValue": "19"
, 
  "optionId": 20,
  "optionValue": "21"
, 
  "optionId": 22,
  "optionValue": "22"
, 
  "optionId": 23,
  "optionValue": "23"
];

var min_data = [
  "optionId": 0,
  "optionValue": "00"
, 
  "optionId": 1,
  "optionValue": "05"
, 
  "optionId": 2,
  "optionValue": "10"
, 
  "optionId": 3,
  "optionValue": "15"
, 
  "optionId": 4,
  "optionValue": "20"
, 
  "optionId": 5,
  "optionValue": "25"
, 
  "optionId": 6,
  "optionValue": "30"
, 
  "optionId": 7,
  "optionValue": "35"
, 
  "optionId": 8,
  "optionValue": "40"
, 
  "optionId": 9,
  "optionValue": "45"
, 
  "optionId": 10,
  "optionValue": "50"
, 
  "optionId": 11,
  "optionValue": "55"
];

var temp_data = [
  "optionId": 0,
  "optionValue": "0°c"
, 
  "optionId": 1,
  "optionValue": "1°c"
, 
  "optionId": 2,
  "optionValue": "2°c"
, 
  "optionId": 3,
  "optionValue": "3°c"
, 
  "optionId": 4,
  "optionValue": "4°c"
, 
  "optionId": 5,
  "optionValue": "5°c"
, 
  "optionId": 6,
  "optionValue": "6°c"
, 
  "optionId": 7,
  "optionValue": "7°c"
, 
  "optionId": 8,
  "optionValue": "8°c"
, 
  "optionId": 9,
  "optionValue": "9°c"
, 
  "optionId": 10,
  "optionValue": "10°c"
, 
  "optionId": 11,
  "optionValue": "11°c"
, 
  "optionId": 12,
  "optionValue": "12°c"
, 
  "optionId": 13,
  "optionValue": "13°c"
, 
  "optionId": 14,
  "optionValue": "14°c"
, 
  "optionId": 15,
  "optionValue": "15°c"
, 
  "optionId": 16,
  "optionValue": "16°c"
, 
  "optionId": 17,
  "optionValue": "17°c"
, 
  "optionId": 18,
  "optionValue": "18°c"
, 
  "optionId": 19,
  "optionValue": "19°c"
, 
  "optionId": 20,
  "optionValue": "21°c"
, 
  "optionId": 22,
  "optionValue": "22°c"
, 
  "optionId": 23,
  "optionValue": "23°c"
];


$(hour_data).each(function() 
  var option = $('<option />');
  option.attr('value', this.optionId).text(this.optionValue),
    $('#mon_hour_timer_one').append(option);
  $('#mon_hour_timer_two').append(option);
  $('#mon_hour_timer_three').append(option);
  $('#mon_hour_timer_four').append(option);
  $('#mon_hour_timer_five').append(option);
  $('#mon_hour_timer_six').append(option);
);

$(min_data).each(function() 
  var option = $('<option />');
  option.attr('value', this.optionId).text(this.optionValue);
  $('#mon_min_timer_one').append(option);
  $('#mon_min_timer_two').append(option);
  $('#mon_min_timer_three').append(option);
  $('#mon_min_timer_four').append(option);
  $('#mon_min_timer_five').append(option);
  $('#mon_min_timer_six').append(option);
);

$(temp_data).each(function() 
  var option = $('<option />');
  option.attr('value', this.optionId).text(this.optionValue);
  $('#mon_temp_range_one').append(option);
  $('#mon_temp_range_two').append(option);
  $('#mon_temp_range_three').append(option);
  $('#mon_temp_range_four').append(option);
  $('#mon_temp_range_five').append(option);
  $('#mon_temp_range_six').append(option);
);

$('#mon_hour_timer_one').selectmenu('refresh', true);
$('#mon_hour_timer_two').selectmenu('refresh', true);
$('#mon_hour_timer_three').selectmenu('refresh', true);
$('#mon_hour_timer_four').selectmenu('refresh', true);
$('#mon_hour_timer_five').selectmenu('refresh', true);
$('#mon_hour_timer_six').selectmenu('refresh', true);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.10.0/jquery.min.js"></script>
<!-- Heating Controls & Settings Page -->
<div id="heating" data-role="page">
  <div data-role="content">
    <div class="ui-field-contain">
      <fieldset data-role="controlgroup" data-type="horizontal">
        <legend>Switch1:</legend>
        <select name="mon_hour_timer_one" id="mon_hour_timer_one" data-mini="true"></select>
        <select name="mon_min_timer_one" id="mon_min_timer_one" data-mini="true"></select>
        <select name="mon_temp_range_one" id="mon_temp_range_one" data-mini="true"></select>
      </fieldset>
      <fieldset data-role="controlgroup" data-type="horizontal">
        <legend>Switch2:</legend>
        <select name="mon_hour_timer_two" id="mon_hour_timer_two" data-mini="true"></select>
        <select name="mon_min_timer_two" id="mon_min_timer_two" data-mini="true"></select>
        <select name="mon_temp_range_two" id="mon_temp_range_two" data-mini="true"></select>
      </fieldset>
      <fieldset data-role="controlgroup" data-type="horizontal">
        <legend>Switch3:</legend>
        <select name="mon_hour_timer_three" id="mon_hour_timer_three" data-mini="true"></select>
        <select name="mon_min_timer_three" id="mon_min_timer_three" data-mini="true"></select>
        <select name="mon_temp_range_three" id="mon_temp_range_three" data-mini="true"></select>
      </fieldset>
      <fieldset data-role="controlgroup" data-type="horizontal">
        <legend>Switch4:</legend>
        <select name="mon_hour_timer_four" id="mon_hour_timer_four" data-mini="true"></select>
        <select name="mon_min_timer_four" id="mon_min_timer_four" data-mini="true"></select>
        <select name="mon_temp_range_four" id="mon_temp_range_four" data-mini="true"></select>
      </fieldset>
      <fieldset data-role="controlgroup" data-type="horizontal">
        <legend>Switch5:</legend>
        <select name="mon_hour_timer_five" id="mon_hour_timer_five" data-mini="true"></select>
        <select name="mon_min_timer_five" id="mon_min_timer_five" data-mini="true"></select>
        <select name="mon_temp_range_five" id="mon_temp_range_five" data-mini="true"></select>
      </fieldset>
      <fieldset data-role="controlgroup" data-type="horizontal">
        <legend>Switch6:</legend>
        <select name="mon_hour_timer_six" id="mon_hour_timer_six" data-mini="true"></select>
        <select name="mon_min_timer_six" id="mon_min_timer_six" data-mini="true"></select>
        <select name="mon_temp_range_six" id="mon_temp_range_six" data-mini="true"></select>
      </fieldset>
    </div>
  </div>
</div>

我玩过第一个 jsfiddle 并意识到这也不允许我从那个函数加载多个选择。

是否有人好心帮助我展示如何使我的函数工作以填充我的所有列表。

【问题讨论】:

我应该指出我正在使用 Jquery Mobile 1.4.5 和 Jquery 2.1.3。但是 JsFiddles 在我必须选择的版本中复制了错误。 【参考方案1】:

欢迎使用动态页面创建! 如您所见,当您必须在代码中重复某些内容时,您知道可以以另一种方式完成。这是我的:

HTML

<div id="heating" data-role="page">
  <div data-role="content">
    <div class="ui-field-contain" id="content">
    </div>
  </div>
</div>

JavaScript

$(document).on("pageinit", "#heating", function(event)

    var switch_number = 6;

    var html = "";
    for (var s = 0; s != switch_number; s++)
    
        html += '<fieldset data-role="controlgroup" data-type="horizontal">';
        html += '<legend>Switch ' + s + ':</legend>';
        html += '<select id="mon_hour_timer_' + s + '" data-mini="true">';

        for (var h = 0; h != 24; h++)
            html += '<option value="' + h + '">' + h + '</option>';

        html += '</select>';
        html += '<select id="mon_min_timer_' + s + '" data-mini="true">';

        for (var m = 0; m != 60; m += 5)
            html += '<option value="' + m + '">' + m + '</option>';

        html += '</select>';
        html += '<select id="mon_temp_range_' + s + '" data-mini="true">';

        for (var t = 0; t != 24; t++)
            html += '<option value="' + t + '">' + t + ' &deg; C</option>';

        html += '</select>';
        html += '</fieldset>';
    

    $("#content").html(html);
    $("#content").trigger("create");
);

【讨论】:

Sga 非常感谢你,这远远超出了我的预期。您的代码对我来说非常清晰,非常感谢,因为我可以继续尝试将值输出到警报。我最终想继续使用类似于您的代码的内容,但是我发现一些答案的小步骤已经超出了我的想象,以至于我已经设法实现但无法修改,因此我还没有真正学到任何东西。再次感谢您的宝贵时间。 @AndyDonegan 你附加了相同的元素,而不是你应该.clone()它jsfiddle.net/3yx2p7rf/2 @Ciccolina,非常感谢你知道这也很有用。我刚刚很快完成了你的小提琴,因为它正在将所有值克隆到 Hour 值。 jsfiddle.net/adonegan/a0amsjeu 基于 Sga 的代码,我现在设法修改了数据输出,这大大减少了我的代码大小。这里:-jsfiddle.net/adonegan/vu7zLrz9我知道这不是教科书,但我在这次练习中学到了很多东西。

以上是关于Jquery Mobile - 使用数据预填充选择列表的主要内容,如果未能解决你的问题,请参考以下文章

通过php填充多个选择框jquery mobile

如何使用jquery预填充字段

使用本地 JSON 数据填充 jQuery Mobile ListView

使用本地 JSON 数据填充 jQuery Mobile ListView

在 jquery-mobile 中使用 ajax 数据填充页面并不总是有效

动态填充 jQuery Mobile 列表视图内容