【发布时间】:2015-07-08 08:32:58
【问题描述】:
我有一个简单的方法可以加载内容并将其替换为 div 元素:
$("a[data-ajax='true']").on('click', function (event) {
event.preventDefault();
var goToLink = this.href;
animateLink(this);
$('#ajax-target').fadeTo(0.2, 0.5, function () {
lastLink = currentLink;
currentLink = goToLink;
$('#ajax-target').load(goToLink, {}, function () {
$('body').scrollTop(0);
$('#ajax-target').fadeTo('slow', 1);
});
});
});
现在我加载每个包含以下代码的 ajax HTML 代码:
<script>
console.log('Running...')
</script>
第一次单击加载 ajax 的链接时,我在控制台上按预期看到“正在运行...”。我第二次这样做时,“正在运行...”在控制台上打印了两次。第三次此消息我在控制台上收到 4 次,依此类推。我无法弄清楚问题出在哪里。当我按 ajax 请求加载 HTML 代码并按 html() 方法替换它时,同样的问题。有人知道出了什么问题吗?
编辑 在这里回答之后,我现在有了以下代码:
<script>
var currentLink, lastLink;
function animateLink(obj) {
var el = $(obj);
var animate = el.attr('data-animation');
if (animate != undefined) {
animate = animate.toLowerCase();
animate = animate == 'false' ? false : true;
} else {
animate = true;
}
if (animate) {
el.toggle('explode');
}
}
$(document).ready(function () {
$("a[data-ajax='true']").on('click', function (event) {
event.stopImmediatePropagation();
event.preventDefault();
var goToLink = this.href;
animateLink(this);
$('#ajax-target').fadeTo(0.2, 0.5, function () {
lastLink = currentLink;
currentLink = goToLink;
$('#ajax-target').load(goToLink, {}, function () {
$('body').scrollTop(0);
$('#ajax-target').fadeTo('slow', 1);
});
});
});
});
function historyBack() {
$('#ajax-target').fadeTo(0.2, 0.5, function () {
var newLink = lastLink;
lastLink = this.href;
currentLink = newLink;
$.get(newLink, {}, function (response) {
$('body').scrollTop(0);
$('#ajax-target')
.html(response)
.fadeTo('slow', 1);
});
});
}
</script>
这直接位于网站上。 ajax 请求完成后,这部分不会被删除。始终更改的部分如下:
<div class="content-wrapper" id="ajax-target">
@Html.Partial("LayoutContentHeader")
<section class="content">
@RenderBody()
</section>
</div>
加载的页面是一个 MVC 页面,其中的主框架不包含任何 HTML 或 BODY 标记,只有需要替换的内容,有时还有脚本(我上面的脚本如何):
@if (IsAjax)
{
if (isMainLayout)
{
@Html.Partial("LayoutContentHeader")
<section class="content">
@RenderBody()
</section>
}
else
{
@RenderBody()
}
<script>
$(function () {
$('[data-toggle="tooltip"]').tooltip()
})
</script>
}
如你所见,当我们在一个ajax请求时,我只发送重要的内容。
点击链接的代码例如:
<a href="/wilhelmshaven/hse/" data-ajax="true" class="btn btn-block btn-social" style="color: white !important; background-color: rgb(243,156,18)">
<i class="fa fa-th"></i>HSE
</a>
周围没有链接(这可能会导致冒泡)。
【问题讨论】:
-
鉴于上面的sn-ps代码,我仍然需要知道你是如何创建和添加
<a>元素的,还需要知道$("a[data-ajax='true']").on('click', function (event)哪些标题有这个声明?您是否正在动态添加a元素?还是您的部分视图之一具有静态 HTML? -
两者。首先,我完全加载包含链接(这种 ajax 类型)的页面。加载的页面包含相同的链接。我现在将向您发送一条私人消息,其中包含初始 HTML 的完整代码以及带有 ajax 加载内容的完整代码。等一下。
-
啊不能发私信。我的信息够吗?我注意到 stopImmediatePropagation() 停止了事件的冒泡。但这不是问题,A标签没有嵌套。
-
当您动态添加
.on()事件目标时会发生这种情况,或者事件声明也可能重复。人们无法复制您的错误,因为您的代码看起来很好并且应该在没有这种行为的情况下工作。因此,我高度怀疑您的部分视图之一呈现了事件声明,或者您添加a元素的代码有问题。这就是为什么我想尽可能多地获取您的代码以获取确切的因素。 -
正如我之前提到的,这两个因素是最重要的。 你如何添加
a元素和你在哪里以及通过什么方式声明点击事件而且你的historyback()中的redering内容是高度可疑的,看来。
标签: javascript jquery html ajax asp.net-mvc