0

我正在为 Microsoft SharePoint 编写一个单页 Web 应用程序。

我想用 提取内容$.get(),但我遇到了一些问题 22。

如果我像这样拉入内容:

function getLocalPage(url, callback) {
    $.get(url, function(data) {
        var $page = $(data).filter('.tileContent').html();
        callback($page);
    });
}

我得到了我正在寻找的节点,但我的脚本标签已被删除。

如果我像这样拉入内容:(参考:jquery html() 剥离脚本标签

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 炸毁了我的页面,并且似乎导致了完整的回发。

有什么方法可以只获取我想要的节点,并且脚本标签完好无损?
似乎不能两全其美。

4

1 回答 1

1

而不是简写的 jQuery 方法.get(),尝试.ajax()使用dataType: 'html'

.ajax()文件说dataType: 'html'

“html”:以纯文本形式返回 HTML;包含的脚本标签在插入 DOM 时进行评估。

它还说:

“如果指定了‘html’,则检索数据中的任何嵌入 JavaScript 都会在 HTML 作为字符串返回之前执行。”

这里的重点是“之前”这个词,这意味着嵌入式 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()选择。
于 2013-04-06T16:19:34.563 回答