Переход на jQuery 1.5 ломает селектор

только что обновился до jQuery 1.5, и теперь кажется, что у find() есть проблемы с несколькими селкторами:

var $AlertColumn = $('[name=TABLE_1] tr').find('.SAPBEXstdData:eq(9), .SAPBEXstdDataOdd:eq(9), td.SAPBEXaggData:eq(9)');

начиная с версии 1.5 (и IE7), эта вещь зависает в IE7 с всплывающим окном с ошибкой через некоторое время, что скрипт работает вечно.

Он отлично работает в 1.4.2.

хорошо, вот код (к первой строке данных), мне нужно работать с Alert-Row, который является 9-м, имеющим эти классы, используемые в find():

    <TABLE class=SAPBEXCellspacing cellSpacing=1 cellPadding=0 width=1250 border=0 name="TABLE_1" sizcache="5" sizset="20"><TBODY sizcache="5" sizset="20">
<TR sizcache="5" sizset="21">
<TD noWrap colSpan=19 sizcache="5" sizset="21">
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0 sizcache="5" sizset="21">
<FORM name=SAPBWUForm5 action=/sap/bw/BEx?SAP-LANGUAGE=DE&amp;ITEM=TABLE_1&amp;STATE_ID=4KXJZOX5URFHG6BQFFTKAJ0OH&amp;STATELESS=X&amp;LAST_MESSAGE_ID=0 method=post sizcache="5" sizset="21">
<TBODY sizcache="5" sizset="21">
<TR sizcache="5" sizset="22">
<TD class=SAPBEXScrollVert noWrap sizcache="5" sizset="22">
<TABLE cellSpacing=0 cellPadding=1 border=0 sizcache="5" sizset="22">
<TBODY sizcache="5" sizset="22">
<TR>
<TD class=SAPBEXTxtStd noWrap><IMG title="Erste Zeile" alt="Erste Zeile" src="/sap/bw/Mime/BEx/Icons/page_first_row_inact.gif" border=0></TD>
<TD class=SAPBEXTxtStd noWrap><IMG title="Vorherige Zeilen" alt="Vorherige Zeilen" src="/sap/bw/Mime/BEx/Icons/page_up_inact.gif" border=0></TD>
<TD class=SAPBEXTxtStd noWrap>&nbsp;<LABEL>Zeile</LABEL></TD>
<TD noWrap><INPUT class=SAPBEXTxtFldright id=DATA_ROW_FROM title="Zeile - Maximale Anzahl: 170" onchange=document.SAPBWUForm5.submit() size=3 value=1 name=DATA_ROW_FROM></TD>
<TD class=SAPBEXTxtStd noWrap>/&nbsp;170&nbsp;</TD>
<TD class=SAPBEXTxtStd noWrap><A title="Nächste Zeilen" href="JavaScript:SAPBW(5,'','','68')"><IMG title="Nächste Zeilen" alt="Nächste Zeilen" src="/sap/bw/Mime/BEx/Icons/page_down.gif" border=0></A></TD>
<TD class=SAPBEXTxtStd noWrap><A title="Letzte Zeile" href="JavaScript:SAPBW(5,'','','170')"><IMG title="Letzte Zeile" alt="Letzte Zeile" src="/sap/bw/Mime/BEx/Icons/page_last_row.gif" border=0></A></TD></TR></TBODY></TABLE></TD></FORM></TR></TBODY></TABLE></TD></TR>
<TR></TR>
<TR>
<TD class=SAPBEXchaText noWrap>Profit Center</TD>
<TD class=SAPBEXchaText noWrap>Projektleiter</TD>
<TD class=SAPBEXchaText noWrap colSpan=2>Projekt</TD>
<TD class=SAPBEXchaText noWrap>akt. Status</TD>
<TD class=SAPBEXchaText noWrap>akt. Status Dat.</TD>
<TD class=SAPBEXchaText noWrap>Kredit Datum</TD>
<TD class=SAPBEXchaText noWrap>letzte Buchung</TD>
<TD class=SAPBEXstdItem noWrap>Kredit</TD>
<TD class=SAPBEXstdItem noWrap>Ist Q1 2010</TD>
<TD class=SAPBEXstdItem noWrap>Ist Q2 2010</TD>
<TD class=SAPBEXstdItem noWrap>Ist Q3 2010</TD>
<TD class=SAPBEXstdItem noWrap>Ist Q4 2010</TD>
<TD class=SAPBEXstdItem noWrap>Kredit %</TD>
<TD class=SAPBEXstdItem noWrap>FC Q3</TD>
<TD class=SAPBEXstdItem noWrap>FC Q4</TD>
<TD class=SAPBEXstdItem noWrap>Projektende</TD>
<TD class=SAPBEXstdItem noWrap>Alert</TD>
<TD class=SAPBEXstdItem noWrap>Notizen</TD></TR>
<TR>
<TD class=SAPBEXstdItem noWrap rowSpan=7>PC100</TD>
<TD class=SAPBEXstdItem noWrap rowSpan=3>Ammann Conrad</TD>
<TD class=SAPBEXstdItem noWrap>G000034</TD>
<TD class=SAPBEXstdItem noWrap>Techn. Zusammenarbeit China</TD>
<TD class=SAPBEXstdItem noWrap>k.a.</TD>
<TD class=SAPBEXstdItem noWrap>#</TD>
<TD class=SAPBEXstdItem noWrap>#</TD>
<TD class=SAPBEXstdItem noWrap>#</TD>
<TD class=SAPBEXstdData title=0 noWrap>0</TD>
<TD class=SAPBEXstdData noWrap>&nbsp;</TD>
<TD class=SAPBEXstdData noWrap>&nbsp;</TD>
<TD class=SAPBEXstdData noWrap>&nbsp;</TD>
<TD class=SAPBEXstdData title=0 noWrap>0</TD>
<TD class=SAPBEXstdData noWrap>&nbsp;</TD>
<TD class=SAPBEXstdData noWrap>&nbsp;</TD>
<TD class=SAPBEXstdData noWrap>&nbsp;</TD>
<TD class=SAPBEXstdData noWrap>&nbsp;</TD>
<TD class=SAPBEXstdData noWrap>I NEED THIS ONE (9th) of every Data Row</TD>
<TD class=SAPBEXstdData title=0 noWrap>
<DIV class=notiz style="TEXT-ALIGN: left"></DIV></TD></TR>
<TR>
<TD class=SAPBEXstdItem noWrap>G000164</TD>
<TD class=SAPBEXstdItem noWrap>Tag der offenen Tür</TD>...

........


person Gerald    schedule 22.02.2011    source источник
comment
Это не отвечает на ваш вопрос, но можно ли использовать идентификатор или хотя бы класс на столе? Ваш селектор не очень эффективен.   -  person ScottE    schedule 22.02.2011
comment
не могу повлиять на код, так как он генерируется sap ;-(   -  person Gerald    schedule 22.02.2011
comment
каждый раз, когда мне приходится работать с разметкой, созданной SAP, я заболеваю и хочу убить себя ... Я должен был узнать что-то полезное, например, садовник или что-то в этом роде ;-) Я вернусь к 1.4.2 и подожду, пока это не будет исправлено через 1.5... спасибо за помощь :-) — Джеральд   -  person Gerald    schedule 23.02.2011


Ответы (3)


Попробуйте поместить ввод перед вашим селектором (например, input[name=TABLE_1] tr), потому что может случиться так, что jQuery просматривает каждый элемент, включая интервалы, div, h1 и т. д.

person Val    schedule 22.02.2011
comment
ну, таблица, которая когда-либо является родителем tr :), и вы должны использовать класс или идентификатор, как упоминал @scotte - person Val; 22.02.2011

$('[name=TABLE_1] tr') кажется недействительным, поскольку TABLE или TBODY не имеют атрибута NAME (поправьте меня, если я ошибаюсь).

