有下拉列表,从列表中选择任何值后,它应该添加新行,例如:
现在我有:
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));
但在这种情况下,我得到的是空文本字段,没有(placeholder、id、name ..etc)。
我创建了 JS FIDDLE . Endorsements 部分是通过 HTML 生成的,例如它应该是什么样子并且应该修改 Licenses & Certificates 字段(尝试从下拉列表中选择任何值以生成字段) .
最佳答案
你可以添加两个变量:
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/
当我使用Bundler时,是否需要在我的Gemfile中将其列为依赖项?毕竟,我的代码中有些地方需要它。例如,当我进行Bundler设置时:require"bundler/setup" 最佳答案 没有。您可以尝试,但首先您必须用鞋带将自己抬离地面。 关于ruby-我需要将Bundler本身添加到Gemfile中吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/4758609/
我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h
尝试通过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
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
我有一个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";我尝试了所有不同的路径格式,但它
我正在使用puppet为ruby程序提供一组常量。我需要提供一组主机名,我的程序将对其进行迭代。在我之前使用的bash脚本中,我只是将它作为一个puppet变量hosts=>"host1,host2"我将其提供给bash脚本作为HOSTS=显然这对ruby不太适用——我需要它的格式hosts=["host1","host2"]自从phosts和putsmy_array.inspect提供输出["host1","host2"]我希望使用其中之一。不幸的是,我终其一生都无法弄清楚如何让它发挥作用。我尝试了以下各项:我发现某处他们指出我需要在函数调用前放置“function_”……这
我正在使用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].有没有一种方法可以
我正在编写一个gem,我必须在其中fork两个启动两个webrick服务器的进程。我想通过基类的类方法启动这个服务器,因为应该只有这两个服务器在运行,而不是多个。在运行时,我想调用这两个服务器上的一些方法来更改变量。我的问题是,我无法通过基类的类方法访问fork的实例变量。此外,我不能在我的基类中使用线程,因为在幕后我正在使用另一个不是线程安全的库。所以我必须将每个服务器派生到它自己的进程。我用类变量试过了,比如@@server。但是当我试图通过基类访问这个变量时,它是nil。我读到在Ruby中不可能在分支之间共享类变量,对吗?那么,还有其他解决办法吗?我考虑过使用单例,但我不确定这是
我的最终目标是安装当前版本的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
我正在尝试修改当前依赖于定义为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之间的所有版本,你可以这