Ошибка Javascript в IE с использованием библиотеки прототипов в Rails

Я запускаю приложение Rails и использую прототип. Скрипт не работает в IE, но работает во всех других браузерах. Я признателен за любую помощь в поиске решения этой проблемы.

Вот проблема:
Мои пользователи продают товары и их разновидности. Доступные разновидности зависят от продукта. Например, если мы говорим о фруктах, пользователь может выбрать продукт «Яблоко», тогда мне нужно показать ему разновидности яблок на выбор, а не все разновидности на всем сайте.

Я использую javascript, чтобы ограничить выбор в раскрывающемся списке для разновидностей, чтобы они зависели от продукта, впервые выбранного в раскрывающемся списке. Таким образом, если пользователь выбирает продукт «яблоко», то список разновидностей динамически ограничивается только разновидностями яблок. Это отлично работает во всех браузерах, кроме, конечно, IE.

В IE, когда я выбираю продукт из раскрывающегося списка, сценарий завершается с ошибкой и появляется сообщение об ошибке «Объект не поддерживает это свойство или метод».

Я считаю, что проблема и решение объяснены на следующей странице, если вы прокрутите вниз до самого низа - раздела, помеченного «Нативные расширения»: http://prototypejs.org/learn/extensions

К сожалению, я пока не очень хорошо разбираюсь в javascript, и я не знаю точно, как исправить проблему на практике, основываясь на объяснении со страницы прототипа.

Вот рассматриваемый файл javascript:

var varieties = new Array();
<% for variety in @varieties -%>
  varieties.push (new Array (<%=h variety.product_id %>, "<%=h variety.name %>", <%=h variety.id %>));
<% end -%>


function collectionSelected(e) {
  product_id = e.getValue();
  options = e.next(1).options;
  options.length = 1;
  varieties.each(function(variety) {
    if (variety[0] == product_id) {
      options[options.length] = new Option(variety[1], variety[2]);
    }
  });
}

Любое руководство очень ценится.

Обновлять

Это HTML ...

users / edit.html.erb

<% javascript 'dynamic_varieties' %>
  <h2>Edit Your Profile</h2>
    <%= render :partial => 'form' %>  

users / _form.html.erb

<% form_for @user do |f| %>     
  <!-- This dynamically adds a new pair of dropdowns, i.e. product & variety -->
  <p class="addProduct"><%= add_season_link "+ Add another product" %></p> 

  <!-- This is where the product & variety dropdowns are rendered -->
  <div id="seasons">
<%= render :partial => 'season', :collection => @user.seasons %>
  </div>
<% end %>

users / _season.html.erb

  <div class="season">
<% new_or_existing = season.new_record? ? 'new' : 'existing' %>
<% prefix = "user[#{new_or_existing}_season_attributes][]" %>

<% fields_for prefix, season do |season_form| -%>
  <%= error_messages_for :season, :object => season %>
      <div class="eachMarketDrop">
          <p class="marketDrop">
            <!-- This is the product dropdown that triggers the dependent variety dropdown -->
            <label for = "user_product_id">Product:</label> <%= season_form.collection_select :product_id, Product.find(:all, :order =>'name'), :id, :name, {:prompt => "Select Product"}, {:onchange => "collectionSelected(this);"} %>
            <label for="user_variety_id">Variety:</label>
            <!-- This is the variety dropdown that is dependent on the product dropdown -->
            <% varieties = season.product ? season.product.varieties : Variety.all %>
            <%= season_form.select :variety_id, options_from_collection_for_select(varieties, :id, :name, season.variety_id), :prompt => "This is optional" %>
          </p>
      </div>
<% end -%>

Обновление # 2

I installed firebug lite and confirmed that the line throwing the error in IE is:

options = e.next(1).options;

Следующие варианты также вызывают ту же ошибку:
options = $ (e) .next (1) .options
options = e.next ('select'). Options;

Любые идеи?


person MikeH    schedule 02.02.2010    source источник


Ответы (2)


У меня такое чувство, что e.next(1) вызовет проблемы.

Вероятно, лучше четко указать, что вы хотите, поскольку разные браузеры имеют разные представления о том, что будет «следующим» в DOM в любой момент времени.

Попробовать e.next('select') возможно?

На этот вопрос было бы легче ответить с помощью HTML.

person Triptych    schedule 02.02.2010
comment
Добавлен соответствующий html по вашему запросу. - person MikeH; 02.02.2010

Pullmonkey (http://www.pullmonkey.com/) на форуме Rails выяснил это. Теперь он отлично работает во всех браузерах.

Решение было изменить

{:onchange => "collectionSelected(this);"}   

to

{:onchange => "collectionSelected($(this));"} %>  

Друг объяснил это так:
«это» - забавное слово в JS - оно может означать множество вещей. В исходном коде вашему методу collectionSelected передавалось само событие. С помощью $ (this) методу collectionSelected передается элемент, запускающий событие. Итак, в этом случае e.next () имеет смысл, b / c «e» - это подсказка продукта. В предыдущем случае, когда событием было "e", e.next () ничего не значит!

person MikeH    schedule 04.02.2010