亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

動態創建元素的事件綁定?

動態創建元素的事件綁定?

青春有我 2019-05-20 15:04:24
我有一些代碼,我循環遍歷頁面上的所有選擇框,并將.hover事件綁定到它們,以便在它們的寬度上做一些麻煩mouse on/off。這發生在頁面準備就緒并且工作得很好。我遇到的問題是,我在初始循環后通過Ajax或DOM添加的任何選擇框都不會受到事件限制。我找到了這個插件(jQuery Live Query Plugin),但在我用插件添加另外5k到我的頁面之前,我想知道是否有人知道這樣做的方法,無論是直接使用jQuery還是通過其他選項。
查看完整描述

11 回答

?
子衿沉夜

TA貢獻1828條經驗 獲得超3個贊

從jQuery 1.7開始,你應該使用jQuery.fn.on

$(staticAncestors).on(eventName, dynamicChild, function() {});

在此之前,推薦的方法是使用live()

$(selector).live( eventName, function(){} );

但是,live()在1.7中贊成使用on(),并在1.9中完全刪除。該live()簽名:

$(selector).live( eventName, function(){} );

...可以用以下on()簽名替換:

$(document).on( eventName, selector, function(){} );

例如,如果您的頁面是動態創建具有類名的元素,dosomething您可以將事件綁定到已存在的父項(這是問題的核心,您需要存在要綁定的內容,不要綁定到動態內容),這可能是(也是最簡單的選擇)document。雖然記住document可能不是最有效的選擇

$(document).on('mouseover mouseout', '.dosomething', function(){
    // what you want to happen when mouseover and mouseout 
    // occurs on elements that match '.dosomething'});

綁定事件時存在的任何父級都可以。例如

$('.buttons').on('click', 'button', function(){
    // do something here});

適用于

<div class="buttons">
    <!-- <button>s that are generated dynamically and added here --></div>


查看完整回答
反對 回復 2019-05-20
?
臨摹微笑

TA貢獻1982條經驗 獲得超2個贊

這是一個沒有任何庫或插件的純JavaScript解決方案:

document.addEventListener('click', function (e) {
    if (hasClass(e.target, 'bu')) {
        // .bu clicked
        // Do your thing
    } else if (hasClass(e.target, 'test')) {
        // .test clicked
        // Do your other thing
    }}, false);

這里hasClass

function hasClass(elem, className) {
    return elem.className.split(' ').indexOf(className) > -1;}

Live demo

歸功于Dave和Sime Vidas

使用更現代的JS,hasClass可以實現為:

function hasClass(elem, className) {
    return elem.classList.contains(className);}


查看完整回答
反對 回復 2019-05-20
?
浮云間

TA貢獻1829條經驗 獲得超4個贊

您可以在創建對象時向對象添加事件。如果要在不同時間向多個對象添加相同的事件,則可能需要創建命名函數。

var mouseOverHandler = function() {
    // Do stuff};var mouseOutHandler = function () {
    // Do stuff};$(function() {
    // On the document load, apply to existing elements
    $('select').hover(mouseOverHandler, mouseOutHandler);});
    // This next part would be in the callback from your Ajax call$("<select></select>")
    .append( /* Your <option>s */ )
    .hover(mouseOverHandler, mouseOutHandler)
    .appendTo( /* Wherever you need the select box */ );


查看完整回答
反對 回復 2019-05-20
?
繁華開滿天機

TA貢獻1816條經驗 獲得超4個贊

您可以簡單地將事件綁定調用包裝到一個函數中,然后調用它兩次:一次是在文檔準備就緒,一次是在添加新DOM元素的事件之后。如果這樣做,您將希望避免在現有元素上綁定相同的事件兩次,因此您需要解除現有事件的綁定或(更好)僅綁定到新創建的DOM元素。代碼看起來像這樣:

function addCallbacks(eles){
    eles.hover(function(){alert("gotcha!")});}$(document).ready(function(){
    addCallbacks($(".myEles"))});// ... add elements ...addCallbacks($(".myNewElements"))


查看完整回答
反對 回復 2019-05-20
?
森欄

TA貢獻1810條經驗 獲得超5個贊

嘗試使用.live()而不是.bind(); 在執行Ajax請求后,.live()它將綁定.hover到您的復選框。


查看完整回答
反對 回復 2019-05-20
?
小怪獸愛吃肉

TA貢獻1852條經驗 獲得超1個贊

我更喜歡使用選擇器并將其應用于文檔。

這將綁定在文檔上,并將適用于頁面加載后將呈現的元素。

例如:

$(document).on("click", $(selector), function() {
    // Your code here});


查看完整回答
反對 回復 2019-05-20
?
明月笑刀無情

TA貢獻1828條經驗 獲得超4個贊

記下放置元素的“MAIN”類,例如

<div class="container">
     <ul class="select">
         <li> First</li>
         <li>Second</li>
    </ul></div>

在上面的場景中,jQuery將觀看的MAIN對象是“容器”。

然后,你將主要有元素的名稱下的容器,如ul,liselect

$(document).ready(function(e) {
    $('.container').on( 'click',".select", function(e) {
        alert("CLICKED");
    });
 });


查看完整回答
反對 回復 2019-05-20
  • 11 回答
  • 0 關注
  • 1018 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號