jQuery: onClick 未定义?
jQuery: onClick Undefined?
我在使用 onclick 时遇到问题,特别是在下面的代码中看到的 onclick="Foo()"。单击时,我变得不确定,但我已将函数包含在顶部甚至函数之外。
$( document ).ready(function() {
function Foo() {
console.log('clicky click click');
document.getElementById('categoryBubble').style.display = 'none';
}
$('.mutliSelect select').on('change', function() {
var title = $(this).closest('.mutliSelect').find('option').val();
title = $(this).val() + "";
if ($(this).is(':selected')) {
// the code for if goes here
} else {
console.log('im working here #2');
var html = '<span id="categoryBubble" title="' + title + '">' + title + '</span>' + '<span onclick="Foo()" class="Xout">x</span>';
$('.multiSel').append(html);
$(".hida").hide();
}
});
});
Foo()
(它不是构造函数,因此不应以大写字母开头命名)在局部范围内限定为您传递给 ready 的匿名函数。
然后 onclick
事件处理程序开始寻找名为 Foo
的东西,它找不到它,因为它不在正确的范围内。
不要使用内在事件属性,它们有各种讨厌的问题,其中之一是您几乎被迫对它们使用全局变量。
使用 jQuery 函数生成 HTML,而不是将字符串混合在一起。使用 jQuery on
方法而不是 onclick
属性绑定您的事件处理程序。
$(function() {
function foo() {
console.log("clicky click click");
document.getElementById("categoryBubble").style.display = "none";
}
$(".mutliSelect select").on("change", function() {
var title = $(this)
.closest(".mutliSelect")
.find("option")
.val();
title = $(this).val() + "";
if ($(this).is(":selected")) {
// the code for if goes here
} else {
console.log("im working here #2");
var span = $("<span />")
.attr("id", "categoryBubble")
.attr("title", title)
.text(title);
var other_span = $("<span />")
.on("click", foo)
.addClass("Xout")
.text("x");
$(".multiSel").append(span);
$(".multiSel").append(other_span);
$(".hida").hide();
}
});
});
您的 foo
定义在 内部 document).ready
- 它不在顶层,因此当内联处理程序试图找到名为的全局函数时Foo
调用失败
要么把Foo
放在外面:
function Foo() {
console.log('clicky click click');
document.getElementById('categoryBubble').style.display = 'none';
}
$( document ).ready(function() {
// ...
或者,更好的是,完全避免内联处理程序,而是使用 Javascript 正确附加侦听器,从而允许您在当前范围内引用其他变量和函数:
const span1 = $('<span></span>')
.prop({
id: 'categoryBubble',
title
})
.text(title);
const span2 = $('<span></span>')
.prop('class', 'xOut')
.on('click', Foo);
$('.multiSel').append(span, span2);
另请注意,在 jQuery 的现代版本中,您可以使用
而不是 $( document ).ready()
$(() => {
// code here
相反。此外,在单个文档中具有多个 ID 是无效的 HTML;追加
<span id="categoryBubble"
多次(如果有可能,考虑到您可能拥有的其他代码)将无效。考虑改用 class。
<span class="categoryBubble"
如果您确实想要多次附加一个跨度,并且想要单击创建的跨度以删除与该跨度关联的 categoryBubble
,那么 ID 选择器将不起作用 - 相反,您可以引用之前在闭包中创建的跨度,并隐藏它:
const span2 = $('<span></span>')
.prop('class', 'xOut')
.on('click', () => {
span1.hide();
});
我在使用 onclick 时遇到问题,特别是在下面的代码中看到的 onclick="Foo()"。单击时,我变得不确定,但我已将函数包含在顶部甚至函数之外。
$( document ).ready(function() {
function Foo() {
console.log('clicky click click');
document.getElementById('categoryBubble').style.display = 'none';
}
$('.mutliSelect select').on('change', function() {
var title = $(this).closest('.mutliSelect').find('option').val();
title = $(this).val() + "";
if ($(this).is(':selected')) {
// the code for if goes here
} else {
console.log('im working here #2');
var html = '<span id="categoryBubble" title="' + title + '">' + title + '</span>' + '<span onclick="Foo()" class="Xout">x</span>';
$('.multiSel').append(html);
$(".hida").hide();
}
});
});
Foo()
(它不是构造函数,因此不应以大写字母开头命名)在局部范围内限定为您传递给 ready 的匿名函数。
然后 onclick
事件处理程序开始寻找名为 Foo
的东西,它找不到它,因为它不在正确的范围内。
不要使用内在事件属性,它们有各种讨厌的问题,其中之一是您几乎被迫对它们使用全局变量。
使用 jQuery 函数生成 HTML,而不是将字符串混合在一起。使用 jQuery on
方法而不是 onclick
属性绑定您的事件处理程序。
$(function() {
function foo() {
console.log("clicky click click");
document.getElementById("categoryBubble").style.display = "none";
}
$(".mutliSelect select").on("change", function() {
var title = $(this)
.closest(".mutliSelect")
.find("option")
.val();
title = $(this).val() + "";
if ($(this).is(":selected")) {
// the code for if goes here
} else {
console.log("im working here #2");
var span = $("<span />")
.attr("id", "categoryBubble")
.attr("title", title)
.text(title);
var other_span = $("<span />")
.on("click", foo)
.addClass("Xout")
.text("x");
$(".multiSel").append(span);
$(".multiSel").append(other_span);
$(".hida").hide();
}
});
});
您的 foo
定义在 内部 document).ready
- 它不在顶层,因此当内联处理程序试图找到名为的全局函数时Foo
调用失败
要么把Foo
放在外面:
function Foo() {
console.log('clicky click click');
document.getElementById('categoryBubble').style.display = 'none';
}
$( document ).ready(function() {
// ...
或者,更好的是,完全避免内联处理程序,而是使用 Javascript 正确附加侦听器,从而允许您在当前范围内引用其他变量和函数:
const span1 = $('<span></span>')
.prop({
id: 'categoryBubble',
title
})
.text(title);
const span2 = $('<span></span>')
.prop('class', 'xOut')
.on('click', Foo);
$('.multiSel').append(span, span2);
另请注意,在 jQuery 的现代版本中,您可以使用
而不是$( document ).ready()
$(() => {
// code here
相反。此外,在单个文档中具有多个 ID 是无效的 HTML;追加
<span id="categoryBubble"
多次(如果有可能,考虑到您可能拥有的其他代码)将无效。考虑改用 class。
<span class="categoryBubble"
如果您确实想要多次附加一个跨度,并且想要单击创建的跨度以删除与该跨度关联的 categoryBubble
,那么 ID 选择器将不起作用 - 相反,您可以引用之前在闭包中创建的跨度,并隐藏它:
const span2 = $('<span></span>')
.prop('class', 'xOut')
.on('click', () => {
span1.hide();
});