我正在为微软SharePoint编写一个单页web应用程序。
我很想在$.get()上添加内容,但我遇到了一点麻烦。
如果我像这样拉入内容:
function getLocalPage(url, callback) {
$.get(url, function(data) {
var $page = $(data).filter('.tileContent').html();
callback($page);
});
}我得到了我正在寻找的节点,但是我的脚本标记被去掉了。
如果我像这样拉入内容:(参考:jquery html() strips out script tags )
function getLocalPage(url, callback) {
$.get(url, function(data) {
var dom = $(data);
dom.filter('script').each(function(){
$.globalEval(this.text || this.textContent || this.innerHTML || '');
});
var $page = dom.filter('.tileContent');
callback($page);
});
}嵌入在SharePoint中的javascript会放大我的页面,似乎会导致一个完整的回发。
有没有办法只获取我想要的节点,而脚本标记完好无损?
似乎不能两全其美。
发布于 2013-04-07 00:19:35
不使用简写的jQuery方法.get(),而是尝试使用.ajax()和dataType: 'html'
在.ajax()文档中提到了dataType: 'html':
HTML“
”:以纯文本形式返回;包含的脚本标记在插入到DOM中时进行计算。
它还说:
“如果指定了' HTML‘,则在将JavaScript作为字符串返回之前,将执行检索到的数据中嵌入的任何HTML。”
这里的重点是“之前”这个词,意思是嵌入式JavaScript在执行时不能直接作用于交付它的超文本标记语言(或产生的DOM片段),尽管它可以在插入片段之前直接作用于现有的DOM。
但是,包含在嵌入式JavaScript中的任何函数确实会变成可用,以便在HTML/ DOM片段和DOM上执行操作,如果后来调用的话。调用此类函数的第一个机会是在.ajax()成功处理程序(或链式.done()处理程序)中。
除非采取非常(并且可能是混乱的)措施,否则成功处理程序(或它调用的任何函数)将需要事先“知道”以这种方式交付的任何函数的名称,否则(实际上)它们将是不可调用的。
我不确定在$(function() {...});结构内交付的代码,它可能会在当前事件线程完成(?)时执行。如果是这样,那么它可能会作用于所传递的HTML/DOM-fragment。一定要试一下。
考虑到所有这些,尝试以下方法,在响应中使用适当的JavaScript短语。
function getLocalPage(url, callback) {
$.ajax({
url: url,
dataType: 'html',
success: function(data) {
callback($(data).find('.tileContent'));
}
});
}或者更好:
function getLocalPage(url, callback) {
$.ajax({
url: url,
dataType: 'html'
}).done(function(data) {
callback($(data).find('.tileContent'));
});
}备注:
.filter()更改为.find(),这似乎更合适,但您可能需要将其改回来。.ajax()选项。https://stackoverflow.com/questions/15848291
复制相似问题