Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jquery 将站点转换为页面之间的AJAX转换(也称为完整页面AJAX)_Jquery_Ajax - Fatal编程技术网

Jquery 将站点转换为页面之间的AJAX转换(也称为完整页面AJAX)

Jquery 将站点转换为页面之间的AJAX转换(也称为完整页面AJAX),jquery,ajax,Jquery,Ajax,我们有相当标准的网站,我的任务是将页面之间的链接转换为AJAX调用,但是保持直接链接(例如,来自搜索引擎的链接)也能正常工作 我的目标: 保持直接链接像以前一样工作(旧IE使用散列回退),从通过直接链接到达平滑过渡到使用AJAX进一步浏览 实现一些“垃圾收集”(以前查看的页面的DOM、脚本处理程序等) 我在jQuery Mobile中也看到过类似的情况,但我正在寻找更通用的解决方案,从中获得灵感(或借用代码):通过AJAX而不是自然的HTTP行为加载页面相对容易实现。这只是劫持链接、停止默认

我们有相当标准的网站,我的任务是将页面之间的链接转换为AJAX调用,但是保持直接链接(例如,来自搜索引擎的链接)也能正常工作

我的目标:

  • 保持直接链接像以前一样工作(旧IE使用散列回退),从通过直接链接到达平滑过渡到使用AJAX进一步浏览
  • 实现一些“垃圾收集”(以前查看的页面的DOM、脚本处理程序等)

我在jQuery Mobile中也看到过类似的情况,但我正在寻找更通用的解决方案,从中获得灵感(或借用代码):

通过AJAX而不是自然的HTTP行为加载页面相对容易实现。这只是劫持链接、停止默认点击行为和执行AJAX魔术的问题

$(document).on('a', 'click', function (e) {
    e.preventDefault();
    // perform your AJAX
});

有点头疼的是爬行。您将需要编写客户端和服务器端代码,以使Google实现这一点(这基本上是真正重要的,对吧?)。您将希望通过AJAX而不是自然的HTTP行为加载页面相对容易实现。这只是劫持链接、停止默认点击行为和执行AJAX魔术的问题

$(document).on('a', 'click', function (e) {
    e.preventDefault();
    // perform your AJAX
});

有点头疼的是爬行。您将需要编写客户端和服务器端代码,以使Google实现这一点(这基本上是真正重要的,对吧?)。您需要

确定首先您需要能够分离外部和内部链接。为此,我编写了以下JQuery选择器:

$.expr[':'].internal = function (obj) {
    return (obj.hostname == location.hostname);
};

$.expr[':'].external = function (obj) {
    return (obj.hostname != location.hostname);
};
这允许您选择所有内部或外部链接
$(“a:internal”)..

接下来,您需要覆盖所有内部链接上的单击事件,覆盖默认行为抓取Href url并对Href url执行ajax请求,并将结果吐入正文

    $("a:internal").click(ajaxLinkHandler);

    function ajaxLinkHandler() {
       $.get($(this).attr("href"), function(data) {
       $('body').html(data);
     });
}
您还需要查看是否启用浏览器历史记录/后退按钮和地址栏更新。您还需要在服务器端检测AJAX请求并只返回
,或者返回所有内容并将上面的示例更改为
$(“html”).html(数据)。

您需要处理onLoad/DOM事件或使用新的JQuery“On”Handler
$(document)。在(“click”、“a”,ajaxLinkHandler)
上,当click事件冒泡到文档时,它将检查它是否是从锚标记启动的,因此不需要onReady事件


浏览器为您管理DOM垃圾收集。打开任何JQuery页面,转到firebug/chrome开发工具DOM选项卡并检查文档。然后转到console选项卡并键入$(“html”)。remove()返回DOM选项卡,您将看到它已被完全清除。您正在调用replace()而不是remove,因此旧的DOM元素将替换为AJAX调用中的新元素。

好的,首先您需要能够分离外部和内部链接。为此,我编写了以下JQuery选择器:

$.expr[':'].internal = function (obj) {
    return (obj.hostname == location.hostname);
};

$.expr[':'].external = function (obj) {
    return (obj.hostname != location.hostname);
};
这允许您选择所有内部或外部链接
$(“a:internal”)..

接下来,您需要覆盖所有内部链接上的单击事件,覆盖默认行为抓取Href url并对Href url执行ajax请求,并将结果吐入正文

    $("a:internal").click(ajaxLinkHandler);

    function ajaxLinkHandler() {
       $.get($(this).attr("href"), function(data) {
       $('body').html(data);
     });
}
您还需要查看是否启用浏览器历史记录/后退按钮和地址栏更新。您还需要在服务器端检测AJAX请求并只返回
,或者返回所有内容并将上面的示例更改为
$(“html”).html(数据)。

您需要处理onLoad/DOM事件或使用新的JQuery“On”Handler
$(document)。在(“click”、“a”,ajaxLinkHandler)
上,当click事件冒泡到文档时,它将检查它是否是从锚标记启动的,因此不需要onReady事件


浏览器为您管理DOM垃圾收集。打开任何JQuery页面,转到firebug/chrome开发工具DOM选项卡并检查文档。然后转到console选项卡并键入$(“html”)。remove()返回DOM选项卡,您将看到它已被完全清除。您正在调用replace(),而不是remove,因此旧的DOM元素将被AJAX调用中的新元素替换。

如何处理
onLoad
/
DOMReady
事件?执行
$(“html”).html(数据)
时是否会执行内联脚本?我在这里看到的主要问题是——我是否需要任何特殊的处理来从浏览器内存中删除旧的DOM数据(例如IE)?我在回答这些问题时添加了更多信息添加到页面时将执行联机脚本添加到页面时如何处理
onLoad
/
DOMReady
事件?执行
$(“html”).html(数据)
时是否会执行内联脚本?我在这里看到的主要问题是——我是否需要对从浏览器内存中删除旧DOM数据进行特殊处理(例如IE)?我在回答这些问题时添加了更多信息。添加到页面时将执行联机脚本感谢Google文档的链接。不幸的是,谷歌并不是这个网站上唯一的搜索引擎,所以我也需要在工作生活中保持直接链接。感谢谷歌文档的链接。不幸的是,谷歌不是这个网站上唯一的搜索引擎,所以我也需要在工作生活中保持直接链接。