我正在构建一个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, '&').replace(/</g, '<').replace(/"/g, '"')
进入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示例进行了测试的示例。 结果如下: 如果您有兴趣,这是我用来显示结果的示例代码: