2015-04-28 5 views
2

У меня есть следующий вид внутри SharePoint 2013 веб-приложения: -удалить таблицу тр, которые имеют конкретное содержание

enter image description here

Мне нужно, чтобы удалить все таблицы <tr> за исключением тех, которые начинаются с "name" & "title". так может ли кто-нибудь придумать, как я могу это достичь? , здесь является часть разметки для изображению (это показывает два Tr на которые имеют типа содержимого (должно быть удалены), а другие содержат имя): -

<table id="formTbl" class="ms-formtable" width="100%" cellspacing="0" cellpadding="0" border="0" style="margin-top: 8px;"> 
<tbody> 
<tr> 
<td class="ms-formlabel" valign="top" nowrap="true"> 
<h3 class="ms-standardheader">Content Type</h3> 
</td> 
<td class="ms-formbody" valign="top"> 
</tr> 
<tr> 
<td class="ms-formlabel" width="113px" valign="top" nowrap="true"> 
<h3 class="ms-standardheader"> 
<nobr> 
Name 
<span class="ms-accentText" title="This is a required field."> *</span> 
</nobr> 
</h3> 
</td> 
<td class="ms-formbody" width="350px" valign="top"> 
</tr> 
<tr> 
<tr> 
<td class="ms-formlabel" width="113px" valign="top" nowrap="true"> 
<td class="ms-formbody" width="350px" valign="top"> 
</tr> 

Теперь я JQuery версии 1.7 загружается внутри веб-приложение, но я предпочитаю использовать чистый javaScript.

Благодаря

EDIT здесь более подробная разметка: -

<div id="contentRow"> 
<div id="sideNavBox" class="ms-dialogHidden ms-forceWrap ms-noList"> 
<div id="contentBox" aria-relevant="all" aria-live="polite"> 
<div id="notificationArea" class="ms-notif-box"></div> 
<div id="DeltaPageStatusBar"> 
<div id="customcalender"></div> 
<div id="DeltaPlaceHolderMain"> 
<a id="mainContent" tabindex="-1" name="mainContent"></a> 
<div style="padding-left:5px"> 
<table id="onetIDListForm" class="ms-core-tableNoSpace"> 
<tbody> 
<tr> 
<td> 
<div class="ms-webpart-zone ms-fullWidth"> 
<div id="MSOZoneCell_WebPartWPQ2" class="s4-wpcell-plain ms-webpartzone-cell ms-webpart-cell-vertical ms-fullWidth "> 
<div class="ms-webpart-chrome ms-webpart-chrome-vertical ms-webpart-chrome-fullWidth "> 
<div id="WebPartWPQ2" class="noindex " style="" allowdelete="false" width="100%" haspers="false" webpartid="6c7d849e-da6b-4138-be9f-b99bde542065"> 
<table class="ms-informationbar" width="100%" cellspacing="0" cellpadding="2" border="0" style="margin-bottom: 5px;"> 
<div id="listFormToolBarTop" style="display: none;"> 
<span style="display:none"> 
<span></span> 
<table width="100%"> 
<tbody> 
<tr> 
<td width="100%" valign="top"> 
<table id="formTbl" class="ms-formtable" width="100%" cellspacing="0" cellpadding="0" border="0" style="margin-top: 8px;"> 
<tbody> 
<tr> 
<td class="ms-formlabel" valign="top" nowrap="true"> 
<h3 class="ms-standardheader">Content Type</h3> 
</td> 
<td class="ms-formbody" valign="top"> 
</tr> 
<tr> 
<td class="ms-formlabel" width="113px" valign="top" nowrap="true"> 
<h3 class="ms-standardheader"> 
<nobr> 
Name 
<span class="ms-accentText" title="This is a required field."> *</span> 
</nobr> 
</h3> 
</td> 
<td class="ms-formbody" width="350px" valign="top"> 
</tr> 
<tr> 
<tr> 
<td class="ms-formlabel" width="113px" valign="top" nowrap="true"> 
<td class="ms-formbody" width="350px" valign="top"> 
</tr> 
<tr> 
<tr> 
<tr> 
+3

Во-первых, ваши фотографии невероятно трудно увидеть. Ожидайте голосов. Во-вторых, что вы пробовали? Я ничего не вижу в JavaScript. Что вы пробовали до сих пор, чтобы мы могли улучшить его? – dman2306

+4

@ dman2306 большинство всех изображений на SO маленькие, как это, щелкните правой кнопкой мыши изображение, затем выберите «открыть изображение в новой вкладке», чтобы увидеть их в полном размере;) – DelightedD0D

+0

Итак, пройдите по строкам и посмотрите текст в первой ячейке. – epascarello

ответ

2

Если вы сомневаетесь, filter ваш друг:

JSFiddle:http://jsfiddle.net/TrueBlueAussie/jjzx6mge/4/

$('#formTbl tr').filter(function() { 
    return !$(".ms-standardheader", this).text().match(/Name|Title/i); 
}).remove(); 

Результат, возвращаемый функцией, переданной фильтру, является логическим значением, указывающим, какие элементы сохранять (правдивые) или которые исключать (falsey).

