Frage

. Dieser Vorgang wiederholt sich erneut, diesmal jedoch die Merkmale des ausgewählten Modells.

Dazu und da ich viele verschiedene Bereiche habe, die dasselbe System benötigen, verwende ich eine Klasse mit demselben Namen in jedem Menü auswählen und ein anderes für jedes Modell auswählen.

  <div class='brand_select' id='14'>
    <%= f.collection_select :brand, Product.find_all_by_area(14, :group => 'brand'), :brand, :brand, :prompt => 'Choose brand' %>
  </div>
  <div class='model_select'>
     <%= f.collection_select :model, Product.find_all_by_area(14), :model, :model, :prompt => 'Choose model' %> 
  </div>

  <div class='brand_select' id='15'>
    <%= f.collection_select :brand, Product.find_all_by_area(15, :group => 'brand'), :brand, :brand, :prompt => 'Choose brand' %>
  </div>
  <div class='model_select'>
     <%= f.collection_select :model, Product.find_all_by_area(15), :model, :model, :prompt => 'Choose model' %> 
  </div>

Und der Javacript:

$('.brand_select').change(function(event) {
    // option selected
    var brand=$(event.target).find('option:selected').val();

    // if none is selected
    if (brand == ''){
            $(event.target).parent().parent().find('.modelo_select').hide();
            $(event.target).parent().parent().find('.caracteristica').hide();
        }
    else {
        $(event.target).parent().parent().find('.modelo_select').show();
        // find id to search on the database
        var id=$(event.target).parent().attr('id');
        // find the target (id of the object)
        var target=$(event.target).attr('id');

        $.ajax({
            type: "POST",
            url: "http://"+location.host+"/model/"+brand+"/"+id+"/"+target,
            brand: brand,
            id: id,
            target: target
        });
    }  
});

$('.model_select').change(function(event) {
        // find model selected to search on the database
        var model=$(event.target).find('option:selected').val();
        // find brand selected to search on the database
        var brand=$(event.target).parent().parent().find('.marca_select').find('option:selected').val();
        // find id to search on the database
        var id=$(event.target).parent().parent().find('.marca_select').attr('id');
        // find the target (id of the object)
        var target=$(event.target).attr('id');

        $.ajax({
            type: "POST",
            url: "http://"+location.host+"/feature/"+brand+"/"+model+"/"+id+"/"+target,
            brand: brand,
            model: model,
            id: id,
            target: target
        });
});

Dieser Code funktioniert, wiederholt das Ereignis die gleiche Häufigkeit wie die Klassen mit diesem Namen.

Was ich tun möchte, ist, dass die Funktion jedes Mal, wenn ein Änderungsereignis für die Klasse erforderlich ist, nur einmal ausgeführt wird.

Ich weiß nicht, ob dies mit Klassenstruktur möglich ist, die ich habe oder ob ich eine ID oder eine Klasse mit unterschiedlichen Namen für jeden Bereich mit der Funktion in Verbindung bringen muss.

War es hilfreich?

Lösung 2

Für Ihre Hilfe habe ich herausgefunden, dass das Problem nichts mit JavaScript zu tun hat, sondern stattdessen auf dem Rubin auf Schienen ist.

Ich fügte hinzu application.html.erb Andere JS -Dateien und wenn Sie die haben //= require_tree auf der application.js Es fügt jede JS -Datei im Baum hinzu. Fügen Sie daher JS -Dateien auf application.html.erb Wird sie wiederholen lassen und seltsame Verhaltensweisen wie dieses verursachen.

Andere Tipps

Ich verstehe nicht, warum das Ereignis zweimal abfeuern sollte, weil alles, was Sie mit $ (Selektor) machen. Change sagt, dass jedes Mal, wenn ein Änderungsereignis etwas mit diesem Selektor feuert, damit umgehen möchte. Ich habe sogar einen kurzen Test durchgeführt, um sicher zu sein und es feuert nicht mehr als einmal aus.

Können Sie ein bisschen besser erklären, was das Symptom tatsächlich ist? Was passiert tatsächlich zweimal? Ist alles in Ihrem Event -Handler zweimal passiert?

Ich dachte, dass Ihre Selektoren für die Aktionen, die Sie mit den Eltern ausführen wurde gefeuert, das wäre nicht der beste Weg (aber andererseits weiß ich nicht, was Ihr Endzweck hier ist).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top