0

我有两个编码完全相同的文件,文件 A 和 B。在文件 A 中,有一些链接可以创建文件 B 的弹出窗口。在文件 A 的顶部,我创建了一个链接(a href),单击该链接时,提醒用户。这个确切的代码在文件 B 中。它在文件 A 中有效,但在文件 B 中无效。

    <a href="#" id="send-email">Send Email</a>

和 jQuery:

    $('#send-email').click(function(e) {
        alert('works');
    });

奇怪的是,它们都链接到同一个外部 jQuery 文件,并且那里的所有其他 jQuery 函数都可以工作(例如,手风琴菜单),除了这个弹出点击。我首先尝试使用 jQueryUI,但这就是我发现这个问题的方式;然后我只使用准系统点击警报,这就是我在上面发布的代码。

.click 在弹出窗口中有效吗?如果是这样,怎么做?

4

3 回答 3

1

弹出窗口实际上与任何其他页面没有什么不同(除非您在某些浏览器中谈论会话状态和上下文,但这不是这里的问题)。click在弹出窗口中的功能与在任何其他窗口中的功能相同。但是,有很多事情可能会导致您的问题。重复的 ID、缺少/拼写错误的功能等。

所以我还不能给你一个明确的答案,但这是调试它的一个很好的步骤:

而不是像你这样做的方式附加一个点击事件(注意你的方式比我的方式正确得多,但我的方式有助于调试),这样做:

<a href="#" onclick = "alert('works')" id="send-email">Send Email</a>

如果这不起作用,也许你正在阻止弹出窗口或其他东西。这是警报的问题。如果它确实有效,请尝试以下操作:

<a href="#" onclick = "AlertIt()" id="send-email">Send Email</a>

在您的页面上的其他地方:

function AlertIt() {
alert("worked");
}

如果这也有效,那么您很可能会看到加载 jQuery 的问题或 jQuery 冲突。

编辑:哦,还有一件事。尝试使用 jQuery 的live函数。这会将事件处理程序附加到元素,无论它们是否已经存在。click如果元素已经存在,只会附加事件。这可能是由您正在使用的操作顺序引起的。

live看起来像这样:

$("#send-email").live("click", function(){ alert("Worked"); });
于 2012-08-22T17:30:31.993 回答
1

同意@voigtan。为动态内容分配事件处理程序可能很棘手。

如果您在文档就绪处理程序中绑定事件,则事件处理程序可能未绑定到弹出窗口中的内容。有两种方法可以解决这个问题:

  1. 弹出内容显示后有回调,为新元素绑定事件
  2. 如果元素具有统一的事件处理程序,则为它们分配一个可用作选择器的类,并使用 jQuery::live() 调用附加事件。这是一个例子:

    <a href="#" class="send-email">Send Email</a>
    
    $(function() {
        $(document).on("click", "a.send-email", function(e) {
            alert('works');
            e.preventDefault();
        });
    });
    
于 2012-08-22T17:43:41.690 回答
0

弹出窗口是什么意思?你的意思是jQueryUI对话框吗?如果是这样,当您加载 javascript 代码时标记是否存在?

.on如果您使用的是 jQuery 1.7+,则可以使用,并且只需#send-email在页面加载时对页面上的所有内容执行委托,或者使用 AJAX 以动态方式加载它:

$(function() {
    $(document).on("click", "#send-email", function(e) {
        alert('works');
        e.preventDefault();
    });
});
于 2012-08-22T17:23:52.587 回答