Rai*_*ner 2 javascript jquery jquery-ui jquery-plugins
如何让这个Jquery变干?
// Adding data to input depending on what div is clicked
$('#navninfoDiv').click(function() {
$('input#webhost_navninfo').data('myData', null);
});
$('#navninfoDivP').click(function() {
$('input#webhost_navninfo').data('myData', 'p');
});
$('navninfoDivV').click(function() {
$('#inputwebhost_navninfo').data('myData', 'V');
});
// Adding data to input depending on what div is clicked
$('#prisinfoDiv').click(function() {
$('#inputwebhost_prisinfo').data('myData2', null);
});
$('#prisinfoDivP').click(function() {
$('#inputwebhost_prisinfo').data('myData2', 'p');
});
$('#prisinfoDivV').click(function() {
$('#inputwebhost_prisinfo').data('myData2', 'V');
});
// Adding data to input depending on what div is clicked
$('#cableinfoDiv').click(function() {
$('#inputwebhost_cableinfo').data('myData3', null);
});
$('#cableinfoDivP').click(function() {
$('#inputwebhost_cableinfo').data('myData3', 'p');
});
$('#prisinfoDivV').click(function() {
$('#inputwebhost_cableinfo').data('myData3', 'V');
});
// Adding data to input on submit
$('#smt').click(function() {
// for input#webhost_navninfo
var myData = $('#webhost_navninfo').data('myData'),
val = $('#webhost_navninfo').val();
if (myData) {
$('#webhost_navninfo').val(myData + val);
}
// for input#webhost_prisinfo
var myData2 = $('#webhost_prisinfo').data('myData2'),
val2 = $('#webhost_prisinfo').val();
if (myData2) {
$('#webhost_prisinfo').val(myData2 + val2);
}
// for input#webhost_cableinfo
var myData3 = $('#webhost_cableinfo').data('myData3'),
val3 = $('#webhost_cableinfo').val();
if (myData3) {
$('#webhost_navninfo').val(myData3 + val3);
}
});
Run Code Online (Sandbox Code Playgroud)
如何干掉所有这些代码?我有更多的输入字段约50.
这是我的HTML和jQuery没有数据函数:http://jsfiddle.net/z5qeX/2/
我在这个例子中给出的代码示例只是为了说明我想要的功能.它与jsfiddle中的HTML不匹配,但它是我想要将其添加到以后的代码.
Sha*_*oli 12
这是我的简单解决方案,脚本非常少,只要您将所有3种类型的div添加几个数据属性,如下所述.此外,而不是使用mydata,mydata2并且mydata3我们可以只使用mydata数据的所有类型的输入属性名称.
这是工作演示
标记
<div id="navninfoDiv" data-type="navninfo" data-info="">navninfo</div>
<div id="navninfoDivP" data-type="navninfo" data-info="p">navninfop</div>
<div id="navninfoDivV" data-type="navninfo" data-info="V">navninfoV</div>
<div id="prisinfoDiv" data-type="prisinfo" data-info="">prisinfo</div>
<div id="prisinfoDivP" data-type="prisinfo" data-info="p">prisinfop</div>
<div id="prisinfoDivV" data-type="prisinfo" data-info="V">prisinfoV</div>
<div id="cableinfoDiv" data-type="cableinfo" data-info="">cableinfo</div>
<div id="cableinfoDivP" data-type="cableinfo" data-info="p">cableinfop</div>
<div id="cableinfoDivV" data-type="cableinfo" data-info="V">cableinfoV</div>
<input type="text" id="webhost_navninfo" />
<input type="text" id="webhost_prisinfo" />
<input type="text" id="webhost_cableinfo" />
<input type="button" id="smt" value="Submit" />
Run Code Online (Sandbox Code Playgroud)
JS
$(function(){
//Adding data to input
//This will attach click event handler to all the divs
//whose id contains 'infoDiv'
$('div[id*=infoDiv]').click(function() {
$('#webhost_'+$(this).data('type')).data('myData', $(this).data('info'));
});
// Setting value to input on submit
$('#smt').click(function() {
var $this;
//This will loop through all the input fields whose id starts '
//with 'webhost and prepend data('myData') to its value
$("input[id^=webhost]").each(function(){
$this = $(this);
$this.val(($this.data("myData") || '') + $this.val());
});
});
});
Run Code Online (Sandbox Code Playgroud)
我希望这可以帮助你.
cwa*_*ole 11
这是您提供的代码的完美改进.还有其他解决方案(如ShankarSangoli)为您提供了需要修改HTML的良好替代方案,但这应该与您现在拥有的完全一致.
这将在多次通过中完成,因此我可以解释发生了什么.
// pass 1 you have three sets of information, the difference is the
// div which has the listener, and the default data. (I've taken the liberty to
// make all of the names consistent.
$('#navninfoDiv').click(function() {
// based on your HTML, I believe that the input# is superfluous
$('#webhost_navninfo').data('myData', null);
});
$('#navninfoDivP').click(function() {
$('#webhost_navninfo').data('myData', 'p');
});
$('navninfoDivV').click(function() {
$('#webhost_navninfo').data('myData', 'V');
});
$('#prisinfoDiv').click(function() {
$('#webhost_prisinfo').data('myData2', null);
});
/* ... */
$('#cableinfoDiv').click(function() {
$('#webhost_cableinfo').data('myData3', null);
});
/* ... */
Run Code Online (Sandbox Code Playgroud)
由于您使用的是命名约定,因此实际上很简单.首先,我们将"数据"部分放在一个循环中:
var defaults = [null, "P", "V"]
for( var i = 0; i < defaults.length; i++ )
{
var divID = '#navninfoDiv' + ( defaults[i]?defaults[i]:"" );
$(divID).click(function() {
$('#webhost_navninfo').data('myData', defaults[i]);
});
}
for( i = 0; i < defaults.length; i++ )
{
var divID = '#prisinfoDiv' + ( defaults[i]?defaults[i]:"" );
$(divID).click(function() {
$('#webhost_prisinfo').data('myData2', defaults[i]);
});
}
for( i = 0; i < defaults.length; i++ )
{
var divID = '#cableinfoDiv' + ( defaults[i]?defaults[i]:"" );
$(divID).click(function() {
$('#webhost_cableinfo').data('myData3', defaults[i]);
});
}
Run Code Online (Sandbox Code Playgroud)
基于此,看起来我们仍然有一些已重复的代码,如果我们也对div的ID进行循环怎么办?
var baseIDs = [ 'navninfo', 'prisinfo', 'cableinfo' ];
var defaults = [null, "P", "V"]
for( var j = 0; j < baseIDs.length; j++ )
{
for( var i = 0; i < defaults.length; i++ )
{
var divID = '#'+baseIDs[j]+'Div' + ( defaults[i]?defaults[i]:"" );
$(divID).click(function() {
var dat = i? 'myData': 'myData' + String( i + 1 );
$('#webhost_'+baseIDs[j]).data(dat, defaults[i]);
});
}
}
Run Code Online (Sandbox Code Playgroud)
这看起来不太干净.我敢打赌,把所有这些中心的东西都放到它自己的小功能中并不难,这将使调试变得更容易,更清洁:
var baseIDs = [ 'navninfo', 'prisinfo', 'cableinfo' ];
var defaults = [null, "P", "V"]
for( var j = 0; j < baseIDs.length; j++ )
{
for( var i = 0; i < defaults.length; i++ )
{
var datLab = 'myData'
if( i ) datLab += String( i + 1 );
assignClickListener(baseIDs[j], defaults[i], datLab);
}
}
function assignClickListener(base, defaults, datLab)
{
var divID = '#'+base+'Div' + ( defaults?defaults:"" );
$(divID).click(function() {
$('#webhost_'+base).data(datLab, defaults);
});
}
Run Code Online (Sandbox Code Playgroud)
所以,现在我们已经完成了脚本的第一部分.让我们看看是否有类似的方式来查看脚本的第二部分.
// I'm going to omit this until we re-unite all of the code at the end.
$('#smt').click(function() {
// so you have the same looping structure here:
var myData = $('#webhost_navninfo').data('myData'),
val = $('#webhost_navninfo').val();
if (myData) {
$('#webhost_navninfo').val(myData + val);
}
var myData2 = $('#webhost_prisinfo').data('myData2'),
/* ... */
var myData3 = $('#webhost_cableinfo').data('myData3'),
val3 = $('#webhost_cableinfo').val();
if (myData3) {
// this looks like a mistake. I will assume that it is supposed
// to be webhost_cableinfo.
$('#webhost_navninfo').val(myData3 + val3);
}
});
Run Code Online (Sandbox Code Playgroud)
那么,既然循环上次工作得很好,为什么我们不再尝试做同样的事情呢?
var baseIDs = [ 'navninfo', 'prisinfo', 'cableinfo' ];
for( var i = 0; i < baseIDs.length; i++ )
{
var datLab = 'myData'
if( i ) datLab += String( i + 1 );
var currentBase = baseIDs[i];
var myData = $('#webhost_'+currentBase).data(datLab),
val = $('#webhost_'+ currentBase).val();
if (myData) {
$('#webhost_' + currentBase).val(myData + val);
}
}
Run Code Online (Sandbox Code Playgroud)
哎呦.看起来我错过了那里的东西 - 我可以重新使用那个ID:
var baseIDs = [ 'navninfo', 'prisinfo', 'cableinfo' ];
for( var i = 0; i < baseIDs.length; i++ )
{
var datLab = 'myData'
if( i ) datLab += String( i + 1 );
// since this is actually the ID now, I've renamed the variable.
var currentID = '#webhost_'+baseIDs[i];
var myData = $(currentID).data(datLab),
val = $(currentID).val();
if (myData) {
$(currentID).val(myData + val);
}
}
Run Code Online (Sandbox Code Playgroud)
嗯...我打赌我可以缓存更多:
var baseIDs = [ 'navninfo', 'prisinfo', 'cableinfo' ];
for( var i = 0; i < baseIDs.length; i++ )
{
var datLab = 'myData'
if( i ) datLab += String( i + 1 );
// I can actually cache this entire element. I'll do that:
var currentElem = $('#webhost_'+baseIDs[i]);
var myData = currentElem.data(datLab),
// val = currentElem.val(); <!-- I don't need this value, I'll just
// calculate it inline.
if (myData) {
currentElem.val(myData + currentElem.val());
}
}
Run Code Online (Sandbox Code Playgroud)
好的,现在我们已经准备好将两者结合起来,看看我们是如何做到的:
var baseIDs = [ 'navninfo', 'prisinfo', 'cableinfo' ];
var defaults = [null, "P", "V"]
for( var j = 0; j < baseIDs.length; j++ )
{
for( var i = 0; i < defaults.length; i++ )
{
var datLab = 'myData'
if( i ) datLab += String( i + 1 );
assignClickListener(baseIDs[j], defaults[i], datLab);
}
}
function assignClickListener(base, defaults, datLab)
{
var divID = '#'+base+'Div' + ( defaults?defaults:"" );
$(divID).click(function() {
$('#webhost_'+base).data(datLab, defaults);
});
}
for( i = 0; i < baseIDs.length; i++ )
{
var datLab = 'myData'
if( i ) datLab += String( i + 1 );
var currentElem = $('#webhost_'+baseIDs[i]);
var myData = currentElem.data(datLab),
if (myData) {
currentElem.val(myData + currentElem.val());
}
}
Run Code Online (Sandbox Code Playgroud)
注意这个bug?注意删除重复代码的地方?
var baseIDs = [ 'navninfo', 'prisinfo', 'cableinfo' ];
var defaults = [null, "P", "V"]
for( var j = 0; j < baseIDs.length; j++ )
{
for( var i = 0; i < defaults.length; i++ )
{
/*
var datLab = 'myData'
if( i ) datLab += String( i + 1 );
I really don't like this pattern. I repeat it twice. We can fix that
*/
assignClickListener(baseIDs[j], defaults[i], getDataLabel(j));
}
}
// I left this part out. That's the bug.
$('#smt').click(function() {
// make i local here. Otherwise it could be destructive
for( var i = 0; i < baseIDs.length; i++ )
{
var currentElem = $('#webhost_'+baseIDs[i]);
var myData = currentElem.data(getDataLabel( i )),
if (myData) {
currentElem.val(myData + currentElem.val());
}
}
}
function assignClickListener(base, defaultData, datLab)
{
var divID = '#'+base+'Div' + ( defaultData?defaultData:"" );
$(divID).click(function() {
$('#webhost_'+base).data(datLab, defaultData);
});
}
function getDataLabel( i )
{
var datLab = 'myData'
if( i ) datLab += String( i + 1 );
return datLab;
}
Run Code Online (Sandbox Code Playgroud)
我可以看到最后一件可以轻松删除的东西.我们一直在抬头$('#webhost_<id>').如果需要改变怎么办?不,我认为我们也应该把它移出去.虽然我们正在努力,但我们不妨缓存它:
var baseIDs = [ 'navninfo', 'prisinfo', 'cableinfo' ];
var defaults = [null, "P", "V"]
for( var j = 0; j < baseIDs.length; j++ ) {
for( var i = 0; i < defaults.length; i++ ) {
assignClickListener(baseIDs[j], defaults[i], getDataLabel(j));
}
}
$('#smt').click(function() {
for( var i = 0; i < baseIDs.length; i++ ) {
var currentElem = getHostElement(baseIDs[i]);
var myData = currentElem.data(getDataLabel( i )),
if (myData) {
currentElem.val(myData + currentElem.val());
}
}
} ); // note: this was a bug in previous iteration. I missed the );
function assignClickListener(base, defaultData, datLab) {
var divID = '#'+base+'Div' + ( defaultData?defaultData:"" );
$(divID).click(function() {
getHostElement(base).data(datLab, defaultData);
});
}
var elementCache = {}
function getHostElement( baseLab ) {
if( !elementCache[ baseLab ] )
elementCache[ baseLab ] = $('#webhost_'+baseLab);
return elementCache[ baseLab ];
}
function getDataLabel( i ) {
var datLab = 'myData'
if( i ) datLab += String( i + 1 );
return datLab;
}
Run Code Online (Sandbox Code Playgroud)
现在,结果只减少了大约50%的代码行,并且它更容易测试,因为它没有直接重复,所以这段代码的每一部分都更容易理解.
| 归档时间: |
|
| 查看次数: |
795 次 |
| 最近记录: |