我正在为Microsoft SharePoint编写单页Web应用程序。
我想用$.get()
提取内容,但我遇到了一些问题22。
如果我拉这样的内容:
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会打开我的页面,似乎会导致完整的回发。
有没有办法只获得我想要的节点,脚本标签完好无损? 似乎无法双管齐下。
答案 0 :(得分:1)
而不是简写的jQuery方法.get()
,请使用.ajax()
dataType: 'html'
.ajax()
文档说明dataType: 'html'
:
“html”:以纯文本形式返回HTML;包含的脚本标记在插入DOM时会被评估。
它还说:
“如果指定'html',则在将HTML作为字符串返回之前,将执行检索到的数据中的任何嵌入式JavaScript。”
这里强调的是“之前”这个词意味着嵌入式JavaScript在执行时不能直接直接在与其交付的HTML上(或由此产生的DOM片段),尽管在片段插入之前,它可以直接作用于现有DOM。
但是,嵌入式JavaScript中包含的任何函数确实变得可用可以对HTML / DOM片段和DOM进行操作,如果调用后即可。调用此类函数的第一个机会是.ajax()
成功处理程序(或链式.done()
处理程序)。
除非采取非常(并且可能是凌乱)的措施,否则成功处理程序(或由它调用的任何函数)将需要事先“知道”以这种方式提供的任何函数的名称,否则(实际上)它们将不可赎回。
我不确定在$(function() {...});
结构中传递的代码,可能在当前事件线程完成时执行(?)。如果是这样,那么可能可能会对传递的HTML / DOM片段起作用。一定要试试。
考虑到所有这些,请尝试以下方法,并在响应中使用适当的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()
个选项。