jjzjj

javascript - 通过 Javascript 添加行后指定 ul li 结构

coder 2024-04-18 原文

有下拉列表,从列表中选择任何值后,它应该添加新行,例如:

现在我有:

Javascript

  $.fn.optionTest = function(opts) {
    var option = $.extend({}, $.fn.optionTest.defaults, opts);


    $(this).change(function() {
            option.holderObject=$(this);

      if (option.clearOnChange) {
        $(option.actionId).empty();
      }
      var val = $(this).val();
      if ($.fn.optionTest.isArray(val)) {
        $.fn.optionTest.parseArray(val, option);
      } else {
                var label =$(this).children("option:selected").eq(0).text();
        $.fn.optionTest.parseContent(val, option, label);
      }

      $('.' + option.removeLinkOptions.class).click(function(event) {
        $.fn.optionTest.removeRow(this, option);
        event.preventDefault();

      });


    $( "[type=date]" ).datepicker({
      monthNamesShort: $.datepicker.regional["en"].monthNames,
      changeMonth: true,
      changeYear: true,
      dateFormat: 'yy-mm-dd'
    });
      return this;
    });
  };
  $.fn.optionTest.isArray = function(val) {
    return Object.prototype.toString.call(val) === '[object Array]';
  };
  $.fn.optionTest.defaults = {
    clearOnChange: false,
    actionId: '#action',
    indexOptions: {
      class: 'field-style field-split25 align-left'
    },
    rowOptions: {
      id: 'option',
      class: 'endorsements',
      tag: 'ul'

    },
    STCWCodeOptions: {
      id: 'STCWCode',
      name: 'STCWCode',
      type: 'text',
      placeholder: 'STCW Code',
      size: 20,
      class: 'field-style field-split25 align-left'
    },
    CertNoOptions: {
      id: 'CertNo',
      name: 'CertNo',
      type: 'text',
      placeholder: 'Cert No.',
      size: 20,
      class: 'field-style field-split25 align-left'
    },
    PlaceofIssueOptions: {
      id: 'PlaceofIssue',
      name: 'PlaceofIssue',
      type: 'text',
      placeholder: 'Place of Issue',
      size: 20,
      class: 'field-style field-split25 align-left'
    },
    fromOptions: {
      id: 'from',
      name: 'from',
      type: 'date',
      placeholder: 'Date of Issue',
      size: 20,
      class: 'field-style field-split25 align-left'
    },
    toOptions: {
      id: 'to',
      name: 'to',
      type: 'date',
      placeholder: 'Date of Expire',
      size: 20,
      class: 'field-style field-split25 align-left'
    },
    labelOptions: {
      class: 'field-style field-split25 align-left'
    },
    removeLinkOptions: {
      class: 'removeRow',
      href: 'javascript:;'
    }
  };
  $.fn.optionTest.parseArray = function(vals, options) {
  var selectedOptions = options.holderObject.children("option:selected");
  console.log(selectedOptions.eq(0).html());
    $.each(vals, function(key, val) {
      $.fn.optionTest.parseContent(val, options,selectedOptions.eq(key).text());
    });
  };
  $.fn.optionTest.removeRow = function(elem, options) {
    var row = $(elem).parent().closest(options.rowOptions.tag);
    row.remove();
    $.fn.optionTest.updateRowIndex(options);
  };

