如何在多行 innerHTML 属性的 javascript 中包含 if 语句?

Posted

技术标签:

【中文标题】如何在多行 innerHTML 属性的 javascript 中包含 if 语句?【英文标题】:How to include an if statement within the javascript of a multiple line innerHTML property? 【发布时间】:2020-12-06 22:26:48 【问题描述】:

我正在使用 java-script 使用 innerhtml 属性在我的 html/php 页面上基于 js 变量呈现动态 svg。

这是一个复杂的 svg,所以我将字符串拆分为多行。

我当前的代码运行良好;

document.getElementById('diagram1').innerHTML 
= '<svg  >'
+ '<line x1="0" y1="'+depth+'" x2="'+width+'" y2="'+depth+'" stroke="#ff6622" stroke-></line>'
+ '<rect   x="100" y="140" fill="#CCC"></rect>'
+ '</svg>';

但是,如果我将任何行包装在 if 语句中,那么即使满足 if 语句的条件,该行也永远不会呈现。

document.getElementById('diagram1').innerHTML 
= '<svg  >'
if (test == 'on') 
+ '<line x1="0" y1="'+depth+'" x2="'+width+'" y2="'+depth+'" stroke="#ff6622" stroke-></line>'

+ '<rect   x="100" y="140" fill="#CCC"></rect>'
+ '</svg>';

有没有不同/更好的方法来做到这一点?我错过了什么吗?

【问题讨论】:

这不是动态构建字符串的方式。我确信控制台中的错误消息指向我们。 控制台没有显示错误。如果没有任何其他信息,这不是一个特别有用的评论。我确实问过是否有不同/更好的方法来做到这一点,所以我很高兴听到你可能有的任何解释。 【参考方案1】:

您可以在将字符串设置为 innerHTML 之前构建字符串:

let text = '<svg  >';
if (test == 'on') 
    text += '<line x1="0" y1="'+depth+'" x2="'+width+'" y2="'+depth+'" stroke="#ff6622" stroke-></line>';

text += '<rect   x="100" y="140" fill="#CCC"></rect>' + '</svg>';
document.getElementById('diagram1').innerHTML = text;

或者你可以使用三元:

document.getElementById('diagram1').innerHTML
= '<svg  >'
+ (test == 'on' ? '<line x1="0" y1="'+depth+'" x2="'+width+'" y2="'+depth+'" stroke="#ff6622" stroke-></line>' : '')
+ '<rect   x="100" y="140" fill="#CCC"></rect>'
+ '</svg>';

【讨论】:

【参考方案2】:

您可以使用ternary operator。

document.getElementById('diagram1').innerHTML 
= '<svg  >' +
(test == 'on' ? 
'<line x1="0" y1="'+depth+'" x2="'+width+'" y2="'+depth+'" stroke="#ff6622" stroke-></line>'
: '')
+ '<rect   x="100" y="140" fill="#CCC"></rect>'
+ '</svg>';

【讨论】:

【参考方案3】:

您可以使用template literals 来做同样的事情。因此,如果您有任何条件,您可以将其包含在您的 HTML 中 -

`...some html before codition$test === 'on' ? 'when condition is true':null`

此外,在这种情况下,模板文字将是更好的选择,而不是多个 +,您可以以更短、更有效的方式对模板文字执行相同操作。

如果您仍然只想使用字符串,您可以尝试使用 三元运算符,就像我在上面使用模板文字所做的那样。另一种选择是将字符串拆分为多行,并根据您要应用的条件有条件地附加 HTML 代码。

【讨论】:

【参考方案4】:
let defaultText = '<svg  >';
let extraText = '<line x1="0" y1="'+depth+'" x2="'+width+'" y2="'+depth+'" stroke="#ff6622" stroke-></line>';
let endText = '<rect   x="100" y="140" fill="#CCC"></rect>'
+ '</svg>';

document.getElementById('diagram1').innerHTML = test == 'on' ?  defaultText + endText : defaultText + extraText + endText; 

【讨论】:

【参考方案5】:

您必须将它存储在一个变量中,然后在您的 if 子句中将其添加到此变量中,然后再添加其余部分。您没有将 innerHTML 正确构建在一起,if 和 behind 中的所有部分都被遗漏了,因此您会遇到这些丢失部分的麻烦。

let innerHTML = '<svg  >';
if (test == 'on') 
  innerHTML += '<line x1="0" y1="'+depth+'" x2="'+width+'" y2="'+depth+'" stroke="#ff6622" stroke-></line>'
;

innerHTML +=  '<rect   x="100" y="140" fill="#CCC"></rect>'
  + '</svg>';
  
document.getElementById('diagram1').innerHTML;

【讨论】:

以上是关于如何在多行 innerHTML 属性的 javascript 中包含 if 语句?的主要内容,如果未能解决你的问题,请参考以下文章

JS实现多行文本最后是省略号紧随其后还有个超链接在同一行的需求

Ng2 innerHTML 如何允许样式属性? [复制]

如何在 JS 和 DOM 中创建元素、设置属性、使用 innerHTML 和 appendChild

如何使用 ngModel 在 div 的 innerhtml 属性上实现 2 路数据绑定?

如何使用innerHTML在angular 2中附加HTML内容

Dart:如何动态设置文档正文innerHTML