【问题标题】:jQuery load script executes many timesjQuery加载脚本执行多次
【发布时间】: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代码,我仍然需要知道你是如何创建和添加&lt;a&gt;元素的,还需要知道$("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


【解决方案1】:

尝试添加此代码

$("a[data-ajax='true']").on('click', function (event) {

    event.stopImmediatePropagation();

    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);
        });
    });
});

参考:http://api.jquery.com/event.stopimmediatepropagation/

【讨论】:

  • 哇,这太疯狂了。背后是什么?能不能给我描述一下,我好想看懂。
  • @MichaelBaarz 尽可能多地向我提供您的 HTML 和脚本。然后我将解释为什么在你的应用程序中发生双倍事件。告诉我你的网络应用是 SPA 还是单页应用。
  • 我在上面添加了所有细节(希望如此)。我也必须调用 event.preventDefault() 才能使用正常的 A 工作方式。我对你的回答很感兴趣!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-25
  • 2011-11-09
  • 1970-01-01
  • 1970-01-01
  • 2011-11-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多