javascript - Jquery - 单击时不适用于动态加载的元素
问题描述
我有一个 cookie 横幅,它通过 JS 加载到 DOM 中,我正在尝试向该横幅上的关闭按钮添加一个点击事件。
jQuery(document).ready(function() {
jQuery( 'body' ).on( 'click', '.ui-dialog-titlebar-close', function() {
console.log('click');
});
});
谁能告诉我如何让这个点击功能注册?我不明白为什么上面的代码不起作用。当我将选择器更改为在第一个实例中加载到页面上的元素并且它正常工作时,它工作正常,只是不喜欢动态加载的元素?
编辑:
这是完整的代码:
function setBannerCookie(){
if(typeof tealiumBanner.setBannerCookie === 'function'){
tealiumBanner.setBannerCookie();
}
}
function setBannerCookie() {
jQuery.cookie ("mmmBanner", "accepted", {expires:365, path:"/"});
jQuery("#cookieBox").animate({height:"toggle"}, 500);
var optOutMultiCookie = jQuery.cookie("OPTOUTMULTI");
var cookieArray = optOutMultiCookie.split('|');
for(var i=0;i<cookieArray.length;i++){
var itemArray = cookieArray[i].split(':');
newItem = itemArray[0] + ":0";
cookieArray[i] = newItem;
}
cd = new Date();
cd.setDate(cd.getDate() + 90);
document.cookie = 'OPTOUTMULTI=' + cookieArray.join("|") + ';path=/;domain=' + utag.cfg.domain + ';expires=' + cd.toGMTString() + ";";
}
jQuery(document).ready(function() {
if (jQuery.cookie("mmmBanner") == undefined) {
jQuery.cookie ("mmmBanner", "waiting", {expires:365, path:"/"});
}
jQuery("#mmmCorpCookie").click(function (e) {
e.preventDefault();
if (typeof __tealiumMo2Div == 'undefined') {__tealiumMo2Div = document.createElement('SCRIPT');__tealiumMo2Div.type = 'text/javascript';__tealiumMo2Div.src = '//tags.tiqcdn.com/utag/3m/offp-it-it/prod/utag.tagsOptOut.js?cb='+Math.random();document.getElementsByTagName('head')[0].appendChild(__tealiumMo2Div);}else{__tealium.load();}
});
if (jQuery.cookie("mmmBanner") == undefined) {
jQuery.cookie ("mmmBanner", "waiting", {expires:365, path:"/"});
}
if (jQuery.cookie("mmmBanner") === "waiting") {
(function () {if (typeof __tealiumMo2Div == 'undefined') {__tealiumMo2Div = document.createElement('SCRIPT');__tealiumMo2Div.type = 'text/javascript';__tealiumMo2Div.src = '//tags.tiqcdn.com/utag/3m/offp-it-it/prod/utag.tagsOptOut.js?_cb='+Math.random();document.getElementsByTagName('head')[0].appendChild(__tealiumMo2Div);}else{__tealium.load();}})();
}
});
/*!
* jQuery Cookie Plugin v1.4.1
* https://github.com/carhartl/jquery-cookie
*
* Copyright 2013 Klaus Hartl
* Released under the MIT license
*/
(function (factory) {
if (typeof define === 'function' && define.amd) {
// AMD
define(['jquery'], factory);
} else if (typeof exports === 'object') {
// CommonJS
factory(require('jquery'));
} else {
// Browser globals
factory(jQuery);
}
}(function ($) {
var pluses = /\+/g;
function encode(s) {
return config.raw ? s : encodeURIComponent(s);
}
function decode(s) {
return config.raw ? s : decodeURIComponent(s);
}
function stringifyCookieValue(value) {
return encode(config.json ? JSON.stringify(value) : String(value));
}
function parseCookieValue(s) {
if (s.indexOf('"') === 0) {
// This is a quoted cookie as according to RFC2068, unescape...
s = s.slice(1, -1).replace(/\\"/g, '"').replace(/\\\\/g, '\\');
}
try {
// Replace server-side written pluses with spaces.
// If we can't decode the cookie, ignore it, it's unusable.
// If we can't parse the cookie, ignore it, it's unusable.
s = decodeURIComponent(s.replace(pluses, ' '));
return config.json ? JSON.parse(s) : s;
} catch(e) {}
}
function read(s, converter) {
var value = config.raw ? s : parseCookieValue(s);
return $.isFunction(converter) ? converter(value) : value;
}
var config = $.cookie = function (key, value, options) {
// Write
if (value !== undefined && !$.isFunction(value)) {
options = $.extend({}, config.defaults, options);
if (typeof options.expires === 'number') {
var days = options.expires, t = options.expires = new Date();
t.setTime(+t + days * 864e+5);
}
return (document.cookie = [
encode(key), '=', stringifyCookieValue(value),
options.expires ? '; expires=' + options.expires.toUTCString() : '', // use expires attribute, max-age is not supported by IE
options.path ? '; path=' + options.path : '',
options.domain ? '; domain=' + options.domain : '',
options.secure ? '; secure' : ''
].join(''));
}
// Read
var result = key ? undefined : {};
// To prevent the for loop in the first place assign an empty array
// in case there are no cookies at all. Also prevents odd result when
// calling $.cookie().
var cookies = document.cookie ? document.cookie.split('; ') : [];
for (var i = 0, l = cookies.length; i < l; i++) {
var parts = cookies[i].split('=');
var name = decode(parts.shift());
var cookie = parts.join('=');
if (key && key === name) {
// If second argument (value) is a function it's a converter...
result = read(cookie, value);
break;
}
// Prevent storing a cookie that we couldn't decode.
if (!key && (cookie = read(cookie)) !== undefined) {
result[name] = cookie;
}
}
return result;
};
config.defaults = {};
$.removeCookie = function (key, options) {
if ($.cookie(key) === undefined) {
return false;
}
// Must not alter options, thus extending a fresh object...
$.cookie(key, '', $.extend({}, options, { expires: -1 }));
return !$.cookie(key);
};
}));
jQuery(document).ready(function() {
jQuery( 'body' ).on( 'click', '.ui-dialog-titlebar-close', function() {
console.log('click');
});
});
解决方案
将其从 Jquery(document).ready 中删除,因为您的内容在页面加载后动态加载,因此不需要它。
而是使用以下并将其放在之前</body>
jQuery(document).on( 'click', '.ui-dialog-titlebar-close', function() {
console.log('click');
});
推荐阅读
- xaml - 如何在 Xamarin Forms 中强制子控件或布局与父控件的宽度相同?
- android - Android proguard 预期 [!]interface|@interface|class|enum
- bash - 将 bash 函数中运行的命令保存到历史记录
- keras - 计算自定义图像特征
- javascript - 尝试访问 covid 数据的 API 时出现错误未定义 176
- flutter - Flutter:如何为 Draggable 小部件设置边界?
- ios - 将获取的数据作为 Int 输出到变量
- python - 购物车数据库未显示订购的单个商品数量
- python - 训练 LSTM 比 GRU 快,但不应该吗?
- python - django ValidationError 未在测试中引发但在 shell 中引发