Этот объект предназначен только для строк, которые имеют запрошенный текст в классифицированном элементе ms-standardheader.

Он также ориентирован только на конкретный внутренний стол, чтобы избежать глубокого поиска из таблицы верхнего уровня и уничтожения в нем целых таблиц.

Хотя вы можете сделать это с помощью простого старого JS, требуется значительно больше кода. Поскольку у вас уже установлена ​​версия jQuery, имеет смысл ее использовать.

+1

Я думаю, что вы неправильно поняли вопрос. «Мне нужно удалить всю таблицу , кроме тех, которые начинаются с« name »и« title ». » –

+1

Это лучше :) @TrueBlueAussie –

+0

@TrueBlueAussie, но это удалило всю таблицу и все ее Tr может у вас? Я думаю, что это потому, что текущая таблица i в другой таблице –

0

Это удалит все tr, который имеет .ms-standardheader элемент, который содержит текст Name или Title

$('#formTbl tr').each(function() { 
    var that = $(this); 
    var label = that.find('.ms-standardheader').text();  
    if (label.indexOf('Name') != -1 || label.indexOf('Title') != -1) { 
     that.remove(); 
    } 
}); 
+0

* или * 'title'? :) –

+0

Просто предоставление основной идеи. Он может проверять любой текст – kapantzak

+1

, он должен быть || not && – dman2306

-1

Вы можете сделать это следующим образом:

$("#formTbl tr td h3").not("h3:contains('Name'):contains('Title')").closest('tr').remove(); 
+1

Это работает только для одной строки. Ему нужно 'Name' * или *' Title' –

+0

@TrueBlueAussie Ну вы можете добавить столько селекторов ': contains()', которые вы хотите. Обновлен ответ для названия. –

+0

Извините, что делает * и * ... Ему нужно условие ИЛИ. Как я уже говорил, этот конкретный метод может * работать * только для одной строки. –

0

И вот я, делая это обычный JS путь старого доброго, так как вы просили об этом :) http://jsfiddle.net/m53esfpo/3/

Edit: Обновленных код и скрипка (спасибо @TrueBlueAussie)

Удаляет все три, кроме тех, которые начинаются с имени или названия.

var t = document.getElementById('formTbl'); 

for (var i = 0; i < t.getElementsByTagName("tr").length; i++) { 
    var s = t.getElementsByTagName("tr")[i].getElementsByClassName('ms-formlabel'); 
    if (s.length > 0) { 
     if (s[0].innerText.indexOf('Name') < 0 && s[0].innerText.indexOf('Title') < 0) { 
      t.getElementsByTagName("tr")[i].parentNode.removeChild(t.getElementsByTagName("tr")[i]); 
     } 
    } 
} 
+0

К сожалению, этот код будет соответствовать тексту в любом месте, в любом элементе, в строке. Вам нужно ориентироваться немного более агрессивно. –

+0

@TrueBlueAussie Да, но именно поэтому я использую .indexOf вместо == –

+0

Извините, ваш indexOf будет соответствовать этому тексту в любом месте любого элемента в строке –

1

Это будет работать:

$(function() { 
 

 
    $('#formTbl tr').each(function() { 
 
    var frstVal = $(this).find('td').eq(0).text(); 
 
    if (!frstVal.match(/name|title/i)) { 
 
     $(this).remove() 
 
    } 
 
    }); 
 

 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js"></script> 
 
<table id="formTbl" class="ms-formtable" width="100%" cellspacing="0" cellpadding="0" border="0" style="margin-top: 8px;"> 
 
    <tbody> 
 
     <tr> 
 
      <td class="ms-formlabel" valign="top" nowrap="true"> 
 
       <h3 class="ms-standardheader">Content Type</h3> 
 
      </td> 
 
      <td class="ms-formbody" valign="top"> 
 
     </tr> 
 
     <tr> 
 
      <td class="ms-formlabel" width="113px" valign="top" nowrap="true"> 
 

 
       <h3 class="ms-standardheader"> 
 
<nobr> 
 
Title 
 
<span class="ms-accentText" title="This is a required field."> *</span> 
 
</nobr> 
 
</h3> 
 

 
      </td> 
 
      <td class="ms-formbody" width="350px" valign="top"> 
 
     </tr> 
 
     <tr> 
 
      <td class="ms-formlabel" width="113px" valign="top" nowrap="true"> 
 
       <h3 class="ms-standardheader"> 
 
<nobr> 
 
Name 
 
<span class="ms-accentText" title="This is a required field."> *</span> 
 
</nobr> 
 
</h3> 
 
      </td> 
 
      <td class="ms-formbody" width="350px" valign="top"> 
 
     </tr> 
 
     <tr> 
 
      <tr> 
 
       <td class="ms-formlabel" width="113px" valign="top" nowrap="true"> 
 
        <td class="ms-formbody" width="350px" valign="top"> 
 
      </tr>

+0

Я написал следующее в конце моей веб-страницы: - , но не имеет никакого эффекта. –

+0

@johnG Возможно, вы захотите попробовать мой простой JS (без jQuery) soloution –

+0

@StefanWittwer Почему это? – DelightedD0D

Смежные вопросы