2015-02-18 1 views
-2

Я хотел бы выбрать все элементы с атрибутом magic. Но я не люблю получать детей, у которых нет атрибута с именем magic.Есть ли способ выбрать только согласованные элементы, но не их дети в jQuery?

Выбранные элементы не должны изменять свой порядок в соответствии с родителем с атрибутом magic.

Например,

У меня есть HTML как это:

<div magic="row"> 
    <div magic="inputWrapper"> 
     <input magic="input"></input> 
     <input magic="input"></input> 
    </div> 
    <div> 
     <div class="row"> 
      <div> 
       <button magic="write">Write</button> 
      </div> 
      <div> 
       <button magic="delete">Delete</button> 
      </div> 
      <div> 
       <button magic="new">New</button> 
      </div> 
     </div> 
    </div> 
</div> 

То, что я хочу, чтобы получить это:

<div magic="row"> 

    <div magic="inputWrapper"> 
     <input magic="input"></input> 
     <input magic="input"></input> 
    </div> 

    <button magic="write">Write</button> 

    <button magic="delete">Delete</button> 

    <button magic="new">New</button> 

</div> 

Это легкая задача с только селекторы или я должен использовать циклы и т. д.?

+1

Вы должны префиксом своего 'magic' с данными, а затем выберите следующее:' $ («* [данные магии]») 'в JQuery, который будет выбрать все элементы с этим атрибутом. Если вы хотите переместить элементы, используйте '$ (« * [data-magic]). Detach(). AppendTo («где бы вы ни захотели добавить материал») ' – somethinghere

+1

Во-первых, добавление собственных свойств недействительно, вы должны использовать 'data- *'. Во-вторых, вы только пытаетесь переместить элементы 'button' на верхний уровень' div'? Есть ли какая-то другая логика, которую вы используете для изменения DOM? –

+0

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

ответ

0

Я не мог придумать способ сделать это с помощью селекторов. Вы можете цикл по каждому элементу, если он не имеет магический атрибут, то просто заменить его с его дочерними элементами:

$('*').each(function(){ 
    var $this = $(this); 
    if(typeof $this.attr('magic') === 'undefined'){ 
     $this.replaceWith($this.find('*')); 
    } 
}); 

Поскольку он использует все, селектор (*), было бы хорошо, чтобы обеспечить родительский элемент. Кроме того, с помощью атрибутов данных будет более смысловым:

$('#parent').find('*').each(function(){ 
    var $this = $(this); 
    if(!$this.data('magic')){ 
     $this.replaceWith($this.find('*')); 
    } 
}); 
+0

Работает, но не так сильно. – izel