当前位置: 首页 > 面试题库 >

将大块HTML插入Java元素中的最佳实践?

鲁明知
2023-03-14
问题内容

我正在构建一个Web应用程序(使用原型),该应用程序需要在DOM中添加大块HTML。其中大多数是包含具有各种属性方式的元素的行。

目前,我在变量中保留HTML的空白行,

var blankRow = '<tr><td>'
    +'<a href="{LINK}" onclick="someFunc(\'{STRING}\');">{WORD}</a>'
    +'</td></tr>';

function insertRow(o) {
    newRow = blankRow
        .sub('{LINK}',o.link)
        .sub('{STRING}',o.string)
        .sub('{WORD}',o.word);
    $('tbodyElem').insert( newRow );
}

现在一切正常,花花公子,但这是最佳做法吗?

当我更新页面上的代码时,我必须更新blankRow中的代码,因此要插入的新元素相同。当我有40行HTML放入blankRow中时,它变得很烂,然后我也必须对其进行转义。

有更容易的方法吗?我当时考虑过urlencoding,然后在插入之前对其进行解码,但这仍然意味着blankRow和很多转义。

这将意味着PHP等人的eof函数。

$blankRow = <<<EOF
text
text
EOF;

那将意味着没有逃避,但仍然需要一个blankRow。

在这种情况下您会做什么?

最终在原型中使用DOMBuilder。不需要其他库:

$w('a div p span img table thead td th tr tbody tfoot input').each(function(e) {
        window['$' + e] = function() {
            return new Element(e, arguments[0]);
        }
});

newPart = $div({id: 'partition-4'})
    .insert( $p()
        .insert('<b>Stuff</b>')
    )
    .insert( $p({
        id: 'a-p'})
        .insert('<b>More stuff</b>')
    );

$('parentDiv').insert(newPart);

在这里或这里查看我的解决方案


问题答案:

这是最佳做法吗?

不会。实际上,您有HTML注入问题导致错误,在最坏的情况下,注入的字符串可能包含用户提交的内容,因此XSS安全漏洞。

将纯文本内容和属性值放入HTML字符串时, 必须对其进行
HTML编码。在PHP中,您必须调用htmlspecialchars()进入HTML的字符串来执行此操作。在JavaScript中,您没有内置的HTML转义功能,因此您必须自己编写。通过使用s.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/"/g, '&quot;')进入HTML的字符串。

onclick =“ someFunc('{STRING} ');”

这是逃避混乱的全新境界。在事件处理程序属性内的JavaScript字符串文字中,您必须对字符串进行JS编码(\-escaping
'以及\一些Unicode字符以确保完整性)
然后对结果进行HTML编码。否则,字符串可以突破其字符串字面定界符,并注入任意JS代码。在所有情况下都应避免使用内联事件处理程序属性,尤其是在模板中。

用HTML字符串创建页面内容很糟糕。您很可能会产生转义错误并损害应用程序的安全性。改用类似DOM的方法,您不必为此担心。您似乎正在使用jQuery,因此请尝试使用jQuery
1.4元素创建快捷方式:

$('<tr>').append(
    $('<td>').append(
        $('<a>', {
            href: o.link,
            text: o.word,
            onclick: function() {
                someFunc(o.string);
            }
        })
    )
);

或者,将空白行实际上保留为HTML文档,然后将其隐藏(display: none)或在启动时将其与文档分离(removeChild或jQuery
detach)。然后,当需要新行时,克隆空白行并进行所需的更改:

var blankRow= $('#blankRow').detach();

    ...

var newRow= blankRow.clone();
var link= newRow.find('td>a');
link.attr('href': o.link);
link.text(o.word);
link.click(function() {
    someFunc(o.string);
});

如果必须从字符串模板创建内容,请确保默认情况下模板函数HTML会转义每个替换,并通过选择要解析的内容内的节点来附加事件click(function() { ... })。或者使用事件委托(例如jQuery live())来处理事件,而不必在添加时绑定到新节点。



 类似资料:
  • 问题内容: 使用以下语法时,不必为每种类型的属性和事件繁琐地搜索解决方法: 有没有一种方法可以将整个HTML元素声明为字符串?喜欢: 问题答案: 创建片段然后插入该片段可能会更好,而不是直接弄乱它: 好处: 您可以使用本机DOM方法进行插入,例如insertBefore,appendChild等。 您可以在插入实际的DOM节点之前对其进行访问;您可以访问片段的childNodes对象。 使用文档片

  • 本文向大家介绍jQuery实现元素的插入,包括了jQuery实现元素的插入的使用技巧和注意事项,需要的朋友参考一下  效果图: 图(1) 初始效果 图(2) 点击' 插入到此元素前面 '效果  代码如下: 以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持呐喊教程!

  • 问题内容: 我正在建立一个通过各种CSV提要更新大量数据的系统。通常,我只会遍历提要中的每一行,进行选择查询以检查该项目是否已经存在,并根据是否存在来插入/更新该项目。 我觉得这种方法扩展性不强,可能会在较大的提要上重击服务器。我的解决方案是像往常一样遍历所有项目,但将它们存储在内存中。然后,对于每100个左右的项目,对这100个项目进行选择,并获取数据库中匹配的现有项目的列表。然后将插入/更新语

  • 设置html,body,#app大小的最佳方式是什么? 我们在使用框架的时候,往往我们的内容会被包含在#app中。 当我们的内容包含在body中的时候,我往往会这样设置html, body的大小。 当有了#app时,该怎么设置合适呢?这样吗?

  • 我正在尝试使用画布元素,但高度不能超过像素。如果我尝试使用像素,我会在IE11中得到。这在Chrome中工作正常。画布用于PDF生成,我真的没有时间将生成移动到服务器。 我在谷歌上搜索了一下,看起来大小可能会因平台和浏览器的不同而有所不同。 是浏览器分配的内存和内存设置决定了这一点吗? 编辑:我在这里找到了一些信息: 看起来我可以有两倍的尺寸。也许这只是为了IE9。

  • 问题内容: 这是我的代码,也许您会立即注意到我所缺少的内容: 我正在尝试在CustomerId现有节点之前插入新的node()。这是我的XML示例文件: 这是一个抛出异常,我只是不知道还能尝试什么: NOT_FOUND_ERR:尝试在不存在的上下文中引用该节点。 问题答案: 在这里,我只是使用您提供的xml示例进行了测试的示例。 结果如下: 如果您有兴趣,这是我用来显示结果的示例代码: