2011-02-11 6 views
1

Я хочу сделать что-то вроде этого:Помощь в JQuery селекторы

var showLi = $("<li></li>"); 
$(showLi).append("<a href='#' class='showData'>Show</a>"); 
$($ul).append(showLi); 
$(showLi+" a.showData").click(function(){ 
alert("clicked"); 
}); 

выше код дает ошибку, когда я использовал селектор для добавления нажмите метод. Что может быть другим способом?

Благодаря

+0

Это распространенное недоразумение. showLi не является строкой, это объект. Смотри ниже. – xzyfer

ответ

3

Вы можете сделать так:

var showLi = $("<li></li>"); 
$("<a href='#' class='showData'>Show</a>").appendTo(showLi).click(function(){ 
    alert("clicked"); 
}); 
$ul.append(showLi); 

Это позволяет избежать поиска элемента снова , showLi уже является объектом jQuery, поэтому вы не должны передавать его снова $(). По наименованию переменной $ul я предполагаю, что его значение также является jQuery. Если это не так, вам действительно нужно передать его $().

В качестве альтернативы, вы можете создать элемент с:

$('<a />', {href: '#', class: 'showData', text: 'Show'}) 

Вы получаете ошибку, потому что вы пытаетесь объединить объект со строкой. Если у вас уже есть объект jQuery, вы можете искать потомков с помощью find().

+0

Спасибо Феликс, но я хотел узнать что-то другое, кроме find(). – Bhupi

+0

@Bhupi: Вы также можете передать это как контекст, как другие показали '$ ('a.showData', showLi)'. Но есть только эти две возможности, если вы ищете потомков. Или вы избегаете поиска вообще, как я показал. Но почему бы вам не использовать 'find()'? –

1

Использование showLi в контексте:

$("a.showData",showLi).click([...]) 
0

Попробуйте это:

var showLi = $("<li></li>"); 
$(showLi).append("<a href='#' class='showData'>Show</a>"); 
$($ul).append(showLi) 
$("a.showData", showLi).click(function(){ 
    alert("clicked"); 
}); 
2

Чтобы связать обработчик событий, вам необходимо использовать делегат(), поскольку он не находится в DOM при загрузке страницы. live() также будет работать, но делегат будет более эффективным.

Вот пример:

+0

Вы не * должны * использовать 'delegate()' или 'live()', но в зависимости от контекста кода это может быть действительно более простой вариант. –

0

Что об этом?

<script language="Javascript" type="text/javascript"> 
$(document).ready(function(){ 
    var showLi = $("<li></li>"); 
    $(showLi).append("<a href='#' class='showData'>Show</a>"); 
    $('#test').append(showLi); 
    $("a.showData").click(function(){ 
    alert("clicked"); 
    }); 
}); 
</script> 
<div id='test'></div> 
Смежные вопросы