2014-08-31 233 views
3

我需要通過外部元素刪除元素。在以下示例中,用戶將關注.content元素,然後顯示.delete元素。通過點擊.delete-element應該刪除焦點.content-element。通過外部元素刪除元素

我的問題是如何識別元素。我試圖給這個元素一個id/class,但是當我點擊delete元素時,blur函數(這是用戶不刪除的情況下需要的,但是在其他地方單擊時)需要先刪除該類。

也許我試圖(通過增加臨時類)是走錯了路......

HTML:

<div class="delete" style="display: none;">Delete</div> 

<div class="content" contenteditable="true"></div> 
<div class="content" contenteditable="true"></div> 
<div class="content" contenteditable="true"></div> 
<div class="content" contenteditable="true"></div> 

JS:

$('.delete').on('click', function() { 
    $('.active').remove(); 
}); 
$('.content').on('focus', function() { 
    $(this).addClass('active'); 
    $('.delete').show(); 
}); 
$('.content').on('blur', function() { 
    $(this).removeClass('active'); 
    $('.delete').hide(); 
}); 

http://jsfiddle.net/ze1kvh0g/

更新:

http://jsfiddle.net/ze1kvh0g/9/

我想我需要模糊功能:也許用戶正在做的事情聚焦。內容元素之後完全地不同(即滾動或點擊任何其他網站)。在這種情況下,焦點會丟失,主動類不得不被移除。

我錯了嗎?

更新2:

這是(Pr0gr4mm3r的組合和Moshtaf的答案)工作方案:http://jsfiddle.net/ze1kvh0g/13/ 不知道該代碼可以優化變得有點小...

var activeElement, isOnDeleteButton = false; 
$(".delete").hover(function() { 
    isOnDeleteButton = true; 
}, function() { 
    isOnDeleteButton = false; 
}); 

$('.delete').on('click', function() { 
    if (activeElement) { 
     activeElement.remove(); 
     delete activeElement; 
    } 
    $(this).hide(); 
}); 
$('.content').on('focus', function() { 
    activeElement = $(this); 
    $('.delete').show(); 
}); 
$('.content').on('blur', function() { 
    if (!isOnDeleteButton) $('.delete').hide(); 
}); 

回答

3

試試這個:

var isOnDeleteButton = false; 
$(".delete").mouseenter(function() {isOnDeleteButton = true;}); 
$(".delete").mouseleave(function() {isOnDeleteButton = false;}); 

$('.delete').on('click', function() { 
    $('.active').remove(); 
    $('.delete').hide(); 
}); 
$('.content').on('focus', function() { 
    $(this).addClass('active'); 
    $('.delete').show(); 
}); 
$('.content').on('blur', function() { 
    if (!isOnDeleteButton){ 
     $(this).removeClass('active'); 
     $('.delete').hide(); 
    } 
}); 

Check JSFiddle Demo

+1

「試試這個」答案通常沒有用。說*你做了什麼/改變了,爲什麼*。 – 2014-08-31 08:07:30

+0

謝謝。這似乎工作。我只是想讓代碼變得更小...(可能使用懸停和切換) – user3142695 2014-08-31 08:47:04

0

您可以移除blur功能:

$('.delete').on('click', function() { 
    $('.active').remove();  
    // $('.delete').hide(); -> only if you want to hide the Delete button every time 
}); 
$('.content').on('focus', function() { 
    $('.active').removeClass('active'); 
    $(this).addClass('active'); 
    $('.delete').show(); 
}); 

我刪除了blur功能,因爲當用戶點擊另一個元素,所有的有源元件將被禁用。

+1

通過刪除'模糊'處理程序,您還刪除了部分功能。當關注內容項目時,「刪除」按鈕被隱藏。現在刪除按鈕總是在選擇內容項目後顯示,但在其他地方點擊時不會隱藏,除了刪除按鈕。 – Pr0gr4mm3r 2014-08-31 08:18:08

+0

是的,你是對的。我會嘗試更新我的解決方案。 – 2014-08-31 08:36:43

0

嘗試這種方式,不需要定義「模糊」只需刪除以前的活動,並將活動添加到當前內容。和這樣它變得簡單

$('.delete').on('click', function() { 

     $('.active').remove(); 
     $('.delete').hide(); 
    }); 

    $('.content').on('focus', function() { 

    $('.content').removeClass('active'); 
    $(this).addClass('active'); 
    $('.delete').show(); 

}); 

http://jsfiddle.net/ze1kvh0g/8/

+0

好吧也會更新我的答案 – mandar 2014-08-31 08:55:20

1

Simpliest的方法是隻臨時保存你的元素。
通過這種方式,您還可以避免使用臨時css-classes來污染您的元素,如果樣式不需要的話。

var activeElement; 
$('.delete').on('click', function() { 
    if(activeElement) { 
     activeElement.remove(); 
     delete activeElement; 
    } 
    $(this).hide(); 
}); 
$('.content').on('focus', function() { 
    $(this).addClass('active'); 
    $('.delete').show(); 
    activeElement = $(this); 
}); 
$('.content').on('blur', function() { 
    $(this).removeClass('active'); 
    $('.delete').hide(); 
}); 
+0

我試着用你的解決方案。我究竟做錯了什麼? http://jsfiddle.net/ze1kvh0g/10/ – user3142695 2014-08-31 09:12:04

+0

除了在click函數中缺少delete.hide(),我看不到任何其他問題。當我嘗試時,沒有「積極」的課程。也許你指的是contenteditable =「true」? – Pr0gr4mm3r 2014-08-31 09:20:17