【问题标题】:dynamic elements and click events not firing动态元素和点击事件未触发
【发布时间】:2015-07-31 17:46:16
【问题描述】:

我正在从列表中生成元素,每个元素都会有一个点击事件。 这都在同一个局部视图中,每经过 X 秒刷新一次。

第一次初始加载不起作用。每次自动刷新局部后都可以正常工作。

所有(文档).ready 事件触发。

点击事件之外的其他代码触发就好了。

循环显示

<div id="@overview.GroupType.Name" class="tile @overview.AlertType.MetroBG ui-widget-content draggable" data-role="tile" style="z-index: 2;">
    <div class="tile-content iconic" style="z-index: 2;">
        <span class="icon @overview.AlertType.MetroImage @overview.AlertType.MetroFG"></span>
        <span class="tile-badge @overview.AlertType.MetroBadgeBG @overview.AlertType.MetroBadgeFG">@overview.BadgeCount.ToString()</span>
        <span class="tile-label no-padding fg-white">@overview.GroupType.Description</span>
    </div>
</div>

(document).ready 的脚本部分中的循环生成以下内容

$('#@overview.GroupType.Name').on("click", function () {
    alert('click');
    $.ajax({
        type: 'GET',
        url: '@Url.Action("LoadDetail", "Home")',
        dataType: 'html',
        data: { 'groupName': '@overview.GroupType.Name' },
        async: true,
        cache: false,
        success: function (data) {
            $("#monitorDetail").html(data);
            },
            error: function (xhr, status) {
        }
        })
    });

我读了几篇文章说你必须使用 .on("click" ...) 所以我不知道还有什么要研究的。

【问题讨论】:

  • 您应该在 partilview 加载后调用它,使用 Success 函数。
  • @Fals 因为控制器正在将所需的模型传递给视图,在加载第一个视图后,我是否必须调用具有相同模型的另一个视图来生成点击事件?由于所有代码都在同一个视图中并且正在自动刷新,为什么这在第二次尝试而不是第一次初始加载时有效?
  • 您在主视图加载后渲染内容。渲染每个局部视图后,您必须调用将任何内容绑定到新 DOM 的函数
  • @Tsukasa 那个 div 是动态元素吗?
  • @Fals 控制器传递给局部视图的模型包含生成代码的数据。您是说在加载有问题的部分后从主视图中我需要生成 jQuery 事件吗?这意味着我需要让我的主视图保存部分模型以在之后加载事件?

标签: javascript jquery razor model-view-controller


【解决方案1】:
$('body').on('click', '#@overview.GroupType.Name', function(){
    // do stuff here
});

您可以将 body 选择器替换为动态 div 的非动态父级。我希望这是有道理的。

【讨论】:

    【解决方案2】:

    这就是我从你的问题中得到的,但仍然有点混乱:

    1) 您每 5 秒使用 ajax 动态地将某些内容加载到主视图中。

    2) 发生这种情况时,您需要将事件绑定到此动态内容中的某些内容。

    3) 它不工作(肯定不行,你问我们)。

    解决方案:

    您必须在部分刷新之后在成功方法处绑定任何事件。为什么?因为你改了DOM,第一个$('document').ready第一次没有发现这个用ajax加载的内容。

    $('#@overview.GroupType.Name').on("click", function () {
        alert('click');
        $.ajax({
            type: 'GET',
            url: '@Url.Action("LoadDetail", "Home")',
            dataType: 'html',
            data: { 'groupName': '@overview.GroupType.Name' },
            async: true,
            cache: false,
            success: function (data) {
                $("#monitorDetail").html(data);
            //Bind the events to for anything after loading the content
                },
                error: function (xhr, status) {
            }
            })
        });
    

    只有当脚本在主视图中时,上面的脚本才有效,因为它需要 Razor Server Render 来构建 id '#@overview.GroupType.Name'。您不能在部分使用动态脚本。 Ajax 不会执行此脚本。

    【讨论】:

    • 好的,所以事件存在于部分中,我必须将它移到主要部分才能正常工作?
    • 是的!任何 JavaScript 都应该留在主视图中,否则不会执行
    猜你喜欢
    • 1970-01-01
    • 2012-12-07
    • 2011-05-06
    • 2023-03-22
    • 1970-01-01
    • 2018-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多