Валидный JQuery на разработке не работает на производстве - PullRequest
2 голосов
/ 06 октября 2008

Я пишу довольно простой скрипт с использованием jQuery. Однако сценарий ведет себя по-разному в зависимости от того, выполняю ли я его на своем локальном веб-сервере (localhost) или на производственном сервере.

При разработке следующий код возвращает ожидаемый HTML-код:

$('#objID').siblings('.mAddress').html();

На производстве тот же оператор возвращает undefined.

Структуры документов одинаковы на обеих машинах. Единственное отличие, которое я могу найти, это когда я использую Firebug, чтобы пройти через скрипт. На машине для разработки наложение часов на $ ('# objID'). Siblings ('. MAddress') приводит к [ span#object ], в то время как на производстве те же часы приводят к [ [ span#object ] ]
(Обратите внимание на двойные квадратные скобки).

Есть идеи?

Добавлено:

Я подтвердил, что две библиотеки идентичны.

Я провел еще несколько экспериментов с использованием Firebug. Другая часть скрипта захватывает набор элементов, используя инструкцию:

$('.ParentColumn2').each(function(i) { ... })

В теле этой функции, если я установлю часы на this, при разработке значение this будет тем, что я ожидаю: div.ParentColumn2, но при производстве значение this возвращает то, что выглядит массив: [ div.ParentColumn2, div.ParentColumn2, div.ParentColumn2, .....]

HTML - это в основном таблица (я удалил нерелевантный HTML, и строки повторяются):

<table>  
 <tr>  
  <td>  
    <div class="ItemTemplate">  
      <div class="ParentColumn2">  
        <div><span id="dnn_ctr45874_ViewProjectGrid_GridView1_ctl02_lbl_Address" class="lbl_Address mAddress">111 W Wacker Dr, </span><span id="dnn_ctr45874_ViewProjectGrid_GridView1_ctl02_lbl_City" class="lbl_Address mCity">Chicago</span>&nbsp;<span id="dnn_ctr45874_ViewProjectGrid_GridView1_ctl02_lbl_PostalCode" class="lbl_Address mPostalCode">60601</span>&nbsp;<a href="javascript:MapMe(this);" id="dnn_ctr45874_ViewProjectGrid_GridView1_ctl02_hypMap" class="hypMap">Map</a>&nbsp;&nbsp;<span id="dnn_ctr45874_ViewProjectGrid_GridView1_ctl02_lbl_Area" class="mArea">Loop</span><span id="dnn_ctr45874_ViewProjectGrid_GridView1_ctl02_lt" class="mLt">41.8868010285473</span><span id="dnn_ctr45874_ViewProjectGrid_GridView1_ctl02_lg" class="mLg">-87.6312860701286</span>  
        </div>  
      </div>  
    </div>  
  </td>  
 </tr>  
 <tr>  
  <td>  
    <div class="ItemTemplate">  
      <div class="ParentColumn2">  
        <div><span id="dnn_ctr45874_ViewProjectGrid_GridView1_ctl03_lbl_Address" class="lbl_Address mAddress">...</span> ...  
        </div>  
      </div>  
    </div>  
  </td>  
 </tr>  
</table>

HTML-код одинаков для двух машин настолько, насколько это возможно, учитывая, что он полностью сгенерирован .Net (не заставляйте меня начинать).

Ответы [ 6 ]

1 голос
/ 09 октября 2008

Является ли ваш код внутри $ (document) .ready (function () {...});

Если нет, это может привести к другому поведению. Возможно, на вашей локальной машине разработки все загружается так быстро, что дерево DOM завершается по типу, который называется вашим Javascript, но на рабочем сервере, возможно, все еще не завершено.

Не объясняет дополнительные вложенные скобки, отображаемые в FireBug.

1 голос
/ 07 октября 2008

я не использую .siblings () ... (или не нужно) ...

в соответствии с документами jquery .... запуск .siblings () в div (ниже) ничего бы не вернул, но для одного из p $ ('p: first') вернул бы другой

<div><p></p><p></p></div>

попробуйте использовать

$('#objID').find('.mAddress').html();

или

$('#objID').children('.mAddress').html();

или

$('#objID .mAddress').html();

кажется странным, что он будет работать с dev, но не на производстве ... но попробуйте.

1017 * Брюс *

1 голос
/ 07 октября 2008

Учитывая, что у вас другое поведение, разумно предположить, что что-то отличается на двух страницах, поэтому я предлагаю уменьшить обе страницы до минимума, который сохраняет текущее поведение, а затем посмотреть отличается.

0 голосов
/ 09 октября 2008

Поместите те же данные в dev, что и в prod, затем выведите исходное представление для обоих и сделайте diff.

Зачем использовать свойство братьев и сестер, а не только:

$('#objID .mAddress').html();

Кроме того, я думаю, что и братья и сестры, и приведенное выше возвращают массив элементов, а не только один элемент, так что я бы, вероятно, использовал что-то вроде этого:

$($('#objID .mAddress').get(0)).html();

Чтобы вернуть HTML только для первого элемента.

0 голосов
/ 09 октября 2008

Я бы сказал, что нужно обратить внимание на несколько областей: в вашей среде разработки все, вероятно, перезагружается при каждом запросе, попробуйте добавить «? Asdfasfrandom» в конце вашего тега включения javascript, чтобы убедиться, что все получится. обновлен.

Если это не так, объединяются ли ваши файлы javascript, когда вы их обслуживаете? Например, в Rails поведение по умолчанию состоит в том, чтобы выбросить их все в один файл, который может что-то путать.

Если это не так, то может случиться так, что файлы javascript на сервере загружаются в другом порядке или выполняются в другом порядке, нежели локально, из-за времени загрузки. Перед выполнением кода убедитесь, что DOM готов.

Похоже, что это, вероятно, не проблема с вашим кодом (если вы используете тот же браузер и тот же HTML), но проблема с порядком, в котором происходят вещи.

0 голосов
/ 06 октября 2008

Я не регулярно использую jQuery, но мое первое подозрение в том, что ваши библиотеки не синхронизированы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...