$.fn.optionTest.updateRowIndex = function(options) {
    $("." + options.rowOptions.class).each(function(key,value) {
      var index = key+1;
      $(value).attr('rowdataid',index);
      $(value).children("."+options.indexOptions.class).html(index);
    });
  };

  $.fn.optionTest.createColumn = function(content) {
    var li = $('<li>');
    return li.append(content);
  }
  $.fn.optionTest.parseContent = function(val, options ,label) {

    var index = $('.' +    options.rowOptions.class).length+1;    


    var rowData = $.extend({}, options.rowOptions);
    var indexData = $.extend({}, options.indexOptions);

    rowData.rowDataId = index;    
    rowData.id = rowData.id + '-' + val;

    var STCWCodeData = $.extend({}, options.STCWCodeOptions);
    STCWCodeData.name = STCWCodeData.name + '-' + val;
    STCWCodeData.id = STCWCodeData.id + '-' + val;

    var CertNoData = $.extend({}, options.CertNoOptions);
    CertNoData.name = CertNoData.name + '-' + val;
    CertNoData.id = CertNoData.id + '-' + val;

    var PlaceofIssueData = $.extend({}, options.PlaceofIssueOptions);
    PlaceofIssueData.name = PlaceofIssueData.name + '-' + val;
    PlaceofIssueData.id = PlaceofIssueData.id + '-' + val;

    var DateofIssueData = $.extend({}, options.DateofIssueOptions);
    DateofIssueData.name = DateofIssueData.name + '-' + val;
    DateofIssueData.id = DateofIssueData.id + '-' + val;

    var DateofExpireData = $.extend({}, options.DateofExpireOptions);
    DateofExpireData.name = DateofExpireData.name + '-' + val;
    DateofExpireData.id = DateofExpireData.id + '-' + val;

    var fromData = $.extend({}, options.fromOptions);
    fromData.name = fromData.name + '-' + val;
    fromData.id = fromData.id + '-' + val;

    var toData = $.extend({}, options.toOptions);
    toData.name = toData.name + '-' + val;
    toData.id = toData.id + '-' + val;

    var labelData = $.extend({}, options.labelOptions);

    if ($('#' + rowData.id).length == 0) {
      var tag = "<" + rowData.tag + ">";
      delete rowData['tag'];
      var row = $(tag, rowData);      
      var id = $('<li>', indexData).html(index);  
      var label=$('<li>', labelData).html(label);
      var STCWCode = $.fn.optionTest.createColumn($("<input>", STCWCodeData));
      var CertNo = $.fn.optionTest.createColumn($("<input>", CertNoData));
      var PlaceofIssue = $.fn.optionTest.createColumn($("<input>", PlaceofIssueData));
      var DateofIssue = $.fn.optionTest.createColumn($("<input>", DateofIssueData));
      var DateofExpire = $.fn.optionTest.createColumn($("<input>", DateofExpireData));
      var from = $.fn.optionTest.createColumn($("<input>", fromData));
      var to = $.fn.optionTest.createColumn($("<input>", toData));
      var removeRow = $.fn.optionTest.createColumn($("<img>", options.removeLinkOptions).attr("src","https://speculativenonbuddhism.files.wordpress.com/2011/05/x.jpg"));
      row.append(label).append(STCWCode).append(CertNo).append(PlaceofIssue).append(from).append(to).append(removeRow);

      $(options.actionId).append(row);
    }
  };
/*});*/
//Running The Plugin 
/**
Here is the Options
{
    clearOnChange:false  , 
    actionId:'#action',
    rowOptions:{
    id:'option', 
    class:'personal-details3'
  },
  STCWCodeOptions: {
      id: 'STCWCode',
      name: 'STCWCode',
      type: 'text',
      placeholder: 'STCW Code',
      size: 20,
      class: 'personal-details3'
    },
    CertNoOptions: {
      id: 'CertNo',
      name: 'CertNo',
      type: 'text',
      placeholder: 'Cert No.',
      size: 20,
      class: 'personal-details3'
    },
    PlaceofIssueOptions: {
      id: 'PlaceofIssue',
      name: 'PlaceofIssue',
      type: 'text',
      placeholder: 'Place of Issue',
      size: 20,
      class: 'personal-details3'
    },
    fromOptions:{
    id:'from',
    name:'from',
    type:'date', 
    placeholder:'Date of Issue', 
    size:20,
    class: 'personal-details3'
  }, 
  toOptions:{
    id:'to',
    name:'to',
    type:'date', 
    placeholder:'Date of Expire', 
    size:20,
    class: 'personal-details3'  
  }
};
**/
$(document).ready(function() {
  $('select').optionTest({
    actionId: '#action2',
    clearOnChange: false
  });
});

HTML

<fieldset class="fieldset-borders">
<legend>4. Licenses & Certificates</legend>
<ul class="header"> 
<li>
  <select id='options' class="field-style div-format align-left">
    <option selected disabled value="0">Select certificates</option>
    <option value="1">PSSR</option>
    <option value="2">Adv. F.F.</option>
    <option value="3">Survival</option>
    <option value="4">HAZMAT</option>
    <option value="5">First Aid</option>
    <option value="6">Med. Care</option>
    <option value="7">SSO</option>
    <option value="8">GMDSS</option>
    <option value="9">Rad. Obs.</option>
    <option value="10">ARPA</option>
    <option value="11">ECDIS</option>
    <option value="12">BT&RM</option>
    <option value="13">Oil. Tank.</option>
    <option value="14">Ch. Tank.</option>
    <option value="15">LPG</option>
    <option value="16">LNG</option> 
  </select>  
</li>
</ul>  
<ul class="endorsements" id="personal-details3">        
    <li>
        <ul class="column">         
            <li><p class="test-label11">Name</p></li>                       
        </ul>
    </li>
    <li>
        <ul class="column">         
            <li><p class="test-label11">STCW Code</p></li>                      
        </ul>
    </li>
    <li>
        <ul class="column">         
            <li><p class="test-label11">Cert. No</p></li>                       
        </ul>
    </li>
    <li>
        <ul class="column">         
            <li><p class="test-label11">Place of Issue</p></li>                     
        </ul>
    </li>
    <li>
        <ul class="column">         
            <li><p class="test-label11">Date of Issue</p></li>                      
        </ul>
    </li>
    <li>
        <ul class="column">         
            <li><p class="test-label11">Date of Expire</p></li>                     
        </ul>
    </li>
