JQuery нагрузки после .... любая идея, как это сделать - PullRequest
0 голосов
/ 20 апреля 2011

мой jquery

$(document).ready(function(){
    $('.categories').live('change', function() {
        var my_location = window.location.pathname.replace('admin/', '');
        $(this).parents("tr").next("tr.subcategories").load(my_location + '?route=module/cart/ajax_sub&category_id=' + $(this).val());  
    });

    $('.subcategories_select').live('change', function() {
        var my_location = window.location.pathname.replace('admin/', '');
        $(this).parents("tr").next("tr.products").load(my_location + '?route=module/cart/ajax_products&category_id=' + $(this).val());  
    });
});

мой HTML

<tr><td>Categories</td>
<td><select class="categories" name="category_id">
    <option value="0" selected="selected">Select a Category</option>
    <?php foreach ($categories as $category) { ?>
    <option value="<?php echo $category['category_id']; ?>"><?php echo $category['name']; ?></option>
    <?php } ?>
  </select></td>
</tr>
<tr class="subcategories"></tr>
<tr class="products"></tr>

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

<tr class="subcategories"></tr>
<tr class="products">stuff from ajax</tr>
<tr class="business_products">stuff from ajax</tr>
<tr class="premium_products">stuff from ajax</tr>

вот мой php

public function ajax_products(){
    $this->load->model('catalog/product');
    $products = $this->model_catalog_product->getProductsByCategoryId($_GET['category_id']);
    $class = 'odd';
    $data = '<td><div class="scrollbox smallscroll">';
    foreach ($products as $product) {
        $class = ($class == 'even' ? 'odd' : 'even');
        $data .=  '<div class="' .  $class . '">';
        $data .= '<input type="checkbox" name="standard[]" value="' . $product['product_id'] . '" />';
        $data .=  $product['name'];
        $data .= '</div>';
    }
    $data .=     '</div></td></tr>';
    $data .=  '<tr class="business_products">';
    $class = 'odd';
    $data .= "<td>Business</td>";
    $data .= '<td><div class="scrollbox smallscroll">';
    foreach ($products as $product) {
        $class = ($class == 'even' ? 'odd' : 'even');
        $data .=  '<div class="' .  $class . '">';
        $data .= '<input type="checkbox" name="business[]" value="' . $product['product_id'] . '" />';
        $data .=  $product['name'];
        $data .= '</div>';
    }
    $data .=     '</div></td></tr>';
    $data .=  '<tr class="premium_products">';
    $class = 'odd';
    $data .= "<td>Premium</td>";
    $data .= '<td><div class="scrollbox smallscroll">';
    foreach ($products as $product) {
        $class = ($class == 'even' ? 'odd' : 'even');
        $data .=  '<div class="' .  $class . '">';
        $data .= '<input type="checkbox" name="premium[]" value="' . $product['product_id'] . '" />';
        $data .=  $product['name'];
        $data .= '</div>';
    }
    $data .=     '</div></td>';
    print $data;
}

Проблема в том, что он не добавляет еще два trs ... все данные делают в одном tr ... в конечном итоге мне нужно загрузить после того, как все данные поступают из вызова ajax после .subcategories

Ответы [ 2 ]

1 голос
/ 20 апреля 2011

У меня есть подозрение, что это связано с неверным HTML, который вы передаете из PHP.Я имею в виду, что да, это действительный HTML, но, поскольку вы «обманываете» его, помещая теги </tr>, чтобы закрыть уже существующий тег <tr>, фрагмент, который вы получаете из своего PHP, выглядит как недопустимый.В .load () документах говорится следующее:

jQuery использует свойство браузера .innerHTML для анализа полученного документа и вставки его в текущий документ.Во время этого процесса браузеры часто фильтруют элементы из документа, такие как, или элементы.В результате элементы, извлекаемые с помощью .load (), могут не совпадать, как если бы документ был извлечен непосредственно браузером.

Возможно, он также игнорирует элементы, которые были повреждены (т.е.нет закрывающих / открывающих тегов).Попробуйте просмотреть DOM после загрузки содержимого, чтобы увидеть, какова структура HTML.

