Javascript 在插入到页外dom时保留脚本标记,然后使用jquery插入到页面
我正在构建一个无限滚动例程,用于缓存要添加到页面外的行 我Javascript 在插入到页外dom时保留脚本标记,然后使用jquery插入到页面,javascript,jquery,ajax,dom,Javascript,Jquery,Ajax,Dom,我正在构建一个无限滚动例程,用于缓存要添加到页面外的行 我$。获取行并将它们添加到$(“”),然后每当我需要新行时,我都会从该dom向页面添加一行 我已经读到,当添加到dom时,jquery将去掉脚本标记,然后执行javascript 这似乎给我带来了一个问题,因为当jquery运行脚本时,元素在非页面dom中,而不是在主页dom中 如何保留脚本,以便在向页面添加页外元素时执行脚本? 我在中添加了警报,javascript似乎根本就不会执行,无论是在添加到离页dom还是实际的页面dom时,所以在
$。获取
行并将它们添加到$(“”)
,然后每当我需要新行时,我都会从该dom向页面添加一行
我已经读到,当添加到dom时,jquery将去掉脚本标记,然后执行javascript
这似乎给我带来了一个问题,因为当jquery运行脚本时,元素在非页面dom中,而不是在主页dom中
如何保留脚本,以便在向页面添加页外元素时执行脚本?
我在中添加了警报,javascript似乎根本就不会执行,无论是在添加到离页dom还是实际的页面dom时,所以在这成为问题之前,我可能失败了
获取新行并将其放置在离页dom中的代码:
var nextPageDOM = $('<div/>');
var jqxhr = $.get(data.nextPageURL, function(nextPageHTML) {
nextPageDOM.html($(nextPageHTML).find(data.settings.pagedContent));
// Get the elements to add to the page
data.nextPageElements = nextPageDOM.find(data.settings.rowSelector);
}
不知道许多变量指向何处是很难解决的问题,因此,如果我们假设data.settings.pagedContent指向页面上的DOM,为什么只查找与ajax响应中已有元素相同的元素呢? 另一方面,如果data.settings.pagedContent是一个选择器,我想知道脚本是否超出了选择器。如果您提供一个ajaxresponse示例,将非常有用 无论如何,如果您正在寻找一种避免jQuery脚本剥离的方法,那么可以执行以下操作: 创建辅助div容器
var $cont = $("<div/>");
然后从$cont中选择脚本并保存它们
$scripts = $cont.find("script");
现在您已经提取了脚本,您可以继续以与之前相同的方式进行缓存,但要分别处理html和脚本,并且在您希望在页面DOM中检索一些html时,您还可以将脚本附加到DOM中
希望能有所帮助,很抱歉在这里要求澄清,而不是在评论中,但我没有足够的声誉
编辑(2013-01-22)
jQuery核心功能中关于处理脚本标记解析的新闻,在jQuery 2.0测试版上实现(jQuery 1.9将是延续旧行为的最后一个版本)
从
在HTML内容中加载和运行脚本
1.9之前的任何HTML接受方法(例如,$(),.append()或
.wrap()执行HTML中的所有脚本,并将它们从
记录以防止再次执行。这个还是坏了
在脚本可能被删除并重新插入到
使用.wrap()等方法编写文档。从1.9开始,已插入脚本
在文档中执行,但留在文档中并标记为
已执行,因此即使已执行,也不会再次执行
移除并重新插入
尽管有这种变化,但混合可执行文件是非常糟糕的做法
将JavaScript转换为HTML标记;它具有设计性、安全性、可靠性和可靠性
性能影响。例如,包含外部脚本标记
在HTML中,数据是同步获取的,然后进行计算,这可能需要
大量的时间。没有要在何时或何时通知的接口
是否加载这些脚本,或在出现错误时采取纠正措施
这是一个错误
试图通过克隆现有脚本标记加载脚本的代码
将克隆注入文档将不再有效,
因为克隆的脚本标记已标记为已执行。到
加载新脚本时,请改用jQuery.getScript()
不知道许多变量指向何处是很难解决的问题,因此,如果我们假设data.settings.pagedContent指向页面上的DOM,为什么只查找与ajax响应中已有元素相同的元素呢? 另一方面,如果data.settings.pagedContent是一个选择器,我想知道脚本是否超出了选择器。如果您提供一个ajaxresponse示例,将非常有用 无论如何,如果您正在寻找一种避免jQuery脚本剥离的方法,那么可以执行以下操作: 创建辅助div容器
var $cont = $("<div/>");
然后从$cont中选择脚本并保存它们
$scripts = $cont.find("script");
现在您已经提取了脚本,您可以继续以与之前相同的方式进行缓存,但要分别处理html和脚本,并且在您希望在页面DOM中检索一些html时,您还可以将脚本附加到DOM中
希望能有所帮助,很抱歉在这里要求澄清,而不是在评论中,但我没有足够的声誉
编辑(2013-01-22)
jQuery核心功能中关于处理脚本标记解析的新闻,在jQuery 2.0测试版上实现(jQuery 1.9将是延续旧行为的最后一个版本)
从
在HTML内容中加载和运行脚本
1.9之前的任何HTML接受方法(例如,$(),.append()或
.wrap()执行HTML中的所有脚本,并将它们从
记录以防止再次执行。这个还是坏了
在脚本可能被删除并重新插入到
使用.wrap()等方法编写文档。从1.9开始,已插入脚本
在文档中执行,但留在文档中并标记为
已执行,因此即使已执行,也不会再次执行
移除并重新插入
尽管有这种变化,但混合可执行文件是非常糟糕的做法
将JavaScript转换为HTML标记;它具有设计性、安全性、可靠性和可靠性
性能影响。例如,包含外部脚本标记
在HTML中,数据是同步获取的,然后进行计算,这可能需要
大量的时间。没有要在何时或何时通知的接口
是否加载这些脚本,或在出现错误时采取纠正措施
这是一个错误
试图通过克隆现有脚本标记加载脚本的代码
将克隆注入文档将不再有效,
因为克隆人
var nextPageDOM = $('<div/>');
var jqxhr = $.get(data.nextPageURL, function(nextPageHTML) {
nextPageHTML = stripScripts(nextPageHTML ); // remove the script tag ;)
nextPageDOM.html($(nextPageHTML).find(data.settings.pagedContent));
// Get the elements to add to the page
data.nextPageElements = nextPageDOM.find(data.settings.rowSelector);
}
function getScripts(text) {
var SCRIPT_REGEX = /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi;
text = text.match(SCRIPT_REGEX);
return test; // you can use eval to execute the script or you can crete a script tag and insert the script in the tag and it will get executed
}
`<scr<script>Ha!</script>ipt> alert(document.cookie);</script>`
function stripScripts(text) {
var SCRIPT_REGEX = /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi;
while (SCRIPT_REGEX.test(text)) {
text = text.replace(SCRIPT_REGEX, "");
}
return test
}
$.ajax({url:data.nextPageURL, datatype:script, data:relevant_data_map,});
alert('this is running'); // or whatever
var nextPageDOM = $('<div/>');
nextPageDOM.html('this is from the server'); // or whatever
$(nextPageDOM).insertBefore("#end_of_content_mark");