</ul>

<div class="endorsements" id="action2"> 

</div>
</fieldset>

目前它生成的结构如下:

<div>
   <ul>
      <li>
         <input></input>  
      </li>
      <li>
         <input></input>  
      </li>
      <li>
         <input></input>  
      </li>
      <li>
         <input></input>  
      </li>
      <li>
         <input></input>  
      </li>
      <li>
         <input></input>  
      </li>
   </ul>
</div>

但是我需要这样的东西:

<ul class="endorsements" id="personal-details3">
   <li>
      <ul class="column">
         <li><input></input></li> 
      </ul>
   </li>   
   <li>
      <ul class="column">
         <li><input></input></li> 
      </ul>
   </li>
   <li>
      <ul class="column">
         <li><input></input></li> 
      </ul>
   </li>
   <li>
      <ul class="column">
         <li><input></input></li> 
      </ul>
   </li>
   <li>
      <ul class="column">
         <li><input></input></li> 
      </ul>
   </li>
   <li>
      <ul class="column">
         <li><input></input></li> 
      </ul>
   </li>
</ul>

如您所见,这个结构是通过 Javascript 创建的,而不是 HTML,所以我无法成功理解。

我试过替换这个:

var CertNo = $.fn.optionTest.createColumn($("<input>", CertNoData));

喜欢:

var CertNo = $.fn.optionTest.createColumn($("<ul><li><input>", CertNoData));

但在这种情况下,我得到的是空文本字段,没有(placeholderidname ..etc)。

我创建了 JS FIDDLE . Endorsements 部分是通过 HTML 生成的,例如它应该是什么样子并且应该修改 Licenses & Certificates 字段(尝试从下拉列表中选择任何值以生成字段) .

最佳答案

Updated Fiddle

你可以添加两个变量:

var start_by = "<li><ul class='column'><li>";
var end_by = "</li></ul></li>";

将它添加到每个字段,如下所示:

var STCWCode = $.fn.optionTest.createColumn($("<input>", STCWCodeData));
STCWCode = $(start_by+$(STCWCode).html()+end_by);

完整代码如下:

var STCWCode = $.fn.optionTest.createColumn($("<input>", STCWCodeData));
STCWCode = $(start_by+$(STCWCode).html()+end_by);

var CertNo = $.fn.optionTest.createColumn($("<input>", CertNoData));
CertNo = $(start_by+$(CertNo).html()+end_by);

var PlaceofIssue = $.fn.optionTest.createColumn($("<input>", PlaceofIssueData));
PlaceofIssue = $(start_by+$(PlaceofIssue).html()+end_by);

var DateofIssue = $.fn.optionTest.createColumn($("<input>", DateofIssueData));
DateofIssue = $(start_by+$(DateofIssue).html()+end_by);

var DateofExpire = $.fn.optionTest.createColumn($("<input>", DateofExpireData));
DateofExpire = $(start_by+$(DateofExpire).html()+end_by);

var from = $.fn.optionTest.createColumn($("<input>", fromData));
from = $(start_by+$(from).html()+end_by);

var to = $.fn.optionTest.createColumn($("<input>", toData));
to = $(start_by+$(to).html()+end_by);

var removeRow = $.fn.optionTest.createColumn($("<img>", options.removeLinkOptions).attr("src",""));
removeRow = $(start_by+$(removeRow).html()+end_by);    

要使用新的 DOM 调整删除操作,它应该以类 .endorsements 的父 ul 为目标:

$.fn.optionTest.removeRow = function(elem, options) {
    var row = $(elem).closest(".endorsements");
    row.remove();
    $.fn.optionTest.updateRowIndex(options);
};

要使新行垂直,您可以添加以下 CSS 规则:

#action2 > ul{
    display: block;
    width: 100%;
}

#action2 > ul > li{
    width: 16.66%;
    display: inline-block;
}

#action2{
  display: block;
}

希望这对您有所帮助。

关于javascript - 通过 Javascript 添加行后指定 ul li 结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35670338/