Моя рекомендация, независимо от этой проблемы, состоит в том, чтобы скорее передавать данные через объект JSON, а затем отформатировать HTML-код с помощью JavaScript,Это сократит объем данных, отправляемых с сервера, и означает, что вы будете загружать структуру HTML только один раз.Если хотите, я могу создать для вас пример.

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

Вот так:

HTML

<tr><td>Categories</td>
<td><select class="categories" name="category_id">
    <option value="0" selected="selected">Select a Category</option>
    <?php foreach ($categories as $category) { ?>
    <option value="<?php echo $category['category_id']; ?>"><?php echo $category['name']; ?></option>
    <?php } ?>
  </select></td>
</tr>
<tr class="subcategories"></tr>
<tr class="products"></tr>
<tr class="business_products"></tr>
<tr class="premium_products"></tr>

PHP

public function ajax_products(){
    $this->load->model('catalog/product');
    $products = $this->model_catalog_product->getProductsByCategoryId($_GET['category_id']);
    //Since all your products are just duplicated for each input, we
    // really only need 1 array
    $products = array();
    foreach ($products as $product) {
        //Add the product info to the array
        $data[] = array("id" => $product['product_id'], "name" => $product['name']);
    }
    //This outputs the data in the JSON format
    echo json_encode($data);
    //A LOT shorter right? :)
}

JavaScript

$(document).ready(function(){
    $('.categories').live('change', function() {
        var my_location = window.location.pathname.replace('admin/', '');
        $(this).parents("tr").next("tr.subcategories").load(my_location + '?route=module/cart/ajax_sub&category_id=' + $(this).val());  
    });

    $('.subcategories_select').live('change', function() {
        var my_location = window.location.pathname.replace('admin/', '');
        var $this = $(this); //Let's cache this
        $.ajax("url":my_location,
               "data": { "route":"module/cart/ajax_products","category_id":$this.val() }
               "success": function(data) {
                    if (data.length > 0) { //Ensure we have items
                        var $prnttr = $this.closest("tr"); //Note I used .closest() because .parents() returns ALL parent TRs
                        //Get the next rows and empties them in case they have data
                        //Note: We remove them from the DOM to speed up adding to it (it's slow working directly with the DOM)
                        var $prodrow = $prnttr.next("tr.products").empty().remove();
                        var $busrow  = $prnttr.next("tr.business_products").empty().remove();
                        var $premrow = $prnttr.next("tr.premium_products").empty().remove();
                        var cls = "odd";
                        for (int i = 0, len = data.length; i < len; i++) {
                            cls = (cls == "even" ? "odd" : "even");
                            $prodrow.append( //Append the div to production row
                                $("<div>", {"class":cls}) //Create the div dynamically and add the HTML. NOTE: The HTML HAS to be valid.
                                    .html("<input type=\"checkbox\" name=\"standard[]\" value=\"" + data[i].id + "\" /> " + data[i].name)
                            );
                            $busrow.append( //Append the div to business row
                                $("<div>", {"class":cls}) //Create the div dynamically and add the HTML. NOTE: The HTML HAS to be valid.
                                    .html("<input type=\"checkbox\" name=\"business[]\" value=\"" + data[i].id + "\" /> " + data[i].name)
                            );
                            $premrow.append( //Append the div to premium row
                                $("<div>", {"class":cls}) //Create the div dynamically and add the HTML. NOTE: The HTML HAS to be valid.
                                    .html("<input type=\"checkbox\" name=\"premium[]\" value=\"" + data[i].id + "\" /> " + data[i].name)
                            );
                        }
                        //All html has been created, add the elements back into the domain
                        $prnttr.after($prodrow, [$busrow,$premrow]); //Adds all three new elements after the parent row
                    } else {
                        //Do warning/info stuff here
                    }
               }
        });
        //$(this).parents("tr").next("tr.products").load(my_location + '?route=&category_id=' + );  
    });
});
0 голосов
/ 20 апреля 2011

Я думаю, что проблема:

$(this).parents("tr").next("tr.products")

Это выбирает следующего брата после tr.products, но существует ли брат после tr.products? Он не отображается в вашем html.

Если вы хотите вставить новые строки после текущей, возможно, вам нужно что-то вроде .after()

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