person Capsule    schedule 22.02.2011
comment
как я уже сказал, это прекрасно работает с 1.4.2... код генерируется SAP, а SAP создает беспорядочный код. - person Gerald; 22.02.2011
comment
Тогда, как указывалось ранее, не обновляйте jQuery. Механизм селектора изменился, поэтому ваш неверный селектор больше не распознается. - person Capsule; 23.02.2011

Два разных решения:

  • Если он исправен, не чините его: оставайтесь с jQuery 1.4.2. или...
  • Перепишите селектор так, чтобы он выбирал более эффективно. Начните с $('table[name=TABLE_1] tr') и используйте более конкретный селектор в .find() — возможно, используйте .children() вместо .find()? Нужно будет увидеть фактическую разметку для более конкретных предложений.

Изменить Ваша разметка ужасно недействительна. form не является допустимым дочерним элементом table, name не является допустимым атрибутом table (как указано @Capsule), вы неправильно используете nowrap... Я рекомендую вам ознакомиться с W3C Validator и оттуда.

person Matt Ball    schedule 22.02.2011
comment
TR внутри ВХОД?!?? HTML-код, стоящий за этим, либо катастрофичен, либо неверен, я не думаю, что в TABLE есть атрибут NAME. - person Capsule; 22.02.2011
comment
@Capsule: ты прав, с моей стороны полная опечатка. Браузеры очень снисходительно относятся к разрешению атрибутов, не являющихся спецификациями, для элементов. - person Matt Ball; 22.02.2011
comment
@Matt Ball, да, но, что удивительно, IE иногда может быть очень строгим и ломать JS с помощью нечистого HTML! - person Capsule; 22.02.2011
comment
@user: вставьте его в свой вопрос. Если вы не можете понять, как показать код в своем вопросе, прочитайте это. - person Matt Ball; 22.02.2011
comment
перешлю это в SAP ;-) Я знаю, что каждый раз, когда мне приходится работать с разметкой, созданной SAP, я заболеваю и хочу убить себя... Я должен был узнать что-то полезное, например, садовник или что-то в этом роде ;-) Думаю, я заполните, вернитесь к 1.4.2 и подождите, пока это не будет исправлено в 1.5... спасибо за вашу помощь :-) - person Gerald; 22.02.2011
comment
Неверные селекторы вряд ли будут исправлены в будущих версиях jQuery, НО, если повезет, я слышал, что скоро выйдет версия 1.5.1, которая исправит многие вещи... - person Capsule; 23.02.2011
comment
@Capsule: что вы подразумеваете под недопустимыми селекторами? Вы имеете в виду такие вещи, как $('table[name=foo]')? Я чертовски уверен, что jQuery вообще не заботится о допустимой и недопустимой разметке. - person Matt Ball; 23.02.2011
comment
На самом деле это потому, что он запрашивает DOM и то, как браузер его обрабатывает. - person Capsule; 23.02.2011
comment
@Capsule: у меня это отлично работает в Chrome 9: jsfiddle.net/mattball/A46mB - person Matt Ball; 23.02.2011
comment
@Capsule: как я и подозревал, jQuery действительно не заботится о семантике разметки (в моем тестовом примере - name не является допустимым атрибутом для table элементов) в отношении селекторов. См. этот почтовый индекс из Браузершоты, созданные из этой скрипке. - person Matt Ball; 23.02.2011
comment
@Matt Ball интересно, и копирование/вставка кода этого примера также работает, что озадачивает, но это не эмулирует DOCTYPE (если он есть ;-)) используемый @Gerald. Я подозреваю (и я это испытал) другое поведение JS/DOM с разными типами документов. - person Capsule; 23.02.2011