这个问题是关于加载嵌入到 DOM 结构中的数据。我正在使用 jQuery2,但这个问题对任何其他框架或单个 Javascript 代码都有效。
有两种情况:
当数据加载一次(与页面)时,不需要“刷新数据”。
当某个事件刷新数据时。
平均性能可以用一个或另一个来改变
假设场景 2 的典型案例,其中必须使用新 HTML 和新数据重新加载页面片段。所以,$('#myDiv').load('newHtmlFragment')
将被以任何方式使用......而且,对于使用 AJAX 的 jQuery 程序员来说,有两种方法可以加载“基于 DOM 的数据”:
- 通过 HTML:将所有数据表示为“newHtmlFragment”HTML。假设有很多段落,每个都喜欢
<p id="someId" data-X="someContent">...more content</p>
。
每个 都有一些“冗长的开销”,data-X1="contentX1" data-X2="contentX2" ...
如果 webservice 脚本不是面向 XHTML 的脚本(我使用的是 PHP,我的数据是一个数组,我更喜欢使用json_encode
),那么它对于 webservice 脚本来说并不优雅。 - 通过 jQuery 评估:仅使用相同
$('#myDiv').load('newHtmlFragment')
的 for<p id="someId">...more content</p>
,没有data-X
. 第二个 AJAX 加载一个类似的 jQuery 脚本$('#someId').data(...)
并对其进行评估。所以这是一个开销,对于节点选择和数据包含,但是对于大项目数据,每个数据都可以用 JSON 编码。 - by pure JSON:类似于“by jQuery”,但第二个 AJAX 加载 JSON 对象,如
var ALLDATA={'someId1':{...}, 'someId2':{...}, ...}
. 因此,这是执行诸如$('#myDiv p').each(function(){... foreach ... $(this).data('x',ALLDATA[id]['x']);})
检索选择之类的静态函数的开销,但是对于大数据,所有数据都可以由 JSON 编码。
问题:最好的选择是什么? 这取决于场景或其他上下文参数?是否存在显着的性能权衡?
PS:完整的答案需要解决性能问题...如果没有显着的性能差异,最佳选择取决于“最佳编程风格”和软件工程考虑。
更多上下文,如果您需要作为参考答案。我的实际问题是在场景 1 中,我正在使用第二个选择“通过 jQuery 脚本”,执行:
$('#someId1').data({'bbox':[201733.2,7559711.5,202469.4,7560794.9],'2011-07':[3,6],'2011-08':[2,3],'2011-10':[4,4],'2012-01':[1,2],'2012-02':[12,12],'2012-03':[3,6],'2012-04':[6,12],'2012-05':[3,4],'2012-06':[2,4],'2012-07':[3,5],'2012-08':[10,11],'2012-09':[7,10],'2012-10':[1,2],'2012-12':[2,2],'2013-01':[6,10],'2013-02':[19,26],'2013-03':[2,4],'2013-04':[5,8],'2013-05':[4,5],'2013-06':[4,4]});
$('#someId2').data({'bbox':[197131.7,7564525.9,198932.0,7565798.1],'2011-07':[39,51],'2011-08':[2,3],'2011-09':[4,5],'2011-10':[13,14],'2011-11':[40,42],'2011-12':[21,25],'2012-01':[10,11],'2012-02':[26,31],'2012-03':[27,35],'2012-04':[8,10],'2012-05':[24,36],'2012-06':[4,7],'2012-07':[25,30],'2012-08':[9,11],'2012-09':[42,52],'2012-10':[4,7],'2012-11':[17,22],'2012-12':[7,8],'2013-01':[21,25],'2013-02':[5,8],'2013-03':[8,11],'2013-04':[28,40],'2013-05':[55,63],'2013-06':[1,1]});
$('#...').data(...); ... more 50 similar lines...