使用Javascript完整加​​载ASPX页面,有一个扭曲

时间:2013-04-06 07:35:24

标签: javascript jquery sharepoint get

我正在为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会打开我的页面,似乎会导致完整的回发。

有没有办法只获得我想要的节点,脚本标签完好无损? 似乎无法双管齐下。

1 个答案:

答案 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()个选项。