有关javascript - 通过 Javascript 添加行后指定 ul li 结构的更多相关文章

  1. ruby - 我需要将 Bundler 本身添加到 Gemfile 中吗? - 2

    当我使用Bundler时,是否需要在我的Gemfile中将其列为依赖项?毕竟,我的代码中有些地方需要它。例如,当我进行Bundler设置时:require"bundler/setup" 最佳答案 没有。您可以尝试,但首先您必须用鞋带将自己抬离地面。 关于ruby-我需要将Bundler本身添加到Gemfile中吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/4758609/

  2. ruby - 使用 ruby​​ 将 HTML 转换为纯文本并维护结构/格式 - 2

    我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h

  3. ruby - 通过 rvm 升级 ruby​​gems 的问题 - 2

    尝试通过RVM将RubyGems升级到版本1.8.10并出现此错误:$rvmrubygemslatestRemovingoldRubygemsfiles...Installingrubygems-1.8.10forruby-1.9.2-p180...ERROR:Errorrunning'GEM_PATH="/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/ruby-1.9.2-p180@global:/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/rub

  4. ruby - 如何指定 Rack 处理程序 - 2

    Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack

  5. ruby - 将 Bootstrap Less 添加到 Sinatra - 2

    我有一个ModularSinatra应用程序,我正在尝试将Bootstrap添加到应用程序中。get'/bootstrap/application.css'doless:"bootstrap/bootstrap"end我在views/bootstrap中有所有less文件,包括bootstrap.less。我收到这个错误:Less::ParseErrorat/bootstrap/application.css'reset.less'wasn'tfound.Bootstrap.less的第一行是://CSSReset@import"reset.less";我尝试了所有不同的路径格式,但它

  6. ruby - 通过 erb 模板输出 ruby​​ 数组 - 2

    我正在使用puppet为ruby​​程序提供一组常量。我需要提供一组主机名,我的程序将对其进行迭代。在我之前使用的bash脚本中,我只是将它作为一个puppet变量hosts=>"host1,host2"我将其提供给bash脚本作为HOSTS=显然这对ruby​​不太适用——我需要它的格式hosts=["host1","host2"]自从phosts和putsmy_array.inspect提供输出["host1","host2"]我希望使用其中之一。不幸的是,我终其一生都无法弄清楚如何让它发挥作用。我尝试了以下各项:我发现某处他们指出我需要在函数调用前放置“function_”……这

  7. ruby - 续集在添加关联时访问many_to_many连接表 - 2

    我正在使用Sequel构建一个愿望list系统。我有一个wishlists和itemstable和一个items_wishlists连接表(该名称是续集选择的名称)。items_wishlists表还有一个用于facebookid的额外列(因此我可以存储opengraph操作),这是一个NOTNULL列。我还有Wishlist和Item具有续集many_to_many关联的模型已建立。Wishlist类也有:selectmany_to_many关联的选项设置为select:[:items.*,:items_wishlists__facebook_action_id].有没有一种方法可以

  8. ruby - 通过 ruby​​ 进程共享变量 - 2

    我正在编写一个gem,我必须在其中fork两个启动两个webrick服务器的进程。我想通过基类的类方法启动这个服务器,因为应该只有这两个服务器在运行,而不是多个。在运行时,我想调用这两个服务器上的一些方法来更改变量。我的问题是,我无法通过基类的类方法访问fork的实例变量。此外,我不能在我的基类中使用线程,因为在幕后我正在使用另一个不是线程安全的库。所以我必须将每个服务器派生到它自己的进程。我用类变量试过了,比如@@server。但是当我试图通过基类访问这个变量时,它是nil。我读到在Ruby中不可能在分支之间共享类变量,对吗?那么,还有其他解决办法吗?我考虑过使用单例,但我不确定这是

  9. ruby - 通过 RVM (OSX Mountain Lion) 安装 Ruby 2.0.0-p247 时遇到问题 - 2

    我的最终目标是安装当前版本的RubyonRails。我在OSXMountainLion上运行。到目前为止,这是我的过程:已安装的RVM$\curl-Lhttps://get.rvm.io|bash-sstable检查已知(我假设已批准)安装$rvmlistknown我看到当前的稳定版本可用[ruby-]2.0.0[-p247]输入命令安装$rvminstall2.0.0-p247注意:我也试过这些安装命令$rvminstallruby-2.0.0-p247$rvminstallruby=2.0.0-p247我很快就无处可去了。结果:$rvminstall2.0.0-p247Search

  10. ruby-on-rails - 在 ruby​​ .gemspec 文件中,如何指定依赖项的多个版本? - 2

    我正在尝试修改当前依赖于定义为activeresource的gem:s.add_dependency"activeresource","~>3.0"为了让gem与Rails4一起工作,我需要扩展依赖关系以与activeresource的版本3或4一起工作。我不想简单地添加以下内容,因为它可能会在以后引起问题:s.add_dependency"activeresource",">=3.0"有没有办法指定可接受版本的列表?~>3.0还是~>4.0? 最佳答案 根据thedocumentation,如果你想要3到4之间的所有版本,你可以这

随机推荐