2014-10-17 31 views
1
for (i = 0; i < events.length; i++) { 
    left_pos = (event_col[i] * xfactor * 100); 
     //jquery part need cleaner 
    $('.contain_textDiv') 
     .append('<div class="sample_box1" style="margin-left:' + left_pos + '%;' + 'margin-top:' + Math.round(events[i].start) + 'px; width:' + Math.floor(95 * xfactor) + '%;' + 'position: absolute; height:' + Math.round(events[i].end - events[i].start) + 'px;"><div class="sample_boxHeader">Sample Layout</div><div class="sample_box_grayText">Sample Location</div></div>'); 
    } 

的JavaScript代码,这部分将通过循环来改变目前的HTML样式并添加需要一个更好的解决方案,以追加从JavaScript文件

<div class="sample"></div> 

<div class="sample2"></div> 

里面的html我的HTML文件,已经存在一个<div class="sample"></div>

任何人都有更好的解决方案来清理代码的一部分?我将衷心感谢您的帮助!

+0

你想在这里做什么... – 2014-10-17 02:31:12

+0

jquery部分很长很混乱,我想找到一个更好的解决方案将这两个div附加到我的存在div – JavaLeave 2014-10-17 02:33:31

+0

为什么你认为这是一个好主意编辑你想要的帮助?这将你的问题转换为:“这是一些HTML,我该如何改进我没有向你展示的JavaScript。” – 2014-10-17 04:43:12

回答

1

而是附加的DOM元素作为一个字符串,创建jQuery的一个新的元素和追加一条:

var newEl = $('<div>').addClass("sample_box1").css({ 
    'margin-left': left_pos+"%", 
    'margin-top': Math.round(events[i].start), 
    width: Math.floor(95 * xfactor)+'%', 
    //etc etc 
}); 
$('.contain_textDiv').append(newEl); 
+0

这是一个伟大的方法!我想这样,然后我试图使用.html()方法...然后卡在那里 – JavaLeave 2014-10-17 02:43:20

+0

在这里的CSS部分是有点棘手。似乎我必须在margin-left和margin-top附近添加单引号,例如“margin-top”和“margin-left”,并且控制台表示绝对没有定义... – JavaLeave 2014-10-17 03:19:01

+0

是的,任何带短划线的东西都需要引号。确保你把引号放在绝对位置,否则它正在寻找一个变量,而不是字符串 – Brennan 2014-10-17 03:28:02

0

我认为布伦南的回答是一种很好的清洁方法。但是,如果由于某种原因,你喜欢建立它作为一个字符串,那么这里有一个小的例子“使用像一个StringBuilder阵列”砍我喜欢用不时:

for (i = 0; i < events.length; i++) { 
    left_pos = (event_col[i] * xfactor * 100); 
    var sb = []; 
    sb.push('<div class="sample_box1" '); 
    sb.push( 'style="margin-left:' + left_pos + '%;'); 
    sb.push( 'margin-top:' + Math.round(events[i].start) + 'px; '); 
    sb.push( 'width:' + Math.floor(95 * xfactor) + '%;'); 
    sb.push( 'position: absolute; '); 
    sb.push( 'height:' + Math.round(events[i].end - events[i].start) + 'px;">'); 
    sb.push('<div class="sample_boxHeader">Sample Layout</div>'); 
    sb.push('<div class="sample_box_grayText">Sample Location</div>'); 
    sb.push('</div>'); 
    console.log(sb.join('')); 
    $('.contain_textDiv').append(sb.join('')); 
} 
+0

这会使渲染比Brennan的解决方案慢吗? – JavaLeave 2014-10-17 02:41:43

+1

我不认为这会造成明显的差异,除非事件数组非常大。此外,不成熟的优化和所有... – 2014-10-17 02:43:26

+0

@JavaLeave它实际上更快......但我不会推荐它。你不应该将任意数据直接连接到HTML。虽然您可能知道今天这些数值的来源,但您可能不知道它们明天来自哪里。特洛伊的解决方案不会漏掉任何东西,这可能会导致模糊的CSS,HTML甚至是注入漏洞,这取决于它的使用方式。 – Brad 2014-10-17 02:44:00

1

有几种方法清理这个。一种方法是缩进你的代码。你可以做的另一件事是使用jQuery的方法来设置样式属性值(所以你不必担心逃逸和不能)。

$('.contain_textDiv') 
    .append(
    $('<div>') 
     .addClass('sample_box1') 
     .css({ 
     'margin-left': left_post + '%', 
     'margin-top': Math.round(events[i].start) + 'px', 
     width: Math.floor(95 * xfactor) + '%', 
     height: Math.round(events[i].end - events[i].start) + 'px' 
     }) 
     .append([ 
     $('<div class="sample_boxHeader">Sample Layout</div>'), 
     $('<div class="sample_box_grayText">Sample Location</div>') 
     ]) 
) 

(代码是未经测试,但应该让你开始。)

另一个要考虑的(通常是最好的选择)是使用JavaScript模板引擎。有很多可供选择的。我发现Swig是非常高效和轻量级的,当您只有基本的模板需求时,这很好。

+0

css部分追加罚款,但它似乎像后面的两个div不能像这样追加。浏览器不断抛出我的错误 – JavaLeave 2014-10-17 03:11:10

+0

@JavaLeave你肯定可以附加divs这种方式。我的代码中有一个语法错误。现在已经修复了。我们在最后附加了一组元素,我用分号';'而不是逗号','。 – Brad 2014-10-17 13:53:42

相关问题