Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/430.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript jQuery对象和循环的问题_Javascript_Jquery Plugins_Dom Manipulation_Jquery - Fatal编程技术网

Javascript jQuery对象和循环的问题

Javascript jQuery对象和循环的问题,javascript,jquery-plugins,dom-manipulation,jquery,Javascript,Jquery Plugins,Dom Manipulation,Jquery,我现在正在创建一个jQuery插件,它将变成了一个非常漂亮的下拉菜单,不过我有一点问题,我可以通过这样做在页面上获得选择的选项 var self = $(this); name = self.attr('name'); select_options = $(this).children(); // an array so that we can related options together sorted_options = []; //loop thr

我现在正在创建一个jQuery插件,它将
变成了一个非常漂亮的下拉菜单,不过我有一点问题,我可以通过这样做在页面上获得选择的选项

var self = $(this);
    name = self.attr('name');
    select_options = $(this).children();
    // an array so that we can related options together
    sorted_options = [];
    //loop through the options sorting them into the array as we go.
    for(i=0;select_options.length>i;i++) {
        sorted_options.push({
            'value': select_options.eq(i).val(),
            'name': select_options.eq(i).text()
        });
    }
因此,我获取选项,然后将它们排序到一个数组中,当我将这个数组推到控制台时,我得到以下结果:

[Object { value="0", name="I'm looking for..."}, Object { value="1", name="actors"}, Object { value="2", name="presenters"}, Object { value="3", name="voice overs"}]
[Object { value="0", name="Skill"}, Object { value="1", name="actors"}, Object { value="2", name="presenters"}, Object { value="3", name="voice overs"}, Object { value="4", name="dancers"}, Object { value="5", name="accents"}, Object { value="6", name="film"}, Object { value="7", name="tv"}]
[Object { value="0", name="Gender"}, Object { value="1", name="male"}, Object { value="2", name="female"}]
options.splice(0, 1);
我的第一个问题是如何从数组中删除所有值为0的内容,因为如果用户告诉我,我的插件将替换下拉列表中的第一个条目。在我对如何获得选项进行一些更改之前,我使用了以下方法

[Object { value="0", name="I'm looking for..."}, Object { value="1", name="actors"}, Object { value="2", name="presenters"}, Object { value="3", name="voice overs"}]
[Object { value="0", name="Skill"}, Object { value="1", name="actors"}, Object { value="2", name="presenters"}, Object { value="3", name="voice overs"}, Object { value="4", name="dancers"}, Object { value="5", name="accents"}, Object { value="6", name="film"}, Object { value="7", name="tv"}]
[Object { value="0", name="Gender"}, Object { value="1", name="male"}, Object { value="2", name="female"}]
options.splice(0, 1);
但是选项已经不存在了,所以我不能只删除每个数组的第一个条目,其次我需要将值和名称附加到新的下拉列表中,但是我在这方面遇到了问题

我现在用这段代码来附加值

for(i=0;sorted_options.length>i;i++) {
    $('.dropdown dd ul').append('<li <a href="#"><span class="option">'+ sorted_options[i]['value'] + '</span><span class="value">' + sorted_options[i]['name'] + '</span></a></li>');
}
for(i=0;排序的_选项.length>i;i++){

$('.dropdown dd ul')。append('您可以从列表中筛选,所有具有
值的对象都以这种方式等于0:

/**
 * Remove from a list all object having `obj.value` == value (ex. 0).
 *
 * @param {Object} value The value to avoid.
 * @param {Array:Object} A list of objects.
 * @return {Array:Object} The new filtered Array.-*emphasized text*
 */
function filterByValue(value, list) {
   var newlist = [],
       obj,
       max,
       i;

   for (i = 0, max = list.length; i < max; i += 1) {
      obj = list[i];

      if (obj.value !== value) {
         newlist.push(obj);
      }
   }
}

var newList = filterByValue(0, list);
然后,您必须将右侧的
选项
列表附加到相应的
选择

var uls = document.getElementsByClassName("dropdown").
                  .getElementsByTagName("dd").
                  .getElementsByTagName("ul");

for (var i = 0, max = uls.length; i < max; i += 1) {
   ul = uls[i];

   sortedOptions = sortedOptions[i];

   ul.innerHTML = '<li <a href="#"><span class="option">'+ sortedOptions[i]['value'] + '</span><span class="value">' + sortedOptions[i]['name'] + '</span></a></li>';
}
var-uls=document.getElementsByClassName(“下拉列表”)。
.getElementsByTagName(“dd”)。
.getElementsByTagName(“ul”);
对于(var i=0,max=uls.length;iul.innerHTML='对于第一个问题,可以使用函数筛选数组的元素

var filteredArray = $.grep(rawArray, function(v,i) {
    return (v.value === '0' ? null : v);
});
对于你的第二个问题,我可能会使用以下方法(如果我理解正确的话):

var模板=$(
“
  • ” ),dropdown=$('.dropdown dd ul'); //请注意,$.grep和$.的参数都是反向的 $。每个(过滤器阵列,函数(i,v){ //将第(i)个对象添加到第(i)个下拉列表中 下拉式.eq(i).追加( template.clone() .find('.option').text(v.value).end() .find('.value).text(v.name).end() ); });
    所以基本上:

  • jQuery内置了过滤和迭代原始JS数组的功能
  • 缓存要插入到DOM中的HTML模板(这样jQuery就不必在每次将其添加到文档时都进行整个“选择”过程)
  • 出于同样的原因,也缓存下拉选择

  • 非常感谢您的回答,我已经实现了它,但是我无法让它正常工作,我已经创建了一个JSFIDLE,您可以在这里看到,